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

Selenium筛选动态表格:Binance交易池下拉选择超时问题求助

解决Binance Trading Bots页面Futures-Grid筛选下拉框超时问题

问题背景

需抓取Binance官网Trading Bots页面的Futures-Grid表格数据到Pandas DataFrame,默认视图抓取已成功,但点击Running Time下拉框选择≤1 Day选项时出现TimeoutException,无法完成筛选。

错误原因分析

  1. 错误的等待选择器:原代码等待div.bn-sdd-dropdown.showing,但Binance自定义下拉框展开后,选项容器的定位逻辑并不依赖该class
  2. 错误使用Select类:页面下拉是自定义组件,并非原生HTML <select> 元素,无法用Selenium的Select类交互
  3. 元素遮挡/不可见:headless模式下窗口尺寸不足,或元素未滚动到可视区域,导致点击和等待失效

修正后的完整代码

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

pd.set_option("display.max_rows", 100)
pd.set_option("display.max_columns", 100)
pd.set_option("display.width", 100)

url = "https://www.binance.com/en/trading-bots"

options = webdriver.ChromeOptions()
options.add_argument('--headless=new')  # 新版headless模式,兼容性更强
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--window-size=1920,1080')  # 明确窗口尺寸,避免元素不可见
options.add_argument('disable-infobars')
options.add_argument('--disable-extensions')

browser = webdriver.Chrome(options=options)
browser.get(url)

# 切换到Futures-Grid标签
futures_grid_button = WebDriverWait(browser, 30).until(
    EC.element_to_be_clickable((By.ID, 'tab-futuresGrid'))
)
browser.execute_script("arguments[0].click();", futures_grid_button)
print("切换到Futures-Grid标签")

# 定位Running Time筛选容器,先滚动到元素位置避免遮挡
running_time_container = WebDriverWait(browser, 30).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, 'div[data-testid="runningTime-filter"]'))
)
browser.execute_script("arguments[0].scrollIntoView(true);", running_time_container)
print("滚动到Running Time筛选区域")

# 点击展开下拉框
running_time_dropdown = running_time_container.find_element(By.CSS_SELECTOR, 'div[name="runningTime"]')
browser.execute_script("arguments[0].click();", running_time_dropdown)
print("展开Running Time下拉框")

# 等待≤1 Day选项可见并点击
one_day_option = WebDriverWait(browser, 30).until(
    EC.element_to_be_clickable((By.XPATH, "//li[text()='≤1 Day']"))
)
browser.execute_script("arguments[0].click();", one_day_option)
print("选择≤1 Day选项")

# 等待表格数据刷新完成
rows_element = WebDriverWait(browser, 30).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.body-row"))
)
print(f"找到{len(rows_element)}行数据")

# 提取表格数据
headers = [
    "Rank/Market",
    "Direction",
    "Running Time",
    "ROI",
    "PNL(USD)",
    "Copy Popularity",
    "Action",
]

rows = []
for row_element in rows_element:
    cell_data = [i.text.replace('\n', ',') for i in row_element.find_elements(By.CSS_SELECTOR, 'div[class^="body-cell body-cell-"]')]
    rows.append(cell_data)

binance_bots_df = pd.DataFrame(rows, columns=headers)
print(binance_bots_df)

browser.quit()

关键修正点

  • 新版headless模式:使用--headless=new替代旧版headless,提升页面渲染兼容性
  • 明确窗口尺寸:设置--window-size=1920,1080,确保所有元素在headless模式下可见
  • 滚动到目标元素:先将Running Time容器滚动到可视区域,避免被页面其他元素遮挡
  • 直接定位选项:跳过对下拉容器class的等待,直接等待目标选项≤1 Day的可点击状态
  • 弃用Select类:针对自定义下拉组件,直接通过XPATH定位选项并点击

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 07:32:15