关于requests的urlencode问题

众所周知,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)

猜你喜欢

转载自www.cnblogs.com/b1ing/p/12142766.html