本文摘自php中文网,作者不言,侵删。
这篇文章主要介绍了关于解决Python requests库编码 socks5代理的问题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下编码问题
1 2 3 4 5 | response = requests.get(URL, params=params,
headers=headers, timeout=10)
print 'self.encoding' ,response.encoding
output:
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代码
1 2 3 4 5 6 7 8 9 | In [14]: a = '约' #utf-8编码
In [15]: a
Out[15]: '\xe7\xba\xa6'
In [22]: b=a.decode( 'ISO-8859-1' )#response.text 认为响应内容是ISO-8859-1编码,将其decode为Unicode
In [23]: b
Out[23]: u '\xe7\xba\xa6'
In [26]: c=b.encode( 'utf8' )#如果我们没有注意ISO-8859-1,直接以utf8对其进行编码
In [27]: c
Out[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的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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]: '?o|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代理问题
现在的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
1 2 3 4 5 6 7 8 | 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)
|


相关推荐:
基于python requests库中的代理实例
利用python的socket发送http(s)请求方法
以上就是解决Python requests库编码 socks5代理的问题的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
Python中if语句与while语句的简单介绍(附示例)
对Python中的for循环和range内置函数
Python循环语句怎么写
Python判断一个集合是否为另一个集合的子集方法
Python统计字符个数
水仙花数如何用Python代码表示?
序列化和反序列化的详细介绍
如何利用Python函数求导数
Python实现循环定时器的方法介绍(附代码)
Python闰年判定代码是什么
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » 解决Python requests库编码 socks5代理的问题