Rust加密货币数据爬虫库crypto-crawler的使用:高效获取实时市场行情与交易数据

Rust加密货币数据爬虫库crypto-crawler的使用:高效获取实时市场行情与交易数据

crypto-crawler是一个可靠的加密货币爬虫库,提供了多种获取加密货币市场数据的功能。

爬取实时交易数据

use crypto_crawler::{crawl_trade, MarketType};

#[tokio::main(flavor = "multi_thread")]
async fn main() {
    let (tx, rx) = std::sync::mpsc::channel();
    tokio::task::spawn(async move {
        for msg in rx {
            println!("{}", msg);
        }
    });

    // 爬取binance inverse_swap市场所有symbol的实时交易数据
    crawl_t trade("binance", MarketType::InverseSwap, None, tx).await;
}

爬取实时level2订单簿增量更新

use crypto_crawler::{crawl_l2_event, MarketType};

#[tokio::main(flavor = "multi_thread")]
async fn main() {
    let (tx, rx) = std::sync::mpsc::channel();
    tokio::task::spawn(async move {
        for msg in rx {
            println!("{}", msg);
        }
    });

    // 爬取binance inverse_swap市场所有symbol的实时level2增量更新
    crawl_l2_event("binance", MarketType::InverseSwap, None, tx).await;
}

从RESTful API爬取level2订单簿完整快照

use crypto_crawler::{crawl_l2_snapshot, MarketType};

fn main() {
    let (tx, rx) = std::sync::mpsc::channel();
    std::thread::spawn(move || {
        for msg in rx {
            println!("{}", msg);
        }
    });

    // 爬取binance inverse_swap市场所有symbol的level2完整快照
    crawl_l2_snapshot("binance", MarketType::InverseSwap, None, tx);
}

爬取实时level2订单簿top-K快照

use crypto_crawler::{crawl_l2_topk, MarketType};

#[tokio::main(flavor = "multi_thread")]
async fn main() {
    let (tx, rx) = std::sync::mpsc::channel();
    tokio::task::spawn(async move {
        for msg in rx {
            println!("{}", msg);
        }
    });

    // 爬取binance inverse_swap市场所有symbol的实时level2 top-K快照
    crawl_l2_topk("binance", MarketType::InverseSwap, None, tx).await;
}

爬取实时level3订单簿增量更新

use crypto_crawler::{crawl_l3_event, MarketType};

#[tokio::main(flavor极="multi_thread")]
async fn main() {
    let (tx, rx) = std::sync::mpsc::channel();
    tokio::task::spawn(async move {
        for msg in rx {
            println!("{}", msg);
        }
    });

    // 爬取CoinbasePro现货市场所有symbol的实时level3更新
    crawl_l3_event("coinbase_pro", MarketType::Spot, None, tx).await;
}

从RESTful API爬取level3订单簿完整快照

use crypto_crawler::{crawl_l3_snapshot, MarketType};

fn main() {
    let (tx, rx) = std::sync::mpsc::channel();
    std::thread::spawn(move || {
        for msg in rx {
            println!("{}", msg);
        }
    });

    // 爬取CoinbasePro现货市场所有symbol的level3订单簿完整快照
    crawl_l3_snapshot("coinbase_pro", MarketType::Spot, None, tx);
}

爬取实时BBO数据

use crypto_crawler::{crawl_bbo, MarketType};

#[tokio::main(flavor = "multi_thread")]
async fn main() {
    let (tx, rx) = std::sync::mpsc::channel();
    tokio::task::spawn(async move {
        for msg in rx {
            println!("{}", msg);
        }
    });

    // 爬取binance COIN-margined永续市场所有symbol的实时最优买卖价消息
    crawl_bbo("binance", MarketType::InverseSwap, None, tx).await;
}

爬取24小时滚动窗口行情

use crypto_crawler::{crawl_ticker, MarketType};

#[tokio::main(flavor = "multi_thread")]
async fn main() {
    let (tx, rx) = std::sync::mpsc::channel();
    tokio::task::spawn(async move {
        for msg in rx {
            println!("{}", msg);
        }
    });

    // 爬取binance COIN-margined永续市场所有symbol的24小时滚动窗口行情
    crawl_ticker("binance", MarketType::InverseSwap, None, tx).await;
}

爬取K线数据(即OHLCV)

use crypto_crawler::{crawl_candlestick, MarketType};

