使用requests.get()爬取Pinnacle仅获源码,无法获取可见HTML内容
问题原因
Pinnacle的球员投注赔率是通过JavaScript动态渲染加载的,直接用requests.get()只能获取到页面的初始静态HTML源码,浏览器中看到的实际内容是JS执行后生成的,所以你用BeautifulSoup找不到对应的span标签,返回None。
解决方法
方法一:用Selenium模拟浏览器加载
Selenium可以模拟真实浏览器的行为,等待页面JS渲染完成后再获取完整的页面内容,步骤如下:
- 安装依赖:
pip install selenium pandas beautifulsoup4
- 下载对应浏览器的驱动(比如ChromeDriver),并配置到系统PATH中,或者在代码中指定驱动路径。
- 示例代码:
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,你可以通过浏览器开发者工具找到对应的接口:
- 打开目标页面,按F12打开开发者工具,切换到Network标签。
- 刷新页面,在筛选框输入
player或prop,找到返回球员赔率数据的XHR请求,复制其URL和请求头(如User-Agent、Cookie等)。 - 用
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
相关产品推荐
相关产品推荐

