requests.post发送表单数据时应按场景选参数:普通表单用data传字典,API用json,上传文件用files;需动态提取hidden字段和CSRF token,复用Session对象维持状态,并严格对照浏览器抓包的字段名与格式。

requests.post 发送表单数据时,data 和 json 参数别混用
很多人一上来就写 requests.post(url, json={...}),结果服务器收不到字段——因为多数网页表单提交的是 application/x-www-form-urlencoded 编码,不是 JSON。
关键看目标页面的 标签里有没有 enctype="multipart/form-data" 或 enctype="text/plain",默认就是 urlencoded。
- 普通登录/搜索表单 → 用
data参数传字典,requests自动编码成键值对 - API 接口明确要求 JSON → 才用
json参数(它会自动设Content-Type: application/json) - 上传文件 → 必须用
files参数,且data仍可同时传其他字段
必须补全 hidden 字段和 CSRF token
直接抓包看请求,常会漏掉隐藏字段,比如 。不带它,服务端大概率返回 403 Forbidden 或跳转到错误页。
别靠“记得填”来维护这些值——每次请求前得动态提取:
- 用
BeautifulSoup解析 HTML,查name属性匹配的 - 或正则快速取:
re.search(r'name="csrf_token".*?value="(.*?)"', html_text) - 注意有些 token 存在响应头
X-CSRF-Token里,得从response.headers拿
Cookie 和 Session 状态没接续,导致登录失效
用 requests.get() 访问登录页拿到初始 Cookie 后,后续 post 必须复用同一个 Session 对象,否则服务器认不出你是刚提交过表单的人。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
常见错误是:登录用 requests.post(),之后访问个人页又换回 requests.get() —— 这俩请求完全无关。
- 统一用
s = requests.Session(),所有请求都调s.get()/s.post() - 检查
s.cookies是否包含sessionid、PHPSESSID等标识符 - 某些网站校验 User-Agent 或 Referer,
s.headers.update(...)提前设好更稳
表单字段名拼错、值类型不对,服务器静默忽略
后端通常只校验字段存在性和格式,填了错名(比如把 user_name 写成 username)或该传字符串却传了整数,可能返回成功状态码但实际没生效。
最可靠的方式是:打开浏览器开发者工具 → Network → 找到真实提交的 POST 请求 → 点开 Headers 和 Payload 逐项对照。
- 字段名严格区分大小写和下划线/驼峰,复制粘贴最安全
- 日期、数字类字段,按网页实际提交的格式传(如
"2024-05-20"而非datetime.date.today()) - 勾选框/多选下拉框,未选中时不传该字段;选中多个时,传列表:
{"hobby": ["reading", "coding"]}
事情说清了就结束。真正卡住的往往不是语法,而是你没意识到那个 hidden 字段每分钟都在变,或者 Session 对象根本没贯穿全程。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










