如何采集NHL分页API数据并合并写入同一Excel工作表不覆盖内容
实现方案
核心逻辑
- 拆分API的固定参数与分页参数:该接口通过
start参数控制分页偏移量,limit参数控制单页返回条数,我们将limit设为接口支持的最大值100,减少请求次数 - 首次请求获取总数据量,自动计算需要请求的总页数
- 循环拉取所有分页数据,合并为完整数据集后统一写入Excel,避免多次写入覆盖原有内容
完整可运行代码
import requests import pandas as pd import time # 接口固定参数部分,移除了原链接中多余的符号 base_url = "https://api.nhle.com/stats/rest/en/team/daysbetweengames?isAggregate=false&isGame=true&sort=%5B%7B%22property%22:%22teamFullName%22,%22direction%22:%22ASC%22%7D,%7B%22property%22:%22daysRest%22,%22direction%22:%22DESC%22%7D,%7B%22property%22:%22teamId%22,%22direction%22:%22ASC%22%7D%5D&factCayenneExp=gamesPlayed%3E=1&cayenneExp=gameDate%3C=%222021-11-30%2023:59:59%22%20and%20gameDate%3E=%222021-10-12%22%20and%20gameTypeId=2" # 单页最大返回条数,按接口限制设为100 page_size = 100 # 存储所有分页的数据 all_data = [] # 第一次请求获取总数据量 first_resp = requests.get(f"{base_url}&start=0&limit={page_size}") first_resp.raise_for_status() # 检查请求是否出错 first_data = first_resp.json() total = first_data['total'] # 加入第一页的数据 all_data.extend(first_data['data']) print(f"总数据量:{total}条,开始分页拉取") # 计算剩余需要拉取的页数 for start in range(page_size, total, page_size): # 构造分页请求链接 req_url = f"{base_url}&start={start}&limit={page_size}" resp = requests.get(req_url) resp.raise_for_status() page_data = resp.json() all_data.extend(page_data['data']) print(f"已拉取到第{start//page_size + 1}页,累计{len(all_data)}条数据") # 加1秒延时避免请求频率过高被接口拦截 time.sleep(1) # 合并所有数据为DataFrame full_df = pd.DataFrame(all_data) # 写入Excel,所有数据存入同一个工作表 full_df.to_excel('Master File.xlsx', sheet_name='Info', index=False) print(f"所有数据已写入完成,共{len(full_df)}条")
补充说明
如果需要后续增量写入不覆盖已有数据,可以先读取本地已有的Excel数据,和新拉取的数据做去重后再写入,示例逻辑如下:
# 读取本地已有数据 old_df = pd.read_excel('Master File.xlsx', sheet_name='Info') # 合并新旧数据,按唯一字段(比如gameId+teamId)去重 combined_df = pd.concat([old_df, full_df]).drop_duplicates(subset=['gameId', 'teamId'], keep='last') # 重新写入 combined_df.to_excel('Master File.xlsx', sheet_name='Info', index=False)
内容的提问来源于stack exchange,提问作者user16646545
相关产品推荐
相关产品推荐

