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

使用requests.get()爬取Pinnacle仅获源码,无法获取可见HTML内容

问题原因

Pinnacle的球员投注赔率是通过JavaScript动态渲染加载的,直接用requests.get()只能获取到页面的初始静态HTML源码,浏览器中看到的实际内容是JS执行后生成的,所以你用BeautifulSoup找不到对应的span标签,返回None。

解决方法

方法一:用Selenium模拟浏览器加载

Selenium可以模拟真实浏览器的行为,等待页面JS渲染完成后再获取完整的页面内容,步骤如下:

  1. 安装依赖:
pip install selenium pandas beautifulsoup4
  1. 下载对应浏览器的驱动(比如ChromeDriver),并配置到系统PATH中,或者在代码中指定驱动路径。
  2. 示例代码:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import pandas as pd

# 初始化Chrome浏览器
driver = webdriver.Chrome()
url = "https://www.pinnacle.com/en/basketball/nba/los-angeles-lakers-vs-orlando-magic/1564389023#player-props"
driver.get(url)

# 等待球员投注区域加载完成(根据实际页面元素调整选择器)
try:
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "[data-test-id='player-props']"))
    )
except Exception as e:
    print("页面加载超时:", e)
    driver.quit()
    exit()

# 获取渲染后的完整页面源码
page_source = driver.page_source
driver.quit()

# 解析页面内容
soup = BeautifulSoup(page_source, "html.parser")
player_props_list = []

# 遍历所有球员投注项(选择器需根据实际页面结构调整)
for prop_card in soup.select(".player-prop-market"):
    player_name = prop_card.select_one(".participant-name").text.strip()
    prop_type = prop_card.select_one(".market-name").text.strip()
    over_odds = prop_card.select_one(".outcome:nth-child(1) .odds-value").text.strip()
    under_odds = prop_card.select_one(".outcome:nth-child(2) .odds-value").text.strip()
    
    player_props_list.append({
        "球员姓名": player_name,
        "投注类型": prop_type,
        "大分赔率": over_odds,
        "小分赔率": under_odds
    })

# 转换为DataFrame
df = pd.DataFrame(player_props_list)
print(df)

方法二:直接调用API接口(更高效)

动态加载的内容通常来自后端API,你可以通过浏览器开发者工具找到对应的接口:

  1. 打开目标页面,按F12打开开发者工具,切换到Network标签。
  2. 刷新页面,在筛选框输入player或prop,找到返回球员赔率数据的XHR请求,复制其URL和请求头(如User-Agent、Cookie等)。
  3. 用requests直接请求该API,解析JSON数据生成DataFrame:
import requests
import pandas as pd

# 替换为你找到的真实API接口URL
api_url = "https://api.pinnacle.com/v1/markets/1564389023/player-props"
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.pinnacle.com/en/basketball/nba/los-angeles-lakers-vs-orlando-magic/1564389023#player-props"
    # 若需要Cookie,从浏览器请求头中复制
}

response = requests.get(api_url, headers=headers)
data = response.json()

player_props_list = []
for item in data.get("markets", []):
    player_name = item.get("participant", {}).get("name")
    prop_type = item.get("name")
    over_odds = item.get("outcomes", [{}])[0].get("odds")
    under_odds = item.get("outcomes", [{}])[1].get("odds")
    
    player_props_list.append({
        "球员姓名": player_name,
        "投注类型": prop_type,
        "大分赔率": over_odds,
        "小分赔率": under_odds
    })

df = pd.DataFrame(player_props_list)
print(df)
注意事项
  • 页面元素选择器和API接口可能会随网站更新变化,需要根据实际页面结构调整。
  • 频繁请求可能触发网站反爬机制,建议添加请求间隔,遵守网站使用条款。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:10:33