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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:40:26