如何从API提取多个CSV文件并合并为单个CSV文件?
多API返回CSV合并实现方案
核心思路
- 先将你需要拉取的总时间区间拆分为多个长度≤90天的连续子区间,注意前后区间的日期不要重叠也不要留空
- 逐个请求对应子区间的API接口,读取返回的CSV内容
- 仅保留第一个CSV的表头行,后续所有CSV跳过表头只保留数据行
- 把所有内容拼接后写入同一个CSV文件即可
方案1:Python实现(最通用,支持Windows/Mac/Linux)
需要先安装依赖:pip install requests pandas
替换代码内对应参数后直接运行即可:
import requests import pandas as pd from datetime import datetime, timedelta # 此处替换为你自己的实际参数 PROPERTY_ID = "你的propertyid" API_KEY = "你的keygoeshere" # 总查询起止日期 START_DATE = datetime(2021, 1, 1) END_DATE = datetime(2023, 12, 31) # 输出文件路径 OUTPUT_FILE = "merged_article_data.csv" # 自动拆分最多90天的子区间 date_ranges = [] current_start = START_DATE while current_start < END_DATE: # 取89天留余量,避免刚好90天触发接口限制 current_end = min(current_start + timedelta(days=89), END_DATE) date_ranges.append((current_start.strftime("%Y-%m-%d"), current_end.strftime("%Y-%m-%d"))) current_start = current_end + timedelta(days=1) all_dfs = [] for start, end in date_ranges: # 拼接请求URL url = f"https://www.metricsfornews.com/app/api.php?propertyid={PROPERTY_ID}&apitype=articledata&key={API_KEY}&start_pub_date={start}&end_pub_date={end}&include_metrics=1&format=csv" resp = requests.get(url) # 接口报错时直接终止,方便排查问题 resp.raise_for_status() # 读取CSV内容到数据表 df = pd.read_csv(pd.compat.StringIO(resp.text)) all_dfs.append(df) # 合并所有数据并导出 merged_df = pd.concat(all_dfs, ignore_index=True) merged_df.to_csv(OUTPUT_FILE, index=False, encoding="utf-8-sig") print(f"合并完成,共{len(merged_df)}条数据,已保存到{OUTPUT_FILE}")
如果不想安装pandas,也可以用Python标准库实现:
import requests import csv from io import StringIO from datetime import datetime, timedelta # 同上替换为你的实际参数 PROPERTY_ID = "你的propertyid" API_KEY = "你的keygoeshere" START_DATE = datetime(2021, 1, 1) END_DATE = datetime(2023, 12, 31) OUTPUT_FILE = "merged_article_data.csv" # 时间区间拆分逻辑同上 date_ranges = [] current_start = START_DATE while current_start < END_DATE: current_end = min(current_start + timedelta(days=89), END_DATE) date_ranges.append((current_start.strftime("%Y-%m-%d"), current_end.strftime("%Y-%m-%d"))) current_start = current_end + timedelta(days=1) first_run = True with open(OUTPUT_FILE, "w", newline="", encoding="utf-8-sig") as out_f: writer = csv.writer(out_f) for start, end in date_ranges: url = f"https://www.metricsfornews.com/app/api.php?propertyid={PROPERTY_ID}&apitype=articledata&key={API_KEY}&start_pub_date={start}&end_pub_date={end}&include_metrics=1&format=csv" resp = requests.get(url) resp.raise_for_status() reader = csv.reader(StringIO(resp.text)) if first_run: # 第一次请求保留表头 writer.writerow(next(reader)) first_run = False else: # 后续请求跳过表头 next(reader) # 写入所有数据行 for row in reader: writer.writerow(row)
方案2:Linux/Mac Shell命令行实现(无需额外安装依赖)
替换变量后直接在终端运行即可:
# 替换为你的实际参数 propertyid="你的propertyid" apikey="你的keygoeshere" # 总查询起止日期 start="2021-01-01" end="2021-12-31" output="merged.csv" first=1 current_start="$start" while [ "$(date -d "$current_start" +%s)" -le "$(date -d "$end" +%s)" ]; do current_end=$(date -d "$current_start +89 days" +%Y-%m-%d) if [ "$(date -d "$current_end" +%s)" -gt "$(date -d "$end" +%s)" ]; then current_end="$end" fi # 请求API拉取CSV csv_content=$(curl -s "https://www.metricsfornews.com/app/api.php?propertyid=$propertyid&apitype=articledata&key=$apikey&start_pub_date=$current_start&end_pub_date=$current_end&include_metrics=1&format=csv") if [ $first -eq 1 ]; then # 第一次请求保留表头 echo "$csv_content" > "$output" first=0 else # 后续请求跳过第一行表头 echo "$csv_content" | tail -n +2 >> "$output" fi current_start=$(date -d "$current_end +1 day" +%Y-%m-%d) # 可选:加1秒延时避免触发接口限流 sleep 1 done
注意事项
- 如果接口有频率限制,可在两次请求之间加1-2秒延时,Python代码中加
time.sleep(1)、Shell代码中加sleep 1即可 - 导出的CSV如果用Excel打开乱码,选择utf-8编码打开即可正常显示
- 如果需要导出为Excel格式,Python方案中把最后的
to_csv方法改为to_excel即可,需要额外安装依赖pip install openpyxl
内容的提问来源于stack exchange,提问作者ProjectFreQ
相关产品推荐
相关产品推荐

