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