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

为何使用requests-html的render方法无法抓取动态内容?

解决requests-html无法获取Winamax动态赛事内容的问题

我之前也踩过类似的坑,Winamax这类体育博彩平台的反爬机制做得相当严格,咱们来一步步拆解问题原因和解决方案:

为什么requests-html的render()拿不到内容?

主要有这几个核心原因:

  • 无头浏览器被检测拦截:requests-html默认使用的无头Chrome带有明显的自动化特征(比如User-Agent里的HeadlessChrome标识、特定的浏览器参数),网站的反爬系统会直接识别并拦截这类请求,导致页面渲染后也加载不到动态赛事数据。
  • 动态内容需要交互触发:有些赛事内容不是页面加载完成就自动渲染,可能需要滚动页面、点击特定按钮,或者依赖用户会话中的Cookie/认证信息,而r.html.render()只是简单等待页面初始加载,没有模拟这些必要的交互。
  • API接口需要验证:这类网站的赛事数据几乎都是通过AJAX请求后端API获取的,而API往往要求特定的请求头、Cookie或者签名参数,requests-html直接渲染页面时可能没带上这些关键信息,导致数据请求失败。

可行的解决方案

1. 配置requests-html绕过无头检测

修改render()的参数,模拟真实浏览器的特征,避免被反爬系统识别:

from requests_html import HTMLSession

session = HTMLSession()
r = session.get('https://www.winamax.fr/paris-sportifs/sports/1/1/1')

# 自定义渲染参数,模拟真实Chrome环境
r.html.render(
    # 使用正常的Chrome User-Agent,去掉Headless标识
    user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    # 先尝试非无头模式测试,确认可行后再改回headless=True
    headless=False,
    # 添加规避检测的浏览器启动参数
    args=[
        '--no-sandbox',
        '--disable-blink-features=AutomationControlled',
        '--disable-dev-shm-usage'
    ],
    # 延长渲染等待时间,确保动态内容加载完成
    timeout=20
)

print(r.html.text)

重点说明:--disable-blink-features=AutomationControlled这个参数可以去掉Chrome的自动化标记,大大降低被检测的概率。

2. 直接抓取后端API接口(推荐)

相比渲染整个页面,直接调用数据接口效率更高,也更稳定。步骤如下:

  1. 打开浏览器开发者工具(F12),切换到Network标签页;
  2. 刷新目标页面,过滤XHR/Fetch请求,找到加载赛事数据的API(通常路径包含api、events或sports关键字);
  3. 复制该API的请求URL、请求头(尤其是Cookie、Referer、User-Agent);
  4. 用requests直接请求API:
import requests

# 从浏览器开发者工具复制的请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Referer': 'https://www.winamax.fr/paris-sportifs/sports/1/1/1',
    'Cookie': '这里粘贴从浏览器复制的Cookie内容'
}

# 从浏览器复制的API地址
api_url = 'https://www.winamax.fr/api/...'  # 替换为实际的API路径

response = requests.get(api_url, headers=headers)
# 多数情况下返回JSON格式的数据
event_data = response.json()
print(event_data)

注意:Cookie可能会过期,建议用requests.Session()保持会话,或者定期更新Cookie。

3. 改用undetected-chromedriver(终极方案)

如果上面的方法都无效,说明网站的反爬机制非常严格,可以试试undetected-chromedriver,它专门针对反爬优化,能绕过绝大多数自动化检测:

from undetected_chromedriver import Chrome
from selenium.webdriver.common.by import By
import time

# 初始化浏览器,自动规避检测
driver = Chrome()
driver.get('https://www.winamax.fr/paris-sportifs/sports/1/1/1')

# 等待页面完全加载(可根据实际情况调整时间)
time.sleep(5)

# 定位赛事元素(替换为实际的CSS选择器或XPath)
event_elements = driver.find_elements(By.CSS_SELECTOR, '.sport-event__match')
for element in event_elements:
    print(element.text)

driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:19:11