直接抓包找Ajax接口比用Selenium更可靠:因动态数据由JS通过XHR/Fetch异步加载,requests直取HTML仅得空壳,Selenium虽能渲染但慢、资源高、易被反爬;最优解是用DevTools筛选XHR/Fetch定位真实接口,再用requests模拟并注意请求头、参数构造及加密识别。

直接抓包找Ajax接口比用Selenium更可靠
动态网页的数据往往不在HTML源码里,而是由JavaScript发起Ajax请求后注入的。这时候用 requests 直接请求页面URL,拿到的只是空壳HTML;而用 Selenium 模拟浏览器虽然能渲染,但慢、不稳定、容易被反爬识别。最稳的路径是:打开浏览器开发者工具 → 切到 Network → 刷新页面 → 筛选 XHR 或 Fetch → 找到返回真实数据的请求。
常见踩坑点:
- 漏掉请求头(尤其是
Referer、User-Agent、Cookie),导致403或空响应 - 误把带分页参数的接口当静态接口,实际需要构造
page=2、offset=20等动态参数 - 没注意接口是否加密或带签名(比如参数含
sign、timestamp),直接复用会返回错误码{"code":1001,"msg":"invalid sign"}
用requests模拟Ajax请求的关键三步
找到接口URL和请求方式(GET/POST)后,重点不是“怎么发”,而是“怎么发得像人”。
实操建议:
立即学习“Python免费学习笔记(深入)”;
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 从浏览器Network面板右键对应请求 → “Copy as cURL”,再用在线工具(如 curlconverter.com)转成
requests代码,能自动带上所有 headers 和 data - 如果接口是POST且传JSON,确保用
json=...参数(而非data=...),否则服务端可能解析失败 - 务必检查响应类型:
response.headers.get("content-type")是application/json才能直接response.json();如果是text/plain,可能得先response.text再手动处理
遇到参数加密时先别硬刚JS,试试这几个信号
有些网站对关键参数(如 id、token)做前端加密,但并非所有都强依赖JS执行。先观察再动手:
- 改一个参数值(比如把
id=123改成id=124),看接口是否仍返回有效数据 —— 如果可以,说明没加密或加密可绕过 - 在Network中点击该请求 → Headers → 查看
Query String Parameters或Request Payload,对比多次请求,看哪些字段在变(如ts、sign、sig),变的往往是加密相关 - 搜索页面源码里的
fetch(或axios.调用,定位JS逻辑;优先查webpack打包后的文件,关键词搜md5、hmac、base64、crypto
真要还原加密逻辑,用 execjs 运行JS片段比重写Python更快,但注意Node.js版本兼容性问题 —— 某些新API(如 TextEncoder)在旧版execjs里不支持。
分页和滚动加载的数据怎么拿全
Ajax接口常通过参数控制分页,但参数名五花八门:page、pageNum、offset、limit、start 都有可能。关键是先试出规律,再批量请求。
操作要点:
- 手动改两次参数(如
offset=0→offset=20),对比返回数据量和内容,确认是否线性分页 - 留意响应体里是否有
total、count、has_more字段,这是判断是否还有下一页的依据 - 避免高频请求:加
time.sleep(0.5),或用requests.Session()复用连接减少开销 - 别忽略状态码:有些接口成功返回200但业务态异常,比如
{"code":20001,"msg":"no more data"},需在代码里检查resp.json().get("code")
滚动加载本质也是分页,只是触发时机由JS监听scroll事件控制,背后调用的仍是同一个Ajax接口,参数逻辑一致。

















