You need to enable JavaScript to run this app. Selenium仅爬取半页网球赛事数据,无法完整获取所有category-container元素问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Selenium仅爬取半页网球赛事数据,无法完整获取所有category-container元素问题求助

问题根源
  • 核心触发逻辑为目标站点对长列表赛事内容采用滚动触发式懒加载渲染。初始页面完成首次加载时,DOM树中仅会生成当前浏览器视口可见范围内的前半段赛事板块节点,ITF埃及及之后的赛事内容属于未被触发加载的占位区块,根本没有生成对应的class="category-container"的实体DOM节点,此时执行元素查找操作,自然只能获取到已渲染的前半段结果。
  • 当前代码的执行时序存在缺陷:页面刚完成初始加载就立刻执行元素查找操作,没有等待后续动态内容逐段加载的流程,抓取的结果刚好卡在懒加载触发的视口临界点,就会出现爬取列表停在ITF埃及板块、后续内容完全缺失的现象。
  • 代码使用的driver.find_elements_by_xpath是Selenium 3.x版本的已废弃API,在Selenium 4.x环境下运行时,会出现元素定位范围不全、返回结果不稳定的兼容性问题,进一步放大了结果缺失的异常。
落地方案
  • 先替换废弃的定位API:将原代码中matches = driver.find_elements_by_xpath('//div[@class="category-container"]')的写法,替换为Selenium全版本兼容的标准定位写法driver.find_elements(By.XPATH, '//div[@class="category-container"]'),消除API兼容性带来的定位异常。
  • 增加全量滚动触发逻辑,强制站点将所有赛事节点完整渲染到DOM中。具体实现为:循环将页面滚动到最底部,每次滚动后等待固定加载时长,直到连续两次统计到的category-container节点数量不再变化,即可判定所有长列表内容加载完成,参考代码片段:
import time

last_count = 0
while True:
    # 执行脚本滚动到页面最底端
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待动态内容完成渲染
    time.sleep(2)
    current_count = len(driver.find_elements(By.XPATH, '//div[@class="category-container"]'))
    # 连续两次节点数无变化,代表无更多待加载内容
    if current_count == last_count:
        break
    last_count = current_count

# 全量加载完成后再抓取最终的目标元素列表
matches = driver.find_elements(By.XPATH, '//div[@class="category-container"]')
  • 针对部分滚动后超出视口节点被DOM回收的场景(部分前端框架为了优化长列表性能,会把视口外的已渲染节点移出DOM树),不要等全部滚动完成后再统一抓取元素,每次滚动后即时把当前视口内的category-container节点文本、属性等信息存储到本地列表中,避免之前加载的节点被移出DOM导致内容丢失。
  • 滚动过程中可以额外通过脚本将所有折叠的赛事分类板块强制展开,避免部分分类节点因处于折叠状态没有被纳入DOM树,导致抓取遗漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 05:06:03