Python for循环爬取比赛数据合并到单个DataFrame问题排查
问题根因
- 最终DataFrame的生成逻辑放在了id遍历循环外部,每次循环爬取的单场比赛数据没有实时追加到全局存储的DataFrame中,循环结束后只会保留最后一个id的爬取结果,看起来就像只执行了一次循环。
- 初始定义的全局df全程没有被使用,循环内生成的
df_h、df_a也属于无效代码没有被调用。
修复后可运行代码
import requests from bs4 import BeautifulSoup import json import pandas as pd # 初始化全局存储用的空DataFrame colnames = ["x", "y", "xg", "team"] df = pd.DataFrame(columns=colnames) for match_id in range(16376,16379): # 避免和内置函数id重名,把变量名改成match_id understat = f'https://understat.com/match/{match_id}' res = requests.get(understat) soup = BeautifulSoup(res.content, "lxml") scripts = soup.find_all('script') # 提取shots数据的json内容 strings = scripts[1].string index_start = strings.index("('") + 2 index_end = strings.index("')") json_data = strings[index_start:index_end] json_data = json_data.encode('utf8').decode('unicode_escape') data1 = json.loads(json_data) # 初始化当前场次的临时存储列表 x = [] y = [] xg = [] team = [] data_home = data1["h"] data_away = data1["a"] # 处理主队数据 for index in range(len(data_home)): for key in data_home[index]: if key == "X": x.append(data_home[index][key]) if key == "Y": y.append(data_home[index][key]) if key == "xG": xg.append(data_home[index][key]) if key == "h_team": team.append(data_home[index][key]) # 处理客队数据 for index in range(len(data_away)): for key in data_away[index]: if key == "X": x.append(data_away[index][key]) if key == "Y": y.append(data_away[index][key]) if key == "xG": xg.append(data_away[index][key]) if key == "a_team": team.append(data_away[index][key]) # 生成当前场次的临时DataFrame,追加到全局df temp_df = pd.DataFrame([x, y, xg, team], index=colnames).T df = pd.concat([df, temp_df], ignore_index=True) # 所有场次爬取完成后可以输出查看或者保存 print(df.head()) # df.to_csv("understat_shots.csv", index=False, encoding="utf_8_sig")
优化建议
- 可以在请求部分增加超时设置和异常捕获,避免单个id请求失败导致整个程序终止。
- 可以设置合理的请求间隔,避免请求频率过高被网站封禁IP。
内容的提问来源于stack exchange,提问作者user16805952
相关产品推荐
相关产品推荐

