爬取Binance卖盘价格:无法获取全部ask-light值的问题
解决Binance订单簿ask-light数据抓取不全的问题
问题根源
你当前的代码存在两个核心问题:
- XPATH定位冗余:多层嵌套的路径会匹配大量无关div,其中很多元素根本没有
ask-light属性,导致遍历输出大量空值。 - 未处理动态加载: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
相关产品推荐
相关产品推荐

