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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:15:44