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

