Python网页爬取导出Excel问题:仅首个事件数据写入成功
问题分析
你当前的代码在循环内重复创建pd.ExcelWriter实例并调用save(),每次执行都会覆盖之前生成的Excel文件,且所有数据都试图写入同一个Sheet1,最终只有最后一次循环的数据会被保留(你提到仅首个赛事导出,可能是后续循环中文件操作出现隐性覆盖或锁问题)。
解决方案
提供两种可行的修改方式,根据你的需求选择:
方式一:合并所有赛事数据到同一个Sheet
将所有赛事的马匹数据合并到一个DataFrame,添加赛事编号列区分,最后一次性导出:
import requests import json import pandas as pd import xlsxwriter pd.set_option('display.max_rows', 500) pd.set_option('display.max_columns', 500) pd.set_option('display.width', 1000) headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0', 'Accept-Language' : 'en-US,en;q=0.5'} # 初始化空列表存储所有赛事数据 all_horses = [] for race in range(1, 3): url = f"https://s3-ap-southeast-2.amazonaws.com/racevic.static/2019-01-01/flemington/sectionaltimes/race-{race}.json?callback=sectionaltimes_callback" r = requests.get(url, headers=headers) json_obj = json.loads(r.text.split('sectionaltimes_callback(')[1].rsplit(')', 1)[0]) # 将当前赛事数据转为DataFrame,添加赛事编号列 df = pd.DataFrame(json_obj['Horses']) df['Race_Number'] = race all_horses.append(df) print(df) # 合并所有数据并导出 combined_df = pd.concat(all_horses, ignore_index=True) writer = pd.ExcelWriter('horses.xlsx', engine='xlsxwriter') combined_df.to_excel(writer, sheet_name='All_Races') writer.save()
方式二:每个赛事数据写入独立Sheet
将pd.ExcelWriter的创建移到循环外,每次循环将对应赛事数据写入不同命名的Sheet,最后统一保存:
import requests import json import pandas as pd import xlsxwriter pd.set_option('display.max_rows', 500) pd.set_option('display.max_columns', 500) pd.set_option('display.width', 1000) headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0', 'Accept-Language' : 'en-US,en;q=0.5'} # 提前创建ExcelWriter实例 writer = pd.ExcelWriter('horses.xlsx', engine='xlsxwriter') for race in range(1, 3): url = f"https://s3-ap-southeast-2.amazonaws.com/racevic.static/2019-01-01/flemington/sectionaltimes/race-{race}.json?callback=sectionaltimes_callback" r = requests.get(url, headers=headers) json_obj = json.loads(r.text.split('sectionaltimes_callback(')[1].rsplit(')', 1)[0]) df = pd.DataFrame(json_obj['Horses']) # 写入对应命名的Sheet,比如Race_1、Race_2 df.to_excel(writer, sheet_name=f'Race_{race}') print(df) # 所有数据写入完成后统一保存 writer.save()
关键修改点
- 避免在循环内重复创建
pd.ExcelWriter,防止文件被反复覆盖 - 方式一通过合并DataFrame实现单Sheet多赛事数据,便于整体查看
- 方式二通过独立Sheet存储单赛事数据,数据分区更清晰
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

