最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

解决Pythonrequests库编码socks5代理的问题

来源:懂视网 责编:小采 时间:2020-11-27 14:12:19
文档

解决Pythonrequests库编码socks5代理的问题

解决Pythonrequests库编码socks5代理的问题:这篇文章主要介绍了关于解决Python requests库编码 socks5代理的问题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下编码问题response = requests.get(URL, params=params, headers=headers, timeout=10) p
推荐度:
导读解决Pythonrequests库编码socks5代理的问题:这篇文章主要介绍了关于解决Python requests库编码 socks5代理的问题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下编码问题response = requests.get(URL, params=params, headers=headers, timeout=10) p
这篇文章主要介绍了关于解决Python requests库编码 socks5代理的问题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

编码问题

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代码

In [14]: a = '约' #utf-8编码
In [15]: a
Out[15]: 'xe7xbaxa6'
In [22]: b=a.decode('ISO-8859-1')#response.text 认为响应内容是ISO-8859-1编码,将其decode为Unicode
In [23]: b
Out[23]: u'xe7xbaxa6'
In [26]: c=b.encode('utf8')#如果我们没有注意ISO-8859-1,直接以utf8对其进行编码
In [27]: c
Out[27]: 'xc3xa7xc2xbaxc2xa6'#那么encode得到的utf-8,在显示器上显示的就是乱码,因为'约'的utf-8编码是'xe7xbaxa6'

解决方法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 = '约' #Unicode
In [14]: type(a)
Out[14]: str
In [15]: b=a.encode('utf8')
In [16]: b
Out[16]: b'xe7xbaxa6'
In [17]: type(b)
Out[17]: bytes
In [27]: b'xe7xbaxa623,000'.decode('ISO-8859-1')
Out[27]: '???23,000'
In [28]: type(b'xe7xbaxa623,000'.decode('ISO-8859-1'))
Out[28]: str
In [29]: b'xe7xbaxa623,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 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)

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

解决Pythonrequests库编码socks5代理的问题

解决Pythonrequests库编码socks5代理的问题:这篇文章主要介绍了关于解决Python requests库编码 socks5代理的问题,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下编码问题response = requests.get(URL, params=params, headers=headers, timeout=10) p
推荐度:
标签: 编码 python requests
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top