You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

爬取Binance卖盘价格:无法获取全部ask-light值的问题

解决Binance订单簿ask-light数据抓取不全的问题

问题根源

你当前的代码存在两个核心问题:

  1. XPATH定位冗余:多层嵌套的路径会匹配大量无关div,其中很多元素根本没有ask-light属性,导致遍历输出大量空值。
  2. 未处理动态加载:Binance订单簿默认只加载可见区域数据,下方条目需要滚动容器后才会渲染,直接抓取只能拿到部分内容。

修正方案

1. 精准定位目标元素

直接定位带有ask-light标识的元素(如果是class用contains(@class, 'ask-light'),如果是自定义属性用@ask-light),避免匹配无关节点。

2. 触发动态加载

找到订单簿sell侧的滚动容器,通过JS滚动触发更多数据加载,确保所有条目都被渲染。

修改后的代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

driver.get("https://www.binance.com/fr/trade/ETH_USDT")
wait = WebDriverWait(driver, 20)

# 拒绝Cookie弹窗
wait.until(EC.element_to_be_clickable((By.ID, "onetrust-reject-all-handler"))).click()
time.sleep(0.5)

# 定位订单簿sell侧的滚动容器
sell_container = wait.until(EC.visibility_of_element_located(
    (By.XPATH, "//div[@id='spotOrderbook']//div[contains(@class, 'orderbook-list-container orderbook-sell')]")
))

# 滚动容器加载全部数据(重复次数可根据需求调整)
for _ in range(6):
    driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", sell_container)
    time.sleep(0.3)

# 直接抓取所有ask-light元素
sell_items = wait.until(EC.visibility_of_all_elements_located(
    (By.XPATH, "//div[@id='spotOrderbook']//div[contains(@class, 'ask-light')]")
))

print(f"共抓取到 {len(sell_items)} 条ask数据")
for idx, item in enumerate(sell_items, 1):
    # 如果ask-light是自定义属性,改用item.get_attribute('ask-light');如果是class,直接取文本
    price = item.text.strip()
    print(f"第{idx}条ask价格: {price}")

额外提示

  • 若ask-light是自定义属性而非class,将定位XPATH改为//div[@id='spotOrderbook']//div[@ask-light],然后用item.get_attribute('ask-light')获取值。
  • Binance有反爬机制,频繁抓取可能触发限制,建议控制请求频率;优先使用官方API获取订单簿数据,更稳定且合规。

内容的提问来源于stack exchange,提问作者Look_thisSTREAMING

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 20:25:10