众所周知,requests会对请求自动地进行urlencode,但这个自动进行的urlencode其实有很多不尽人意的地方:
1.有时候,我们的data是已经urlencode过了的data,尽管我们不希望它进行urlencode,但它仍然会再urlencode一次,导致data面目全非;
2.有时候,我们虽然希望urlencode但对编码的字符集有要求,但它却无法做到,而且会用默认的urlencode,使得data换了面貌。
requests中urlencode的大概规则:
对于get请求,requests会自动判断参数是否已经进行过urlencode
对于post请求,如果data为字典形式,则会自动强制进行urlencode(不管参数是否已经经过urlencode)如果data为字符串形式,则会自动判断参数是否经过urlencode,但如果要这样使用的话则需要加上header{‘Content-Type‘: ‘application/x-www-form-urlencoded‘}
所以对于问题一:
我们只需要在使用post请求时,把字典形式的参数转化成字符串并加上headers就可以解决了
headers={‘Content-Type‘: ‘application/x-www-form-urlencoded‘}
‘‘‘ data={‘a‘:‘%E5%BE%B7%E7%8E%9B%E8%A5%BF%E4%BA%9A‘,‘b‘:‘123‘} => data="a=%E5%BE%B7%E7%8E%9B%E8%A5%BF%E4%BA%9A&b=123" ‘‘‘
而对于问题二:
则需要先把data转化为所需字符编码的urlencode再加上headers即可
from urllib.parse import urlencode import requests
headers={‘Content-Type‘: ‘application/x-www-form-urlencoded‘}
data={‘a‘:‘德玛西亚‘,‘b‘:‘132‘}
data=urlencode(data,encoding=‘gb2312‘)
r=requests.post(url,headers=headers,data=data)
原文:https://www.cnblogs.com/b1ing/p/12142766.html