推荐用jsonpath-ng解析深层嵌套json,支持过滤、递归和通配,避免硬编码路径出错;http状态码正常但json解析失败时,先检查response.content和content-type;分页优先提取响应中的next_page_url或cursor;高频请求应使用requests.session()复用连接并显式设置accept头。

遇到嵌套太深的JSON,用jsonpath比层层写response.json()['data']['items'][0]['meta']['tags']靠谱
手动钻取 5 层以上的字典键不仅容易拼错,还让代码脆弱得一碰就崩。比如某电商 API 返回的 response.json() 里,商品数据藏在 ['result']['payload']['list']['products'][2]['attributes']['specs']['detail'] 这种路径下,硬编码访问几乎必然出错。
推荐直接上 jsonpath-ng(注意不是老版 jsonpath):
pip install jsonpath-ng
- 用
$..product[?(@.in_stock == true)]一键捞出所有有货商品,不用管它嵌在哪层 - 支持过滤、通配、递归下降(
..)、数组索引([0]),语法接近 XPath - 返回的是匹配对象列表,空结果不会抛 KeyError,适合不确定结构的响应
- 别用
jsonpath(无-ng后缀),它不支持过滤表达式,遇到?(@.price > 100)直接报错
HTTP 状态码正常但 JSON 解析失败?先检查 response.content 和 response.headers.get('content-type')
常见假象:打印 response.status_code 是 200,调 response.json() 却报 JSONDecodeError: Expecting value。本质是服务器返回了 HTML 错误页(如 403 页面)、重定向跳转响应,或 Content-Type 声明为 text/html 却塞了 JSON 字符串。
- 先执行
print(response.content[:200])看原始字节 —— 如果开头是b'',说明被反爬拦住了 - 检查
response.headers.get('content-type', ''),若含html或为空,别硬调.json() - 某些 API 用
application/json;charset=utf-8,但实际响应体是 GBK 编码,需先response.content.decode('gbk')再json.loads()
带分页的 API,别依赖文档写的 page 参数,优先看响应里的 next_page_url 或 cursor
很多 REST API 的分页机制根本不按套路出牌:参数名可能是 offset/limit、cursor、after,甚至整个翻页 token 藏在响应体某个字段里(比如 response.json()['paging']['cursors']['after'])。硬写死 params={'page': i} 很可能漏数据或重复请求。
- 每次请求后解析响应,提取下一页标识:
next_cursor = data.get('paging', {}).get('next_cursor') - 若存在,作为下次请求的
params或headers(有些用Authorization: Bearer {cursor}) - 留意
cursor是否有时效性(比如 10 分钟过期),避免长时间循环中复用旧值 - 设置最大重试次数和超时,防止因 cursor 失效陷入无限请求
用 requests.Session() 复用连接 + 手动控制 Accept 头,比反复 requests.get() 稳定得多
高频调用 API 时,每次都新建 TCP 连接,既慢又容易触发限流。更隐蔽的问题是:某些 API 对 Accept 头敏感,不显式声明 application/json 可能返回 XML 或 HTML。
- 创建会话对象:
session = requests.Session(),然后统一配置:session.headers.update({'Accept': 'application/json', 'User-Agent': 'Mozilla/5.0'}) - 复用连接池自动管理 keep-alive,吞吐量提升明显
- 为避免 DNS 缓存或连接泄漏,可设
session.mount('https://', requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10)) - 别在循环里反复
requests.get(url)—— 每次都新建 session,DNS 解析和 TLS 握手开销叠加,延迟翻倍
Authorization 头;或者某个字段只在特定查询参数组合下才出现。抓包看真实响应,永远比读文档快。大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










