基于 Python 的公开接口数据本地化采集实践
在 Web 开发中,有时我们需要将在线资源迁移到本地以便离线浏览或二次分析。本文演示如何利用 Python 快速抓取公开接口的元数据,并将封面图链接整理为本地可访问的格式。
核心思路
- 分析列表接口:通过浏览器 DevTools 筛选 XHR 请求,定位真实 API URL。通常返回 JSON 结构,包含分页信息和数据列表。
- 解析单条记录:提取标题、作者、封面图等关键字段,无需进入详情页即可获取所需元数据。
- 限速与重试:遵守站点频率限制,使用随机休眠和异常重试机制,避免触发 IP 封禁。
环境准备
确保 Python 版本 >= 3.7,并安装以下依赖:
pip install requests pandas tenacity fake-useragent
代码实现
以下是一个完整的示例脚本 save_meta.py,展示了如何安全地抓取数据并保存为 CSV 文件。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
抓取公开主题合集元信息,仅采集 title/author/coverUrl 三字段。
仅供学习,请遵守平台 robots.txt 与相关法律法规。
"""
import csv, time, random, requests
from tenacity import retry, stop_after_attempt, wait_fixed
from fake_useragent import UserAgent
BASE_URL = "https://example.com/api/v2/theme/list"
CSV_FILE = "meta_data.csv"
PAGE_SIZE = 20
MAX_PAGE = 50 # 按需调整,0 表示抓全量
SLEEP_RANGE = (1, 2) # 秒,随机休眠
ua = UserAgent()
session = requests.Session()
session.headers.update({"Referer": "https://example.com/"})
@retry(stop=stop_after_attempt(3), wait=wait_fixed(10))
def fetch_one_page(page: int):
session.headers.update({"User-Agent": ua.random})
params = {"page": page, : PAGE_SIZE}
resp = session.get(BASE_URL, params=params, timeout=)
resp.status_code == :
Exception()
resp.raise_for_status()
resp.json()
():
writer =
p (, MAX_PAGE + ):
()
js = fetch_one_page(p)
rows = [{: item[], : item[], : item[]}
item js[][]]
writer:
writer = csv.DictWriter((CSV_FILE, , newline=, encoding=),
fieldnames=[, , ])
writer.writeheader()
writer.writerows(rows)
js[][] <= p * PAGE_SIZE:
time.sleep(random.uniform(*SLEEP_RANGE))
()
__name__ == :
main()


