真实数据接口可通过network面板识别:响应类型为json/text/plain、url含/api/等语义字段、preview显示结构化数据、initiator为js文件。

怎么看 Network 面板里哪个请求是真实数据接口
网站渲染后看到的内容,往往不是从 index.html 直接来的,而是后续通过 JS 发起的异步请求加载的。打开浏览器开发者工具(F12),切到 Network 面板,刷新页面,关键动作是:先清空列表,再操作页面(比如点“下一页”、输入关键词搜索、滚动触底加载),观察新增的请求。
真实数据接口通常有这些特征:
- 响应类型是
json或text/plain,而不是text/html - 请求 URL 含有明显语义,比如带
/api/、/list、/search、?page=、offset= - 预览(Preview)标签里能看到结构化数据,比如数组套字典、带
data/result字段的 JSON - 发起者(Initiator)列显示是某个 JS 文件,而不是
other或document
为什么用 Python 请求返回 403 或空数据,但浏览器能正常看
因为服务端在检查请求头、Cookie、Referer、甚至 JS 运行时生成的签名参数。直接用 requests.get() 默认只带最简请求头,很容易被识别为爬虫。
对照浏览器发出的成功请求,重点比对以下几项:
-
User-Agent:必须和当前浏览器一致,否则部分站点直接拦截;可从Network → Headers → Request Headers复制整行 -
Cookie:登录态或反爬 token 往往存在这里,尤其含sessionid、acw_sc__、_jsq等字段;需完整复制,注意有效期 -
Referer和Origin:有些接口强制校验来源页,漏掉就会 403 -
X-Requested-With:若浏览器请求带了这个(值通常是XMLHttpRequest),Python 请求也得加上
别手写 Cookie 字符串——用 requests.Session() 自动管理更稳,先访问首页触发 set-cookie,再发接口请求。
怎么发现 JS 动态生成的参数(比如 sign、timestamp、token)
这类参数不会出现在 Network 的请求 URL 或表单中,而是由页面 JS 计算后拼进去的。观察请求 URL 或 Payload 里异常的字段(如 sign=xxx、_t=171xxxxx、token=abc123...),然后在 Sources 面板全局搜索这个字段名。
常见定位方式:
- 在
Network → Headers → Query String Parameters或Request Payload里右键该参数 →Break on attribute modification(需先启用 JS 断点) - 在 Sources 面板按
Ctrl+Shift+F搜索参数名,找到赋值语句,往上追溯函数调用链 - 重点关注
Math.random()、Date.now()、crypto、atob()、btoa()、hmac等关键词,它们常用于构造动态值
一旦定位到生成逻辑,就得用 PyExecJS、execjs 或重写 Python 版本——别试图靠抓包“固定”这个值,它通常随时间或内容变化。
滚动加载/点击加载后没新请求?可能是事件没触发或懒加载未激活
不是所有交互都会立刻发请求。有些页面用 IntersectionObserver 监听元素进入视口才加载,有些按钮点击后要等 JS 初始化完成才绑定事件。
排查步骤:
- 在
Elements面板选中目标按钮或容器 → 右键 →Break on → attribute modifications,看点击后 DOM 是否变化 - 在
Console输入getEventListeners($0)($0 是当前选中元素),查看是否绑定了click或scroll事件 - 手动滚动到底部后,再等 1–2 秒,有时加载是防抖的;或者尝试在 Console 执行
window.scrollTo(0, document.body.scrollHeight)强制触底 - 禁用 JS 后刷新页面,如果内容直接出来了,说明是 SSR + 客户端 hydration,那应该优先找服务端渲染的 HTML 数据源,而不是依赖 JS 请求
真正难的不是找到请求,而是理解它和页面状态、用户行为、JS 执行时序之间的耦合关系。一个没触发的请求,可能卡在三秒后的定时器里,也可能依赖上一个请求返回的 next_cursor。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











