Selenium筛选动态表格:Binance交易池下拉选择超时问题求助
解决Binance Trading Bots页面Futures-Grid筛选下拉框超时问题
问题背景
需抓取Binance官网Trading Bots页面的Futures-Grid表格数据到Pandas DataFrame,默认视图抓取已成功,但点击Running Time下拉框选择≤1 Day选项时出现TimeoutException,无法完成筛选。
错误原因分析
- 错误的等待选择器:原代码等待
div.bn-sdd-dropdown.showing,但Binance自定义下拉框展开后,选项容器的定位逻辑并不依赖该class - 错误使用Select类:页面下拉是自定义组件,并非原生HTML
<select>元素,无法用Selenium的Select类交互 - 元素遮挡/不可见: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
相关产品推荐
相关产品推荐

