如何用Python抓取带切换按钮的动态体育网站场均统计数据?
无需Selenium,仅用BeautifulSoup4即可抓取场均数据
你不需要依赖Selenium,因为目标网站的场均数据已经包含在初始请求返回的HTML中——切换按钮只是通过CSS控制数据的显示/隐藏,并没有触发新的网络请求,所以只用BeautifulSoup4就能完成抓取。
解决方法
直接定位到场均数据对应的表格:该表格的id为per_game_school_stats,替换你代码中找表格的逻辑即可,数据提取的逻辑无需大幅调整,因为场均数据的data-stat属性和你原本抓取的字段对应一致。
修改后的完整代码
!pip install requests beautifulsoup4 pandas import pandas as pd import requests from bs4 import BeautifulSoup import csv def scrape_team_stats(url): response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 直接定位场均数据的表格 table = soup.find('table', id='per_game_school_stats') if not table: return [] # 未找到表格时返回空列表 # 提取球队数据 team_stats = [] for row in table.find_all('tr'): team_name = row.find('td', {'data-stat': 'school_name'}) fg_percentage = row.find('td', {'data-stat': 'fg_pct'}) orb_per_game = row.find('td', {'data-stat': 'orb'}) ast_per_game = row.find('td', {'data-stat': 'ast'}) stl_per_game = row.find('td', {'data-stat': 'stl'}) blk_per_game = row.find('td', {'data-stat': 'blk'}) tov_per_game = row.find('td', {'data-stat': 'tov'}) pf_per_game = row.find('td', {'data-stat': 'pf'}) if team_name: team_stats.append([ team_name.text.strip(), fg_percentage.text.strip() if fg_percentage else 'N/A', orb_per_game.text.strip() if orb_per_game else 'N/A', ast_per_game.text.strip() if ast_per_game else 'N/A', stl_per_game.text.strip() if stl_per_game else 'N/A', blk_per_game.text.strip() if blk_per_game else 'N/A', tov_per_game.text.strip() if tov_per_game else 'N/A', pf_per_game.text.strip() if pf_per_game else 'N/A' ]) return team_stats def write_to_csv(data, filename): with open(filename, 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['Team', 'FG%', 'ORB/G', 'AST/G', 'STL/G', 'BLK/G', 'TOV/G', 'PF/G']) # 写入表头 for row in data: writer.writerow(row) url = 'https://www.sports-reference.com/cbb/seasons/men/2024-school-stats.html' team_stats = scrape_team_stats(url) csv_filename = 'team_per_game_stats.csv' write_to_csv(team_stats, csv_filename) print(f"Data has been written to {csv_filename}")
补充说明
- 去掉了原代码中针对
modified类表格的筛选逻辑,通过id定位场均表格更精准,避免误抓总数据表格。 - 删除了
orb_per_game提取时多余的class判断,场均数据的字段仅通过data-stat即可准确定位。
内容的提问来源于stack exchange,提问作者Dan Russell
相关产品推荐
相关产品推荐

