解決Python requests庫編碼 socks5代理的問題

來源:互聯網
上載者:User
這篇文章主要介紹了關於解決Python requests庫編碼 socks5代理的問題,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

編碼問題

response = requests.get(URL, params=params,      headers=headers, timeout=10)print 'self.encoding',response.encodingoutput:self.encoding ISO-8859-1

查了一些相關的資料,看了下requests的源碼,只有在伺服器響應的頭部包含有Content-Type,且裡面有charset資訊,requests能夠正確識別,否則就會使用預設的 ISO-8859-1編碼。github中也有討論這個問題,但requests的作者們說是根據rfc來的.

在上述代碼中,response.text 是requests庫返迴響應的Unicode編碼內容

這樣,當我們去擷取一些中文網頁的響應內容時,且其回應標頭部沒有charset資訊,則response.text的編碼就會有問題(requests的json()方法也受這個編碼影響)

比如,我爬取百度的網頁的時候,其中文是utf-8編碼的

如下python2.7代碼

In [14]: a = '約' #utf-8編碼In [15]: aOut[15]: '\xe7\xba\xa6'In [22]: b=a.decode('ISO-8859-1')#response.text 認為響應內容是ISO-8859-1編碼,將其decode為UnicodeIn [23]: bOut[23]: u'\xe7\xba\xa6'In [26]: c=b.encode('utf8')#如果我們沒有注意ISO-8859-1,直接以utf8對其進行編碼In [27]: cOut[27]: '\xc3\xa7\xc2\xba\xc2\xa6'#那麼encode得到的utf-8,在顯示器上顯示的就是亂碼,因為'約'的utf-8編碼是'\xe7\xba\xa6'

解決方案1: 用response.content ,response.content in bytes,所以用content可以自己決定對其的編碼

解決方案2: 獲得請求後使用 response.encoding = ‘utf-8'

解決方案3: 利用requests庫雷根據獲得響應內容來判斷編碼的函數,參考文獻裡有講到

python2的編碼還是很亂的 str可以是各種編碼,python3統一str為Unicode, byte可以是各種編碼

python2中encode後是str類型,decode後是Unicode類型,python3中encode後是byte類型,decode後是str類型(Unicode編碼)

用python3吧,下面是python3的代碼

In [13]: a = '約' #UnicodeIn [14]: type(a)Out[14]: strIn [15]: b=a.encode('utf8')In [16]: bOut[16]: b'\xe7\xba\xa6'In [17]: type(b)Out[17]: bytesIn [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]: strIn [29]: b'\xe7\xba\xa623,000'.decode('utf8')Out[29]: '約23,000'

socks5代理問題

現在的requests2.13.0的socks5代理我在使用的時候會出現問題,

我用的代理是shadowsocks,比如我想要訪問https://www.facebook.com 在向本地127.0.0.1:1080連接埠發送socks5請求時,我發現shadowsocks在向一個IP地址串連,串連不上,我用chrome串連Facebook的時候,我發現shadowsocks是在向www.facebook.com串連,能夠成功串連,應該是DNS解析問題,出現了重複解析的問題,使用requests2.12不會有這個問題,在github上也找到了相關的issue

import requestsheaders = {'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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.