使用BeautifulSoup爬取Fanduel赛事赔率无法定位可见数值的问题咨询
Fanduel盘口数据定位方法
- 你用普通
requests+BeautifulSoup抓不到数据是正常的,Fanduel页面采用客户端渲染,初始HTML仅包含页面框架,所有赛事盘口数据都是页面加载完成后通过接口请求注入的,不会出现在初始返回的源码里。 - 你在JSON接口里找不到对应赔率数值,核心原因是Fanduel的赔率字段不会直接存储页面显示的明码:
- 棒球让分盘对应的字段为
runLine,和让分数值分开存储 - 美国赔率会做偏移换算:部分接口返回的是十进制赔率,需要转换为美国赔率格式才能和页面对应,转换公式为:十进制赔率≥2时,美国赔率=(十进制赔率-1)*100;十进制赔率<2时,美国赔率=-100/(十进制赔率-1),四舍五入后就是页面显示的整数值。
- 棒球让分盘对应的字段为
- 快速定位对应请求的方法:打开浏览器开发者工具的「网络」面板,直接在面板顶部的搜索框输入你在页面看到的目标数值(比如你提到的-146),工具会自动筛选出所有返回内容包含该数值的请求,直接点进去就能看到对应的JSON字段路径,不需要逐个排查接口。
- 如果不想研究接口规则,可以直接用浏览器自动化工具(Selenium/Playwright)模拟页面加载完成后,直接提取元素的显示文本,适配性更高,示例代码如下:
from playwright.sync_api import sync_playwright # 需提前安装playwright并执行playwright install安装浏览器 with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page(user_agent="替换为你自己浏览器的UA值") page.goto("赛事页面地址", timeout=60000) # 等待盘口元素加载完成 page.wait_for_selector('[data-testid*="run-line"]', timeout=30000) # 提取让分盘所有数值 run_line_items = page.locator('[data-testid*="run-line"]').all_inner_texts() print(run_line_items) browser.close()
- 请求时需要注意Fanduel有严格的反爬校验,需要携带完整的请求头、Cookie,控制请求频率,否则会触发人机验证导致返回数据为空。
内容的提问来源于stack exchange,提问作者dfried
相关产品推荐
相关产品推荐

