表单提交前必须确认的三个关键点:一是提取隐藏字段(如csrf_token)并动态填充;二是补全相对路径的action为绝对url;三是严格匹配enctype类型选用data/json/files参数。

表单提交前必须确认的三个关键点
直接用 requests.post() 硬填参数大概率失败——网页表单往往依赖 JavaScript 动态生成字段、隐藏 token 或前端校验。先检查页面源码里有没有 input[type="hidden"],特别是 csrf_token、_token、__VIEWSTATE 这类字段;再看表单 action 是绝对 URL 还是相对路径;最后确认提交方式是 POST 还是带 GET 参数的跳转(比如百度搜索)。
处理动态生成表单的两种务实方案
如果表单字段由 JS 渲染(比如 Vue/React 页面),requests 拿不到真实值,得换工具:
- 优先用
selenium启动无头浏览器,等页面加载完再取driver.find_element(By.NAME, "q").send_keys("keyword"),适合字段多、逻辑复杂、有验证码的场景 - 若只是少量 JS 计算(比如时间戳拼接、简单哈希),抓包分析后用
execjs或手写 Python 逻辑还原,比跑浏览器快得多 - 注意:selenium 的
driver.page_source返回的是渲染后 HTML,而driver.current_url才是真实跳转地址,别混淆
POST 提交时 headers 和 data 的常见错配
表单提交不是把字段塞进 data 就完事,Content-Type 决定后端怎么解析:
- 传统表单(
enctype="application/x-www-form-urlencoded"):用data={...},requests 自动设 header - JSON 接口(常见于现代 SPA):必须手动加
headers={"Content-Type": "application/json"},且json=...参数传字典,不是data - 文件上传或含二进制字段:改用
files={"file": open("a.jpg", "rb")},此时data会自动合并为 multipart/form-data - 漏掉
User-Agent会导致 403,但加了也未必够——有些站点校验Referer或Cookie是否匹配上一步请求
绕过反爬的关键动作不是“伪装”,而是“复现”
很多表单提交失败,根本原因不是被识别为爬虫,而是请求链路不完整:
- 先
GET表单页,提取隐藏字段 + 设置session.cookies,再用同一session提交POST - 检查是否有前置请求(比如先调用
/api/token拿临时 key,再塞进表单字段) - 响应状态码是 200 不代表成功——要看返回 HTML 里有没有
"验证失败"、"请重试"或跳转到错误页,而不是只判断 status_code - 别省略
time.sleep(1),高频提交容易触发风控,哪怕只是本地测试
真正卡住的地方,往往是某个不起眼的 hidden 字段值过期了,或者 session ID 在两次请求间被服务端重置。盯着浏览器开发者工具的 Network 面板,逐个比对请求头、载荷、cookie,比猜更可靠。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











