瀑布流页面的ajax请求藏在浏览器network面板的xhr/fetch记录中,需滚动触发后筛选200状态请求,关注url参数、headers及响应格式。

瀑布流页面的Ajax请求藏在哪
瀑布流内容不靠传统分页,而是滚动到底部时触发 Ajax 请求加载新数据。直接看网页源码找不到后续内容,因为那些 HTML 是 JS 动态插入的。关键不是找“下一页链接”,而是抓取浏览器 Network 面板里 XHR 或 Fetch 类型的请求——尤其是滚动后新增的那几条。
常见错误是只盯着 document.querySelectorAll 或 BeautifulSoup 解析初始 HTML,结果永远只有首屏 20 条。
- 打开浏览器开发者工具(F12),切到 Network 标签,清空记录
- 手动滚动到底部,等新内容出现,筛选出状态码为
200的XHR请求 - 重点看请求 URL、
Headers里的Referer和User-Agent、Query String Parameters或Request Payload - 如果请求是
POST且带JSON体,右键 Copy → Copy as cURL,再用在线工具转成 Pythonrequests调用更稳
识别翻页参数的常见规律
多数瀑布流接口会把翻页信息编码在参数里,但格式五花八门:可能是递增的 offset,也可能是上一页最后一条的 id 或 cursor,甚至带时间戳或 base64 编码的游标。不能默认 page=2 就是第二页。
对比两次请求(比如第 1 次和第 2 次加载)的参数差异,比对最有效:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
-
offset=0→offset=20:说明每页 20 条,下一次改offset=40 -
max_id=123456789→max_id=987654321:说明这是上一页末尾 ID,下次请求必须填这个值,且注意方向(有些是min_id或since_id) -
cursor=eyJsYXN0X2lkIjoiMTIzNDU2IiwidGltZSI6MTcxMjM0NTY3OH0=:base64 编码,base64.b64decode()看清结构,别硬猜 - 参数名含
_t或ts:大概率是时间戳,需实时生成,写死会失败
绕过反爬:Headers 和会话状态不能省
这类接口通常校验 Referer、Cookie、X-Requested-With,甚至要求带有效的 sessionid。用 requests.get(url) 光填 URL 几乎必返回 403 或空数据。
- 复制浏览器请求的完整
Headers(去掉Host、Content-Length等自动头),用字典传给requests - 必须复用
requests.Session(),否则Cookie不延续,第二页就失效 - 如果接口返回
{"code":10001,"msg":"invalid csrf token"},说明需要先 GET 一次首页提取csrf_token,再塞进后续请求头或参数 - 某些站点会校验
User-Agent是否匹配真实浏览器,用太老或太怪的 UA(如python-requests/2.31)会被拦截
解析响应数据:别假设返回 HTML
瀑布流接口十有八九返回 JSON,不是 HTML 片段。用 response.text 直接丢给 BeautifulSoup 会报错或解析失败。
- 先打印
response.headers.get("content-type"),确认是application/json还是text/html - 如果是 JSON,用
response.json()解包,再查data、list、items等常见字段名 - 如果返回的是 HTML 字符串(如
{"html": "<div class='..."}</code'>),再用 <code>BeautifulSoup(response.json()["html"], "lxml") - 注意分页字段可能在响应顶层(
has_more: true)、或嵌套在meta里,没这个字段就只能靠尝试:当某次请求返回空数组或count==0,就停
真正难的不是发请求,而是每次网站改版都可能让 cursor 变结构、加签名、换域名前缀。留个日志记下每次成功请求的完整 URL 和响应片段,比临时调试快得多。










