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

如何在未知页面结构下用Python抓取NBA赛事让分数据?

解决FanDuel NBA让分数据抓取问题

问题根源

你用requests获取的是静态HTML源码,而FanDuel的赛事数据是通过JavaScript动态渲染加载的,静态源码里只有最外层容器div,没有实际生成的赛事内容,所以BeautifulSoup解析不到目标元素。


解决方法

方法1:使用浏览器自动化工具(Selenium)

模拟真实浏览器加载页面,等待JS渲染完成后再抓取内容,这是最直接的动态页面抓取方案。

  1. 先安装依赖:
pip install selenium
  1. 下载对应浏览器的驱动(比如ChromeDriver),确保驱动版本和你的浏览器版本匹配。

  2. 示例代码:

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('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36')
# 可选开启无头模式,不显示浏览器窗口
options.add_argument('--headless=new')

driver = webdriver.Chrome(options=options)
target_url = "https://tn.sportsbook.fanduel.com/basketball/nba/philadelphia-76ers-@-brooklyn-nets-32284119"
driver.get(target_url)

# 等待目标元素加载完成,最多等待10秒
try:
    # 定位所有aria-label包含"Spread Betting"的div元素
    spread_elements = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div[aria-label*="Spread Betting"]'))
    )
    
    # 输出每个元素的aria-label内容
    for elem in spread_elements:
        print(elem.get_attribute('aria-label'))
finally:
    # 关闭浏览器
    driver.quit()

方法2:直接调用网站API接口

打开浏览器开发者工具(F12),切换到Network标签页,刷新页面后筛选XHR/fetch请求,找到返回赛事数据的API接口,直接请求接口获取数据,效率比浏览器自动化更高。

  1. 抓包步骤:

    • 打开目标页面,F12进入开发者工具
    • 切换到Network→Fetch/XHR
    • 刷新页面,搜索"spread"、"event"等关键词,找到返回赛事数据的请求
    • 复制该请求的URL、请求头(比如Cookie、Referer等)
  2. 示例代码(需替换为实际抓包到的API信息):

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
    # 从抓包结果中复制Cookie、Referer等必要请求头
}

# 替换为实际抓包到的API地址
api_url = "https://example-fanduel-api-url.com/event/32284119"
response = requests.get(api_url, headers=headers)
data = response.json()

# 根据API返回的JSON结构提取让分数据,以下为示例结构
for selection in data['markets'][0]['selections']:
    print(f"{selection['teamName']} 让分: {selection['spread']}")

注意事项

  • 网站API可能随时变更,需要定期检查抓包结果
  • 频繁请求可能触发反爬机制,建议添加请求间隔,遵守网站服务条款

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:32:30