2014-09-04 135 views
5

我管理了很多HTTPS代理(这些代理具有自己的SSL连接)。我在python中构建了一个诊断工具,它尝试通过每个代理连接到一个页面,如果它无法通过其中一个连接,就会通过电子邮件发送给我。测试python中的HTTPS代理

我开始讨论的方式是使用urllib通过每个代理进行连接,并返回一个应该用下面的代码说“成功”的页面。

def fetch(url): 
    connection = urllib.urlopen(
    url, 
    proxies={'http':"https://"+server+':443'} 
    ) 
    return connection.read() 


print fetch(testURL) 

此获取我想要的页面完美的问题是,它仍然会取我想即使代理服务器信息不正确或代理服务器是不活动的页面。因此,它不会使用代理服务器,或者它尝试它并在失败时连接没有它。

我该如何解决这个问题?

编辑:没有人似乎知道如何做到这一点。我将开始阅读其他语言库,以查看它们是否可以更好地处理它。有谁知道在Go等其他语言中它更容易吗?

编辑:我只是在下面的评论中写了这个,但我认为这可能是一个误解。 “代理有它自己的SSL连接,所以如果我去google.com,我首先与foo.com进行密钥交换,然后再与目标地址bar.com或目的地址baz.com进行密钥交换。目的地不会'不得不是https,代理是https“

回答

1

我认为它不适用于https请求。它是否正确?如果是,那么上面的代码只为http定义一个代理。试着增加它的https:

proxies={'https':"https://"+server+':443'}

另一种选择是使用requests Python模块,而不是urllib。看看http://docs.python-requests.org/en/latest/user/advanced/#proxies

+0

我试过了。它没有帮助。在这种情况下请求的好处是什么? – 2014-09-12 23:45:41

+0

好了,所以我使用数据包捕获在我的环境中运行了它,它显示urllib没有向代理发送CONNECT请求,这是不正确的。然后我阅读https://docs.python.org/2/howto/urllib2.html,其中规定“目前urllib2不支持通过代理获取https位置。但是,可以通过扩展urllib2来启用它,如食谱http://code.activestate.com/recipes/456195。我建议请求Python模块,因为它似乎更简单,更容易使用,尝试使用urllib实现这一点 – Yuvika 2014-09-13 12:26:39

0

如何使用超时?如果代理在30秒内连接失败,则应该将其标记为未连接。

def fetch(url, server): 
proxy_handler = urllib2.ProxyHandler({'http':'https://'+server+':443'}) 
opener = urllib2.build_opener(proxy_handler, urllib2.HTTPHandler(debuglevel=0)) 
urllib2.install_opener(opener) 

try: 
    response = opener.open(url, timeout = 30) 
    return response.read() 
except: 
    print "Can't connect with proxy %s" % (server) 

print fetch(url,serverIp) 

你可以改变debuglevel = 1看到连接的详细信息

我用这个全球代理,并与我的互联网连接30秒为最大超时知道我是否连接与否。在我的测试中,如果连接时间超过30秒,这总是失败。

2

大多数人都明白HTTPS代理作为代理,理解CONNECT请求。我的例子创建了直接的ssl连接。

try: 
    import http.client as httplib # for python 3.2+ 
except ImportError: 
    import httplib # for python 2.7 


con = httplib.HTTPSConnection('proxy', 443) # create proxy connection 
# download http://example.com/ through proxy 
con.putrequest('GET', 'http://example.com/', skip_host=True) 
con.putheader('Host', 'example.com') 
con.endheaders() 
res = con.getresponse() 
print(res.read()) 

如果您的代理是那么反向代理更改

con.putrequest('GET', 'http://example.com/', skip_host=True) 

con.putrequest('GET', '/', skip_host=True)`