在编写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