解决Python requests库编码 socks5代理的问题


Posted in Python onMay 07, 2018

编码问题

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]: '\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的代码

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代理问题

现在的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)

解决Python requests库编码 socks5代理的问题

解决Python requests库编码 socks5代理的问题

以上这篇解决Python requests库编码 socks5代理的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用socket进行简单网络连接的方法
Apr 29 Python
python实现在sqlite动态创建表的方法
May 08 Python
python正则分析nginx的访问日志
Jan 17 Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
Django Rest framework频率原理与限制
Jul 26 Python
在django中实现页面倒数几秒后自动跳转的例子
Aug 16 Python
Python使用APScheduler实现定时任务过程解析
Sep 11 Python
Python hashlib模块实例使用详解
Dec 24 Python
详解python破解zip文件密码的方法
Jan 13 Python
OpenCV绘制圆端矩形的示例代码
Aug 30 Python
python编程实现清理微信重复缓存文件
Nov 01 Python
python在package下继续嵌套一个package
Apr 14 Python
基于python requests库中的代理实例讲解
May 07 #Python
Python操作Oracle数据库的简单方法和封装类实例
May 07 #Python
Pandas实现数据类型转换的一些小技巧汇总
May 07 #Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 #Python
Python代码缩进和测试模块示例详解
May 07 #Python
Python采集代理ip并判断是否可用和定时更新的方法
May 07 #Python
利用python的socket发送http(s)请求方法示例
May 07 #Python
You might like
深入了解php4(2)--重访过去
2006/10/09 PHP
深入解析php中的foreach问题
2013/06/30 PHP
php自定义时间转换函数示例
2016/12/07 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
30个精美的jQuery幻灯片效果插件和教程
2011/08/23 Javascript
node.js中的fs.rename方法使用说明
2014/12/16 Javascript
jquery实现简单文字提示效果
2015/12/02 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
jQuery实现仿京东防抖动菜单效果示例
2018/07/06 jQuery
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
解决ant Design中this.props.form.validateFields未执行的问题
2020/10/27 Javascript
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
在Python中调用ggplot的三种方法
2015/04/08 Python
Python调用C++程序的方法详解
2017/01/24 Python
python放大图片和画方格实现算法
2018/03/30 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
python实现图像拼接功能
2020/03/23 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
大学生涯自我鉴定
2014/01/16 职场文书
医务工作者先进事迹材料
2014/01/26 职场文书
库房管理员岗位职责
2014/03/09 职场文书
管理失职检讨书范文
2015/05/05 职场文书
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers