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协议和数据使用条款,别乱爬。

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