接下来是最近遇到的一个代理问题。
背景:一个基于python2.7的自动化测试项目
目的:因调试需求,需要通过代理连接其他公司的前端网站,来检验项目运行所在的问题。
问题:RUN>等了1分钟没有任何提示,之后抛出异常,raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='xx.xx.xx.xx', port=80): Max retries exceeded with url: /xx/xx/xxx (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0000000002E7DC50>: Failed to establish a new connection: [Errno 10060] ',)
明显连接不上网址,但是网页可以连接上,那就是代理的问题了。
解决: 正常的python2.7版本设置代理的格式是这样的:
proxy_handler = urllib2.ProxyHandler({'http':'ip:port'}) opener = urllib2.build_opener(proxy_handler) r = opener.open('http://www.baidu.com')
但是我不需要主动的去打开网页,于是了解到可以把代理安装到urllib2,之后通过urllib2打开的网页都通过这个代理连接,于是就变成了这样。
proxy_handler = urllib2.ProxyHandler({'http':'ip:port'}) opener = urllib2.build_opener(proxy_handler) urllib2.install_opener(opener)
到此为止,对于python2.7版本的代理设置基本上都可以满足了。
再次运行......还是连接不上,一样的异常。之后上网查找各种设置代理的问题,没有试成功过,包括设置pycharm的系统代理,也行不通。
之后我用python3.6版本做了个连接代理的测试,发现python3.6的可以成功,但是python3.6的代理设置和python2.7的代理设置不尽相同,没什么关系。
接着就去看代码内部逻辑找到连接网址的相关代码块,去看看是怎么连接的,既然咱们用urllib2设置的代理,那连接的时候应该会有相关的方法,what?,用socks连接的........
但是咱们知道python2.7是没有socks.py模块的,这......,想着死马当活马医吧,直接就把python3.6的socks.py文件复制到了python2.7的Lib下,直接import,把python3.6设置代理的方法复制了进来
import socket
import socks
socks.set_default_proxy(socks.HTTP, 'ip', port) socket.socket = socks.socksocket
RUN>报错提示缺一个win_inet_pton.py模块,然后把这个模块下载下来,再import,再RUN,然后就看见控制台,出现了密密麻麻的SUCCESS信息。成功了。
ps:python2和python3还是有血缘关系的,哈哈。
点击下载win_inet_pton.py 密码:7m0p