编码问题
1
2
3
4
5
|
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 ]: '约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' |
现在的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库编码 socks5代理的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/fangbinwei93/article/details/59526937