爬取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
相关产品推荐
相关产品推荐

