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

爬取NBA四因素数据时BeautifulSoup无法找到table标签的技术求助

解决NBA官网四因素数据爬取问题

问题原因

NBA官网的统计页面是动态渲染的,你用requests.get()获取的只是初始静态HTML,实际表格数据是通过后续加载的JavaScript动态生成的,所以BeautifulSoup找不到<table>标签。

调整方案

方案1:直接请求API接口(推荐)

NBA官网的数据通过API接口返回,直接请求接口能拿到JSON格式数据,比解析页面更高效稳定:

import requests
import pandas as pd

# 四因素数据的API接口,参数可按需修改(比如赛季Season)
api_url = "https://stats.nba.com/stats/leaguedashteamstats?Conference=&DateFrom=&DateTo=&Division=&GameScope=&GameSegment=&LastNGames=0&LeagueID=00&Location=&MeasureType=Four+Factors&Month=0&OpponentTeamID=0&Outcome=&PORound=0&PaceAdjust=N&PerMode=PerGame&Period=0&PlayerExperience=&PlayerPosition=&PlusMinus=N&Rank=N&Season=2023-24&SeasonSegment=&SeasonType=Regular+Season&ShotClockRange=&StarterBench=&TeamID=0&TwoWay=0&VsConference=&VsDivision="

# 模拟浏览器请求头,避免被拦截
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.nba.com/stats/teams/four-factors"
}

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

# 提取表头和数据行并转换为DataFrame
headers = [item['name'] for item in data['resultSets'][0]['headers']]
rows = data['resultSets'][0]['rowSet']
df = pd.DataFrame(rows, columns=headers)

print(df.head())

方案2:用Selenium渲染动态页面

如果不想找API,可以用Selenium模拟浏览器加载页面,等JavaScript渲染完成后再解析:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import pandas as pd

url = "https://www.nba.com/stats/teams/four-factors"

# 初始化Chrome浏览器
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get(url)

# 等待页面加载完成(可根据实际情况调整等待时长)
driver.implicitly_wait(10)

# 获取渲染后的页面源码并关闭浏览器
page_source = driver.page_source
driver.quit()

# 解析页面并提取表格
soup = BeautifulSoup(page_source, 'html.parser')
table = soup.find('table', class_="Crom_table__p1iZz")

# 转换为DataFrame
df = pd.read_html(str(table))[0]
print(df.head())

额外提示

  • 请求API时要注意请求头的设置,否则容易被服务器拒绝;API中的参数(如赛季Season)可根据需求修改。
  • 使用Selenium时,webdriver_manager会自动匹配浏览器驱动版本,无需手动下载驱动文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:13:28