#[tokio::main(flavor = "multi_thread")]
async fn main() {
    let (tx, rx) = std::sync·mpsc::channel();
    tokio::task::spawn(async move {
        for msg in rx {
            println!("{}", msg);
        }
    });

    // 爬取binance COIN-margined永续市场所有symbol的1分钟到3分钟K线数据
    crawl_candlestick("binance", MarketType::InverseSwap, None, tx).await;
}

爬取资金费率

use crypto_crawler::{crawl_funding_rate, MarketType};

#[tokio::main(flavor = "multi_thread")]
async fn main() {
    let (tx, rx) = std::sync::mpsc::channel();
    tokio·task·spawn(async move {
        for msg in rx {
            println!("{}", msg);
        }
    });

    // 爬取binance COIN-margined永续市场所有symbol的资金费率
    crawl_funding_rate("binance", MarketType::InverseSwap, None, tx).await;
}

完整示例

以下是一个更完整的示例,展示如何使用crypto-crawler获取Binance交易所的实时交易数据并进行处理:

use crypto_crawler::{crawl_trade, MarketType};
use tokio::sync::mpsc;
use serde_json::Value;
use std::collections::HashMap;

#[tokio::main(flavor = "multi_thread")]
async fn main() {
    // 创建通道用于接收数据
    let (tx, mut rx) = mpsc::unbounded_channel();
    
    // 启动数据处理任务
    tokio::spawn(async move {
        let mut trade_counts = HashMap::new();
        
        while let Some(msg) = rx.recv().await {
            // 解析JSON交易数据
            let trade: Value = serde_json::from_str(&msg).unwrap();
            
            // 获取交易对symbol
            let symbol = trade["symbol"].as_str().unwrap();
            
            // 统计各symbol的交易数量
            *trade_counts.entry(symbol.to_string()).or_insert(0) += 1;
            
            // 打印交易数据
            println!("[{}] 价格: {}, 数量: {}", 
                symbol,
                trade["price"].as_f64().unwrap(),
                trade["quantity"].as_f64().unwrap()
            );
            
            // 每100条交易打印一次统计信息
            if trade_counts.values().sum::<i32>() % 100 == 0 {
                println!("当前交易统计: {:?}", trade_counts);
            }
        }
    });

    // 开始爬取Binance InverseSwap市场的实时交易数据
    println!("开始爬取Binance InverseSwap市场交易数据...");
    crawl_trade("binance", MarketType::InverseSwap, None, tx).await;
}

Cargo.toml需要添加的依赖:

[dependencies]
crypto-crawler = "4.7.9"
tokio = { version = "1", features = ["full"] }
serde_json = "1.0"

这个库提供了多种获取加密货币市场数据的方式,包括实时交易数据、订单簿更新、行情数据等,是开发加密货币相关应用的强大工具。


1 回复

Rust加密货币数据爬虫库crypto-crawler使用指南

介绍

crypto-crawler是一个用Rust编写的高性能加密货币市场数据爬虫库,专门用于获取实时市场行情和交易数据。它支持多个主流交易所,提供统一的API接口,让开发者可以轻松获取各种加密货币的市场数据。

主要特性:

  • 支持多个交易所(Binance, Huobi, OKX, FTX等)
  • 获取实时市场行情(ticker)
  • 获取实时交易数据(trade)
  • 获取订单簿数据(orderbook)
  • 高性能异步实现
  • 类型安全的API设计

安装

在Cargo.toml中添加依赖:

[dependencies]
crypto-crawler = "0.3"
tokio = { version = "1.0", features = ["full"] }

基本使用方法

1. 获取实时交易数据

use crypto_crawler::*;
use tokio::sync::mpsc;

#[tokio::main]
async fn main() {
    let exchanges = vec![
        "binance", "huobi", "okx", "kraken", "bitmex", 
        "mxc", "bitget", "bitfinex", "bybit", "gate"
    ];
    
    let (tx, mut rx) = mpsc::unbounded_channel();
    
    for exchange in exchanges {
        let tx = tx.clone();
        tokio::spawn(async move {
            crawl_trade(exchange, "all", tx).await;
        });
    }
    
    while let Some(msg) = rx.recv().await {
        println!("Received trade: {:?}", msg);
    }
}

2. 获取市场行情数据

use crypto_crawler::*;
use tokio::sync::mpsc;

#[tokio::main]
async fn main() {
    let (tx, mut rx) = mpsc::unbounded_channel();
    
    tokio::spawn(async move {
        crawl_ticker("binance", "BTC/USDT", tx).await;
    });
    
    while let Some(msg) = rx.recv().await {
        println!("Received ticker: {:?}", msg);
    }
}

