Python使用Selenium爬取Hxro站点动态下拉ticker列表问题求助
问题解决思路
核心原因
- 页面Ajax动态加载未完成就执行了元素查找,仅能拿到已经渲染的默认选中ticker
- 下拉菜单默认处于收起状态,其余ticker对应的DOM节点未挂载到页面上,自然匹配不到
优化后可用代码
补充引入Selenium显式等待相关模块,先模拟点击展开下拉框,再等待所有元素加载完成后提取:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = "https://live.hxro.io/tixwix" chrome_options = Options() # 调试阶段可以注释掉下方无头模式配置,直观看到操作过程 # chrome_options.add_argument("--headless=new") driver = webdriver.Chrome(executable_path = r'C:\geckodriver\chromedriver.exe',options = chrome_options) driver.get(url) # 设置最长等待时间为10秒,元素加载完成就立刻执行后续操作,无额外等待耗时 wait = WebDriverWait(driver, 10) try: # 1. 等待下拉触发按钮可点击,模拟点击展开下拉菜单 toggle_btn = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'lastprice-toggle'))) toggle_btn.click() # 2. 等待所有下拉项加载完成,这里的CSS选择器可根据实际DOM调整: # 浏览器F12展开下拉框后,用元素选择工具点选任意ticker项,复制通用选择器替换即可 # 下方为通用示例,适配大多数下拉框选项的role属性匹配规则 all_tickers = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.lastprice-dropdown [role="option"]'))) # 提取所有非空的ticker文本 ticker_result = [item.text.strip() for item in all_tickers if item.text.strip()] print(ticker_result) finally: driver.quit()
补充说明
- 若无头模式下运行失败,可以添加
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36')模拟正常浏览器标识,避免被网站反爬拦截。 - 显式等待比强制sleep效率更高,也能避免网络波动导致的偶发加载失败问题。
内容的提问来源于stack exchange,提问作者Rahan
相关产品推荐
相关产品推荐

