为何使用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接口(推荐)
相比渲染整个页面,直接调用数据接口效率更高,也更稳定。步骤如下:
- 打开浏览器开发者工具(F12),切换到Network标签页;
- 刷新目标页面,过滤XHR/Fetch请求,找到加载赛事数据的API(通常路径包含
api、events或sports关键字); - 复制该API的请求URL、请求头(尤其是
Cookie、Referer、User-Agent); - 用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
相关产品推荐
相关产品推荐

