必须先GET表单页获取隐藏字段、cookies和headers,再构造POST请求:提取csrf_token等hidden输入项,携带原cookies,设置User-Agent和Referer,JS渲染表单需用Playwright/Selenium执行。

POST请求里表单数据怎么构造才不被服务器拒绝
直接用 requests.post() 发空数据或乱填字段,大概率返回 400、403 或跳转到首页——因为多数搜索表单依赖 csrf_token、__VIEWSTATE 等隐藏字段,或校验 User-Agent、Referer。必须先 GET 一次页面,解析出所有必需的隐藏输入项。
- 用
requests.get()获取表单页 HTML,再用BeautifulSoup提取input[type="hidden"]的name和value - 把用户要搜的关键词塞进对应
name(比如q、keyword、searchText),其他隐藏字段原样带上 - 务必复用 GET 响应里的
cookies,传给 POST 请求,否则 session 失效 - 设置
headers={'User-Agent': 'Mozilla/5.0...', 'Referer': url},Referer 必须是刚才 GET 的 URL
遇到 JavaScript 渲染的表单怎么办
如果 requests 拿到的 HTML 里没有 form 标签,或关键字段是空的(比如 value="" 但实际提交时有值),说明表单由 JS 动态生成或 token 是运行时计算的。这时候 requests 不够用。
- 优先检查浏览器开发者工具的 Network 面板:手动提交一次,看真实发出的 POST 请求里
Form Data有哪些字段,尤其是带随机字符串或时间戳的字段 - 若字段含
Math.random()、Date.now()或调用加密函数(如md5()、HMAC),就得换Playwright或Selenium执行 JS - 简单场景可尝试用
execjs运行提取出的 JS 片段,但兼容性差;更稳的方式是用playwright.sync_api.sync_playwright().start()启动无头浏览器,填表后page.request.post()
提交后拿不到结果页面?检查响应状态和重定向
POST 成功不代表拿到目标数据。常见情况是服务器返回 302 重定向,或者返回 JSON 而非 HTML,也可能因反爬触发验证码跳转。
- 打印
response.status_code和response.headers.get('Location'),确认是否被重定向;requests.post(..., allow_redirects=False)可拦截跳转查原因 - 用
response.text[:500]快速看前 500 字符,搜"captcha"、"verify"、"请稍后重试"等关键词 - 若响应是 JSON(
response.headers.get('Content-Type')含application/json),直接response.json()解析,别用 BeautifulSoup - 有些站会返回空 HTML 加一段 JS 跳转,这时得解析 JS 中的
window.location.href = "...";
绕过基础反爬时 headers 和 cookies 的最小必要集
不是 header 越多越安全,冗余字段反而暴露自动化特征。重点维持「看起来像一次连贯的浏览器操作」。
立即学习“Python免费学习笔记(深入)”;
- 必须带的:
Cookie(从 GET 响应复制)、User-Agent(固定一个主流版本即可,别用默认的 python-requests)、Referer(GET 的 URL) - 谨慎加的:
Accept-Encoding(设为gzip, deflate可能触发额外校验)、X-Requested-With(加了可能被识别为 AJAX 请求而拒收) - 绝对不要硬编码
Cookie字符串——每次 GET 后用response.cookies对象传入 POST,避免过期或 domain 不匹配
真实环境里,token 有效期、IP 请求频率、鼠标移动轨迹这些根本没法用 requests 模拟。一旦发现返回内容异常或延迟突增,别硬刚,先确认是不是触发了行为式风控。


















