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

Python新手求助:修改FIBA技术统计台爬虫代码,解决空CSV问题

爬取FIBA技术统计台数据的代码修复方案

我是Python纯新手,想要获取喜爱的本地篮球队的数据集,因此寻找爬取FIBA技术统计台(box score)的代码。我在Stack Overflow上找到一段代码,尝试修改表头后却生成了空CSV文件,希望有人能帮忙修改下方代码,实现爬取每支球队的技术统计台数据。

原代码:

import requests
from bs4 import BeautifulSoup
import pandas

stats_basic = ['NO.', 'PLAYER', 'POS', 'MINS', 'PTS', 'FG', 'FG%', '2P', '2P%', '3P', '3P%', 'FT', 'FT%', 'OFF', 'DEF', 'REB', 'AST', 'TO', 'STL', 'BLK', 'BLKR', 'PF', 'FLS ON', '+/-']
#stats_adv = ['TS%', 'eFG%', '3PAr', 'FTr', 'ORB%', 'DRB%', 'TRB%', 'AST%', 'STL%', 'BLK%', 'TOV%', 'USG%', #'ORtg', 'DRtg', 'BPM']

url_boxscore = "https://fibalivestats.dcd.shared.geniussports.com/u/PBA/2145647/bs.html"
stats1 = []

r = requests.get(url_boxscore)
c = r.content
soup = BeautifulSoup(c, "html.parser")
box_scores_content = soup.find_all("div",{"id":"content"})

d = {}
for item in box_scores_content:
    for stat in stats_basic:
        d[stat] = (item.find_all("td",{"data-stat":"fg"})[11].text)
    stats1.append(d)

df=pandas.DataFrame(stats1)
df.to_csv("ginebra.csv")

修复后的代码:

import requests
from bs4 import BeautifulSoup
import pandas as pd

# 表头与页面data-stat属性的对应关系
stat_mapping = {
    'NO.': 'num',
    'PLAYER': 'player',
    'POS': 'pos',
    'MINS': 'min',
    'PTS': 'pts',
    'FG': 'fg',
    'FG%': 'fgp',
    '2P': '2p',
    '2P%': '2pp',
    '3P': '3p',
    '3P%': '3pp',
    'FT': 'ft',
    'FT%': 'ftp',
    'OFF': 'off',
    'DEF': 'def',
    'REB': 'tot',
    'AST': 'ast',
    'TO': 'to',
    'STL': 'stl',
    'BLK': 'blk',
    'BLKR': 'blka',
    'PF': 'pf',
    'FLS ON': 'foulsdrawn',
    '+/-': 'pm'
}

url_boxscore = "https://fibalivestats.dcd.shared.geniussports.com/u/PBA/2145647/bs.html"
all_player_stats = []

# 获取页面内容
response = requests.get(url_boxscore)
soup = BeautifulSoup(response.content, "html.parser")

# 定位两支球队的统计表格
team_tables = soup.find_all("table", class_="tm")

for table in team_tables:
    # 提取球队名称
    team_name = table.find("caption").text.strip()
    # 遍历球员行(跳过表头和总计行)
    player_rows = table.find_all("tr")[1:-1]
    for row in player_rows:
        player_data = {'球队': team_name}
        for stat_name, data_stat in stat_mapping.items():
            # 提取对应字段的数据
            stat_value = row.find("td", {"data-stat": data_stat}).text.strip()
            player_data[stat_name] = stat_value
        all_player_stats.append(player_data)

# 保存为CSV文件
df = pd.DataFrame(all_player_stats)
df.to_csv("球队技术统计.csv", index=False, encoding='utf-8-sig')
print("数据已成功保存到球队技术统计.csv")

修复说明

原代码的核心问题是数据定位和提取逻辑错误,修复后做了这些关键调整:

  • 正确定位球队统计表格:通过table.tm找到页面中两支球队的统计区域,而非错误定位div#content
  • 字段精准匹配:将表头与页面中每个统计项对应的data-stat属性一一映射,确保数据提取准确
  • 区分球队信息:给每个球员数据添加所属球队标识,方便后续数据区分
  • 过滤无效行:跳过表格的表头和总计行,只保留有效球员数据
  • 优化编码:使用utf-8-sig编码保存CSV,避免中文乱码问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:40:56