我的知识记录

Python读取网页JSON接口数据存CSV教程

用requests请求网页API接口,解析返回的JSON数据,自动提取字段并存成CSV,支持分页、请求头、错误重试,附完整代码。

场景痛点

要从开放API抓一批数据,浏览器里一个接口一个接口点、复制JSON、手动整理成表格,抓50条就手酸。用Python requests发请求,自动翻页、自动解析JSON、自动存CSV,几百上千条几分钟搞定,还能定时跑。

用到的库

pip install requests pandas

完整代码

# 读取网页JSON接口并存CSV
import time
import requests
import pandas as pd

def fetch_api_page(url, params=None, headers=None, timeout=10):
"""
请求单页接口,返回解析后的JSON。
带简单重试,网络抖动不至于直接挂。
"""
default_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
if headers:
default_headers.update(headers)

for attempt in range(3):
try:
resp = requests.get(
url, params=params, headers=default_headers, timeout=timeout
)
resp.raise_for_status()  # 4xx/5xx 抛异常
return resp.json()
except Exception as e:
print(f"  第{attempt+1}次请求失败:{e},2秒后重试")
time.sleep(2)
raise RuntimeError(f"请求失败:{url}")

def fetch_all_pages(base_url, page_size=20):
"""
翻页拉取所有数据。根据实际接口调整参数名和数据路径。
这里假设接口支持 page/page_size 参数,返回 {"data": {"list": [...], "total": n}}
"""
all_items = []
page = 1
while True:
params = {"page": page, "page_size": page_size}
print(f"抓取第 {page} 页...")
result = fetch_api_page(base_url, params=params)

# 根据实际返回结构调整取值路径
data = result.get("data", {})
items = data.get("list", [])
total = data.get("total", 0)

if not items:
break

all_items.extend(items)
print(f"  本页 {len(items)} 条,累计 {len(all_items)}/{total}")

if len(all_items) >= total or len(items) < page_size:
break

page += 1
time.sleep(0.5)  # 礼貌性间隔,别把服务器打挂

return all_items

def save_to_csv(items, output_path):
"""把抓取到的list[dict]存成CSV。"""
if not items:
print("没有数据")
return
df = pd.DataFrame(items)
# 嵌套字段转成JSON字符串
for col in df.columns:
if df[col].apply(lambda x: isinstance(x, (list, dict))).any():
df[col] = df[col].apply(lambda x: pd.io.json.dumps(x, ensure_ascii=False))
df.to_csv(output_path, index=False, encoding="utf-8-sig")
print(f"已保存:{output_path},{len(df)} 行")

def main():
# 换成你要爬的真实接口
api_url = "https://api.example.com/v1/items"
try:
items = fetch_all_pages(api_url, page_size=50)
save_to_csv(items, "api_data.csv")
except Exception as e:
print(f"抓取失败:{e}")

if __name__ == "__main__":
main()

代码讲解

  • requests.get 发GET请求,params 自动拼query string,headers 带UA防反爬。
  • resp.raise_for_status() 遇到4xx/5xx直接抛异常,配合重试循环跑3次。
  • 翻页逻辑:传 page 参数,读返回里的 total,抓够总数或本页为空就停。
  • time.sleep(0.5) 控制请求频率,别被对方封IP。
  • 存CSV前把嵌套字段转JSON字符串,避免pandas报错。

运行结果

控制台逐页打印进度,最后生成 api_data.csv,打开就是表格化的接口数据。实际用的时候把 api_url、返回数据路径、字段名换成你自己的接口。

注意事项

  • 接口要鉴权就把token加到headers里,比如 "Authorization": "Bearer xxx"
  • POST接口把 requests.get 换成 requests.post(url, json=params)
  • 对方有频率限制就把sleep调大,必要时加随机延迟。
  • 抓下来的数据先 print(items[0]) 看一眼结构,再调整提取字段的代码。
  • 遵守目标网站robots协议和数据使用条款,别乱爬。

Python读取网页JSON接口数据存CSV教程

标签:

更新时间:2026-09-14 20:59:45

上一篇:Python JSON批量导出Excel教程:多Sheet或单Sheet

下一篇:Python生成测试数据Faker库实战