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

静态与动态HTML爬取问题:TimeForm赛马页爬取无输出咨询

解决方案

你的推测是对的——requests只能抓取页面的初始静态HTML,而该赛马日程页面的内容是通过JavaScript动态渲染生成的,所以直接用requests拿不到完整的渲染后内容;而你本地保存的是浏览器渲染后的完整HTML,因此测试时爬虫能正常运行。

针对动态加载问题,完全可以用Selenium将动态页面转为静态HTML后爬取,而且不需要重写现有BeautifulSoup的解析代码,只需在原有流程前加一步用Selenium加载页面并获取渲染后的源码即可。

具体实现步骤

  1. 安装依赖
    首先安装Selenium库,以及对应浏览器的驱动(比如ChromeDriver,需和你的Chrome版本匹配):

    pip install selenium
    
  2. 结合Selenium与原有代码的示例
    用Selenium启动浏览器加载页面,等待动态内容渲染完成后,获取页面源码,再传给BeautifulSoup处理:

    from bs4 import BeautifulSoup
    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
    
    # 初始化Chrome浏览器(可选无头模式,不弹出窗口)
    options = webdriver.ChromeOptions()
    options.add_argument('--headless=new')
    driver = webdriver.Chrome(options=options)
    
    try:
        # 加载目标页面
        driver.get("https://www.timeform.com/horse-racing/racecards")
        # 等待动态内容渲染完成(示例:等待某个赛马日程元素出现,可根据实际页面调整)
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "racecard-item"))  # 替换为页面实际存在的元素类名
        )
        # 获取渲染后的完整页面源码
        page_source = driver.page_source
        # 传给BeautifulSoup,后续用你原来的解析代码处理即可
        soup = BeautifulSoup(page_source, 'html.parser')
        # 这里可以直接调用你原来的爬虫解析逻辑
        print(soup)
    finally:
        # 关闭浏览器
        driver.quit()
    

关键注意事项

  • 等待策略:必须等待动态内容渲染完成再获取源码,避免拿到不完整的HTML。可以根据页面实际元素调整等待条件(比如等待特定ID、类名的元素出现)。
  • 无头模式:加上--headless=new参数可以让浏览器在后台运行,不弹出窗口,适合服务器环境运行。
  • 合规性:即使robots.txt没限制,也要控制爬取频率,避免给网站服务器造成过大压力,同时遵守网站的使用条款。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:52:14