您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)如何解決Python requests庫編碼socks5代理的問題,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
編碼問題
response = requests.get(URL, params=params, headers=headers, timeout=10) print 'self.encoding',response.encoding output: self.encoding ISO-8859-1
查了一些相關(guān)的資料,看了下requests的源碼,只有在服務(wù)器響應(yīng)的頭部包含有Content-Type,且里面有charset信息,requests能夠正確識(shí)別,否則就會(huì)使用默認(rèn)的 ISO-8859-1編碼。github中也有討論這個(gè)問題,但requests的作者們說是根據(jù)rfc來的.
在上述代碼中,response.text 是requests庫返回響應(yīng)的Unicode編碼內(nèi)容
這樣,當(dāng)我們?nèi)カ@取一些中文網(wǎng)頁的響應(yīng)內(nèi)容時(shí),且其響應(yīng)頭部沒有charset信息,則response.text的編碼就會(huì)有問題(requests的json()方法也受這個(gè)編碼影響)
比如,我爬取百度的網(wǎng)頁的時(shí)候,其中文是utf-8編碼的
如下python2.7代碼
In [14]: a = '約' #utf-8編碼 In [15]: a Out[15]: '\xe7\xba\xa6' In [22]: b=a.decode('ISO-8859-1')#response.text 認(rèn)為響應(yīng)內(nèi)容是ISO-8859-1編碼,將其decode為Unicode In [23]: b Out[23]: u'\xe7\xba\xa6' In [26]: c=b.encode('utf8')#如果我們沒有注意ISO-8859-1,直接以u(píng)tf8對(duì)其進(jìn)行編碼 In [27]: c Out[27]: '\xc3\xa7\xc2\xba\xc2\xa6'#那么encode得到的utf-8,在顯示器上顯示的就是亂碼,因?yàn)?#39;約'的utf-8編碼是'\xe7\xba\xa6'
解決方法1: 用response.content ,response.content in bytes,所以用content可以自己決定對(duì)其的編碼
解決方法2: 獲得請(qǐng)求后使用 response.encoding = ‘utf-8'
解決方法3: 利用requests庫里根據(jù)獲得響應(yīng)內(nèi)容來判斷編碼的函數(shù),參考文獻(xiàn)里有講到
python2的編碼還是很亂的 str可以是各種編碼,python3統(tǒng)一str為Unicode, byte可以是各種編碼
python2中encode后是str類型,decode后是Unicode類型,python3中encode后是byte類型,decode后是str類型(Unicode編碼)
用python3吧,下面是python3的代碼
In [13]: a = '約' #Unicode In [14]: type(a) Out[14]: str In [15]: b=a.encode('utf8') In [16]: b Out[16]: b'\xe7\xba\xa6' In [17]: type(b) Out[17]: bytes In [27]: b'\xe7\xba\xa623,000'.decode('ISO-8859-1') Out[27]: '约23,000' In [28]: type(b'\xe7\xba\xa623,000'.decode('ISO-8859-1')) Out[28]: str In [29]: b'\xe7\xba\xa623,000'.decode('utf8') Out[29]: '約23,000'
socks5代理問題
現(xiàn)在的requests2.13.0的socks5代理我在使用的時(shí)候會(huì)出現(xiàn)問題,
我用的代理是shadowsocks,比如我想要訪問https://www.facebook.com 在向本地127.0.0.1:1080端口發(fā)送socks5請(qǐng)求時(shí),我發(fā)現(xiàn)shadowsocks在向一個(gè)IP地址連接,連接不上,我用chrome連接Facebook的時(shí)候,我發(fā)現(xiàn)shadowsocks是在向www.facebook.com連接,能夠成功連接,應(yīng)該是DNS解析問題,出現(xiàn)了重復(fù)解析的問題,使用requests2.12不會(huì)有這個(gè)問題,在github上也找到了相關(guān)的issue
import requests headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/56.0.2924.87 Safari/537.36'} proxies = {'http': 'socks5://127.0.0.1:1080','https':'socks5://127.0.0.1:1080'} url = 'https://www.facebook.com' response = requests.get(url, proxies=proxies) print(response.content)
關(guān)于“如何解決Python requests庫編碼socks5代理的問題”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。