3. 获取订单簿数据

use crypto_crawler::*;
use tokio::sync::mpsc;

#[tokio::main]
async fn main() {
    let (tx, mut rx) = mpsc::unbounded_channel();
    
    tokio::spawn(async move {
        crawl_l2_event("binance", "BTC/USDT", tx).await;
    });
    
    while let Some(msg) = rx.recv().await {
        println!("Received orderbook update: {:?}", msg);
    }
}

高级用法

过滤特定交易对

use crypto_crawler::*;
use tokio::sync::mpsc;

#[tokio::main]
async fn main() {
    let (tx, mut rx) = mpsc::unbounded_channel();
    
    tokio::spawn(async move {
        crawl_trade("binance", "BTC/USDT", tx).await;
    });
    
    while let Some(msg) = rx.recv().await {
        if msg.symbol == "BTC/USDT" {
            println!("BTC/USDT trade: {:?}", msg);
        }
    }
}

多交易所数据聚合

use crypto_crawler::*;
use tokio::sync::mpsc;
use std::collections::HashMap;

#[tokio::main]
async fn main() {
    let exchanges = vec!["binance", "huobi", "okx"];
    let (tx, mut rx) = mpsc::unbounded_channel();
    
    for exchange in exchanges {
        let tx = tx.clone();
        tokio::spawn(async move {
            crawl_ticker(exchange, "BTC/USDT", tx).await;
        });
    }
    
    let mut prices = HashMap::new();
    
    while let Some(msg) = rx.recv().await {
        prices.insert(msg.exchange.clone(), msg.last_price);
        println!("Current prices: {:?}", prices);
    }
}

完整示例代码

下面是一个整合了交易数据获取、市场行情监控和错误处理的完整示例:

use crypto_crawler::*;
use tokio::sync::mpsc;
use std::collections::HashMap;
use std::time::Duration;

#[tokio::main]
async fn main() {
    // 初始化交易所列表和交易对
    let exchanges = vec!["binance", "huobi", "okx"];
    let symbol = "BTC/USDT";
    
    // 创建通道用于接收数据
    let (trade_tx, mut trade_rx) = mpsc::unbounded_channel();
    let (ticker_tx, mut ticker_rx) = mpsc::unbounded_channel();
    
    // 启动交易数据爬虫
    for exchange in &exchanges {
        let tx = trade_tx.clone();
        let ex = exchange.to_string();
        tokio::spawn(async move {
            if let Err(e) = crawl_trade(&ex, symbol, tx).await {
                eprintln!("Failed to crawl trade from {}: {}", ex, e);
            }
        });
    }
    
    // 启动行情数据爬虫
    for exchange in &exchanges {
        let tx = ticker_tx.clone();
        let ex = exchange.to_string();
        tokio::spawn(async move {
            if let Err(e) = crawl_ticker(&ex, symbol, tx).await {
                eprintln!("Failed to crawl ticker from {}: {}", ex, e);
            }
        });
    }
    
    // 数据处理任务
    tokio::spawn(async move {
        let mut last_prices = HashMap::new();
        
        loop {
            tokio::select! {
                // 处理交易数据
                Some(trade) = trade_rx.recv() => {
                    if trade.symbol == symbol {
                        println!("[Trade] {}: {:?}", trade.exchange, trade);
                    }
                }
                
                // 处理行情数据
                Some(ticker) = ticker_rx.recv() => {
                    last_prices.insert(ticker.exchange.clone(), ticker.last_price);
                    println!("[Price Update] {:?}", last_prices);
                }
                
                // 定时输出摘要
                _ = tokio::time::sleep(Duration::from_secs(10)) => {
                    println!("=== Market Summary ===");
                    for (exchange, price) in &last_prices {
                        println!("{}: {}", exchange, price);
                    }
                }
            }
        }
    }).await.unwrap();
}

注意事项

  1. 使用前需要确保网络可以访问目标交易所的API
  2. 高频请求可能会触发交易所的API限制
  3. 对于生产环境使用,建议添加适当的错误处理和重试逻辑
  4. 不同交易所支持的交易对可能不同

性能优化建议

  1. 使用多线程处理不同交易所的数据
  2. 对于不需要的数据及时过滤,减少处理开销
  3. 考虑使用更高效的消息通道(如crossbeam)处理高频率数据
  4. 对于历史数据分析,可以考虑使用crypto-crawler提供的快照功能

这个库非常适合需要实时加密货币市场数据的应用场景,如量化交易系统、市场监控工具和价格预警系统等。

回到顶部