爬虫不止于抓 HTML 页面——许多网站的数据以 JSON 格式通过接口暴露直接请求接口比解析 HTML 更高效。本文讲清楚如何用开发者工具定位接口、如何处理 JSON 响应以及常见的接口反爬应对思路。目录两种爬取思路HTML 解析 vs 接口请求Chrome 开发者工具快速上手JSON 数据格式基础用 Python 请求并解析 JSON 接口访问嵌套 JSON 数据接口反爬常见原因与排查结合重试机制的完整示例①两种爬取思路爬虫拿数据本质上有两条路一是下载完整 HTML 页面再用解析库提取目标内容二是直接请求网站的数据接口API拿到结构化的 JSON/XML 数据。方式 AGET 整个 HTML→BeautifulSoup / XPath 解析→提取目标字段方式 BGET 数据接口→json.loads() 直接转为字典→按键访问方式 B 更轻量无需解析 DOM数据结构清晰抗页面改版能力强。手机版 H5 页面、新闻聚合类网站几乎都走接口是找 API 的最佳入口。②Chrome 开发者工具快速上手按 F12 或右键检查打开开发者工具定位数据接口主要用以下四个面板Elements查看页面 HTML 结构用于确认目标内容在 DOM 中的位置和选择器Network核心面板。记录所有网络请求筛选 Fetch/XHR 可快速找到 JSON 接口Response 标签查看原始返回数据Console执行 JS 语句可用于测试选择器、查看页面变量Sources查看页面加载的所有静态资源和 JS 文件用于分析加密参数的生成逻辑找接口的标准流程Network → 刷新页面 → 筛选 Fetch/XHR → 逐条查看 Response找到返回目标数据的那条请求 → 复制其 Request URL → 在爬虫中直接请求该 URL。③JSON 数据格式基础JSONJavaScript Object Notation是目前最主流的接口数据格式结构与 Python 字典/列表高度对应上手成本很低。{code:200,msg:success,data:{mydata:{name:张三,age:21,tel:1539324****}}}JSON类型 { “key”: value } 对象 → Python dict用键名访问JSON类型 [ item1, item2 ] 数组 → Python list用下标访问JSON类型字符串 / 123 / true → Python str / int / bool直接使用注意 null → None JSON null 对应 Python None不是字符串 “null”④用 Python 请求并解析 JSONrequests 提供了两种解析 JSON 响应的方式推荐使用内置的 .json() 方法省去手动解码和 json.loads() 的步骤。importrequestsimportjson urlhttps://api.example.com/dataheaders{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120,Referer:https://www.example.com/# 部分接口校验来源页面}resprequests.get(url,headersheaders,timeout5)# 方式一手动解码 json.loads便于排查编码问题contentresp.content.decode(utf-8)print(type(content))# class strdatajson.loads(content)print(type(data))# class dict# 方式二直接调用 resp.json()推荐内部自动处理编码dataresp.json()print(type(data))# class dict两种方式的核心差异json.loads() 接收字符串便于在解析前打印原始内容调试resp.json() 更简洁会根据响应头的 Content-Type 自动选择编码生产代码推荐用后者。⑤访问嵌套 JSON 数据JSON 解析后是普通的 Python 字典/列表支持链式下标访问也应做好键不存在时的容错处理。importrequests resprequests.get(https://api.example.com/user,timeout5)dataresp.json()# 示例响应{code:200,data:{mydata:{name:张三,age:21}}}# 逐层访问嵌套字段print(data[code])# 200print(data[data][mydata][name])# 张三# 推荐用 .get() 避免 KeyError并提供默认值namedata.get(data,{}).get(mydata,{}).get(name,未知)print(name)# 张三键不存在时返回未知而不是报错# 如果 data 字段是列表用下标取元素# items data[data][list]# for item in items:# print(item[title])⑥接口反爬常见原因与排查直接复制接口 URL 请求时有时会拿到错误响应而非预期数据。常见原因和对应排查方向缺少Referer 服务器校验请求来源页面。在 headers 中加入 “Referer”: “来源页URL”缺少Token 接口要求在 URL 参数或 headers 中携带动态 token。在 Network 面板中检查原始请求的参数Cookie失效 接口需要登录态。用 Session 模拟登录或从浏览器复制有效 CookieIP频率限制 短时间大量请求被封。配合代理池和随机延时降低访问频率排查时优先对比浏览器原始请求和爬虫请求的 headers 差异在 Network → 目标请求 → Headers 面板查看。缺少的字段逐一补上通常能定位问题。⑦结合重试机制的完整示例将 JSON 接口请求与上一篇介绍的重试机制结合构建一个鲁棒的接口爬取函数importrequestsfromretryingimportretryretry(stop_max_attempt_number3,wait_fixed2000)deffetch_json(url,extra_headersNone):headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120,Accept:application/json, text/plain, */*,}ifextra_headers:headers.update(extra_headers)resprequests.get(url,headersheaders,timeout5)resp.raise_for_status()# 4xx/5xx 触发重试dataresp.json()# 业务层校验接口返回 code 非成功时同样重试ifdata.get(code)!200:raiseValueError(f接口错误{data.get(msg)})returndatadefmain():api_urlhttps://api.example.com/userextra{Referer:https://www.example.com/}try:resultfetch_json(api_url,extra)nameresult.get(data,{}).get(mydata,{}).get(name)print(f姓名{name})exceptExceptionase:print(f请求最终失败{e})if__name____main__:main()注意业务层和 HTTP 层的双重校验raise_for_status() 处理 HTTP 状态码异常而业务 code 校验如 code ! 200处理接口自定义的错误码——两者缺一不可。✓小结定位接口 Network → XHR解析JSON resp.json()安全取值 .get() 链式接口反爬 补齐Headers容错 重试双重校验直接请求 JSON 接口是比解析 HTML 更高效的爬取方式适用于大多数现代 Web 应用。掌握开发者工具 Network 面板的使用、JSON 结构的访问方式以及接口反爬的排查思路是爬虫进阶的核心技能。下一篇将介绍 BeautifulSoup 对 HTML 内容的结构化解析。