在编写Python爬虫时遇到405错误,原因是请求头限制要求正文为JSON格式,而非使用data参数。params用于URL查询字符串,data用于form-urlencoded提交,而json则用于发送application/json格式的数据。
最近审批太多,需要手动上传,写了个爬虫进行自动上传审批,报错405,原来的代码是这样的
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36',
'Cookie': Cookie,
'Referer': 'http://132.xxx.xx.xx:xxxx/xxxx.html?time={0}'.format(
round(time.time() * 1000)),
'X-Requested-With': 'XMLHttpRequest',
}
# 提交审批
def postApply(post_data):
res = requests.post(
url=ADDR_ADD_URL,
headers=headers,
data=post_data,
timeout=3,
allow_redirects=True
)
return res.status_code
分析错误原因为请求头限制'Accept': 'application/json, text/javascript, */*; q=0.01',即请求正文只能说json形式,这里却使用了data参数!那么params、data、json三个参数有什么区别呢:
params:会被加到url上去,成为url的一部分,是用来发送查询字符串的,我们是看得到的
data:它是用来发送正文的,表示使用application/from-urlencode方式提交请求,接收方body的值会是x=1&y=2这种
json:它也是用来发送正文的,表示使用application/json方式提交请求,接收方body值为json