真正ajax请求需筛选fetch/xmlhttprequest发起、响应为json且url含/api/等语义词的请求,优先查看size大、状态200的xhr,结合json/api过滤及referer校验;带sign/t参数需逆向js生成逻辑并用python复现。

怎么看Network里真正的AJAX请求
不是所有带 XHR 标签的请求都是你要的数据源,很多是埋点、监控或心跳包。重点盯住 fetch 或 XMLHttpRequest 发起的、响应体为 JSON 的请求,且 URL 路径含语义关键词(如 /api/、/list、/search)。
操作时打开浏览器控制台 → Network → 切到 XHR → 刷新页面或触发目标动作(比如下拉加载、点击“查看更多”),然后按 Size 列倒序,优先看返回内容长、状态码为 200 的请求。右键 → “Open in new tab” 可直接验证是否返回结构化数据。
- 过滤技巧:在 Network 面板顶部输入框填
json或api,能快速收窄范围 - 注意请求方法:多数是
GET,但翻页/搜索常为POST,这时要关注Request Payload里的参数格式 - 有些接口会校验
Referer或User-Agent,直接访问可能返回403或空数据
怎么处理带签名(sign)或时间戳(t)的接口
这类参数通常由前端 JS 动态生成,常见于电商、新闻类站点。不能靠静态分析 URL 拼接,必须定位生成逻辑。
在 Sources 面板中全局搜索关键词:sign=、t=、md5(、hexDigest、crypto。找到调用处后,把关键 JS 函数复制出来,在本地用 Python 复现(例如用 hashlib.md5() + 字符串拼接)。
- 常见组合:对请求参数字典按 key 排序后拼成字符串,再加固定 salt,最后取 md5 前 16 位或全 32 位
- 时间戳
t通常是int(time.time() * 1000),但有些站点要求和服务端时间误差 - 别硬猜——用断点调试(Debugger)停在 sign 计算行,查看各变量实际值,比读混淆 JS 高效得多
为什么用 requests 能通但用 Scrapy 抓不到数据
Scrapy 默认不执行 JS,而某些 AJAX 请求的 URL 或参数是在 JS 运行后才构造出来的(比如从 window.__INITIAL_STATE__ 中取 token)。requests 是纯 HTTP 客户端,只要你知道最终 URL 和 headers 就能发;Scrapy 的 start_urls 若写死静态地址,就绕不过这层动态生成。
- 解决方案一:放弃 Scrapy,改用
requests + BeautifulSoup配合手动构造请求(适合接口稳定、逻辑不复杂) - 解决方案二:在 Scrapy 中集成
scrapy-splash或scrapy-playwright,但会显著拖慢爬取速度 - 检查 response.text 是否包含
"window.__INITIAL_STATE__"或类似 script 标签——如果有,说明真实数据藏在 HTML 里,根本不用抓 AJAX
Cookie 和登录态怎么同步到 Python 请求里
浏览器里能拿到数据,Python 里 401,大概率是没传对 Cookie 或缺失某个关键 header(比如 X-Token)。不要直接复制浏览器 Application → Cookies 里的全部字段,只取服务端真正校验的那几个。
在 Network 中点开任意一个成功请求 → Headers → 找 Cookie: 行,整段复制;同时留意是否有 X-Auth-Token:、Authorization: 等自定义头。把这些原样塞进 requests.get(url, headers=headers, cookies=cookies)。
- Cookie 值里含
Path=、Domain=的部分不用管,requests不认这些属性 - 如果接口要求登录态且有效期短,得先模拟登录流程(POST 账号密码 → 提取
Set-Cookie→ 再带 Cookie 请求目标接口) - 用
httpx替代requests时注意:它默认不自动处理Set-Cookie,需显式传httpx.Cookies()
真实场景里,最耗时间的往往不是写代码,而是确认哪个请求真的返回你要的字段、以及那个字段到底受几个参数联动影响。接口文档缺失时,多看 Response Preview 的 JSON 结构,比反复试 header 更可靠。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











