post 爬取数据 url headers
POST请求里,数据最容易被忽视却又最致命的数据就是headers。你写对了url,数据填对了data,数据可服务器照样甩给你一个403或415——八成是数据headers没伺候到位。
我调接口踩过最大的数据坑,是数据某电商平台的登录接口。data部分明明照着文档填得一字不差,数据可那边就是数据不认账,返回的数据JSON永远是"invalid request"。后来抓包一看,数据人家要求的数据是Content-Type: application/json;charset=UTF-8,而我在代码里只写了application/json。数据就少了那半截字符集声明,数据整个请求直接报废。数据所以别嫌麻烦,headers里每个键值对都可能是服务器设的暗号。
再说url。POST的url不像GET那样需要把参数串在问号后面,但路径本身也有讲究。同一个接口,/api/v1/user/login和/api/v2/user/login可能走的是完全不同的逻辑。更坑的是有些后端会把版本号藏在headers里而不是url上,比如X-API-Version: 2。你拿着旧url硬怼,返回的要么是废弃字段,要么直接404。
实际写代码时,我习惯先用Postman或curl把请求调通,再复制成代码。这样能确保headers里的每个细节都原样带过去。比如有些接口会校验User-Agent,你默认的Python-requests标识会被反爬策略拦下来。这时候把浏览器的UA字符串粘过去,问题立马解决。还有Referer字段,某些服务端会检查请求来源,少了它直接拒绝响应。
data的格式也跟headers强绑定。你声明了Content-Type: application/x-www-form-urlencoded,那data就得是key1=val1&key2=val2这种字符串;要是声明了multipart/form-data,那就得用文件上传的格式。我见过有人用requests的json参数发送dict,却忘了设置对应的Content-Type,结果服务器把JSON当表单解析,所有嵌套结构全变成字符串——那种调试过程简直折磨人。
有一回帮朋友修爬虫,他抓一个论坛的发帖接口,数据总是提交不上去。我看了半天代码,发现他漏了X-CSRF-Token这个header。这种token通常藏在页面的meta标签或cookie里,得先用GET请求拿到再拼到POST的headers中。没有它,服务器就认为你是非法请求,直接拒绝。所以headers不只是静态的,有些需要动态获取,得在代码里先抓再填。
最后说个细节:headers的大小写其实不敏感,但值里别带多余空格。有些库会自动帮你整理,有些则原样发送。你要是手滑在冒号后面多敲了个空格,某些严格的服务器就判你格式错误。这种bug最难找,因为肉眼根本看不出来。
总结下来就一句话——url决定你去哪,data决定你带什么,headers决定你像不像个正经客户端。三者缺一不可,但headers往往是那个最容易被忽略、却能让你卡壳最久的变量。下次再遇到POST请求失败,别急着改data,先检查headers是不是漏了什么。









