Skip to main content
 首页 » 编程设计

python之超时无法使用 urllib2、socks5 代理和 socksipy

2025年05月04日15cyq1162

我在 Python 2.6 中使用 socksipy 和 urllib2。一切正常,除了当我点击一个挂起的 URL 时超时。 urllib2 函数超时参数或全局套接字默认超时均无效。我什至尝试在下面的子级处理程序中以多种不同方式设置超时,但没有成功。有什么想法吗?

这是一个测试脚本(假设您已经安装了 socksipy 项目并将其添加到您的系统路径):

import os, sys 
import httplib 
sys.path.append( "/parent/path/to/socksipy/project" ) 
import socks # import socksipy 
import socket 
socket.setdefaulttimeout(30.0) 
import urllib2 
 
class SocksiPyConnection(httplib.HTTPConnection): 
    def __init__(self, proxytype, proxyaddr, proxyport = None, rdns = False, username = None, password = None, *args, **kwargs): 
        self.proxyargs = (proxytype, proxyaddr, proxyport, rdns, username, password) 
        httplib.HTTPConnection.__init__(self, *args, **kwargs) 
 
    def connect(self): 
        self.sock = socks.socksocket() 
        self.sock.setproxy(*self.proxyargs)  
        if isinstance(self.timeout, float): 
            self.sock.settimeout(self.timeout) 
        self.sock.connect((self.host, self.port)) 
 
class SocksiPyHandler(urllib2.HTTPHandler): 
    def __init__(self, *args, **kwargs): 
        self.args = args 
        self.kw = kwargs 
        urllib2.HTTPHandler.__init__(self) 
 
    def http_open(self, req): 
        def build(host, port=None, strict=None, timeout=0): 
            conn = SocksiPyConnection(*self.args, host=host, port=port, strict=strict, timeout=timeout, **self.kw) 
            return conn 
        return self.do_open(build, req) 
 
if __name__ == '__main__': 
 
    # 
    # this one works for non-hanging URL 
    # 
    proxyhost = "responder.w2" 
    proxyport = 1050 
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, proxyhost, int(proxyport)) 
    socket.socket = socks.socksocket 
    resp = urllib2.urlopen("http://www.google.com", timeout=30.0) 
    # hang here 
    print "returned 1" 
 
 
    # 
    # one way to go about it for a hanging URL 
    # 
    proxyhost = "responder.w2" 
    proxyport = 1050 
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, proxyhost, int(proxyport)) 
    socket.socket = socks.socksocket 
    resp = urllib2.urlopen("http://erma.orr.noaa.gov/cgi-bin/mapserver/charts?version=1.1.1&service=wms&request=GetCapabilities", timeout=30.0) 
    # it hangs here 
    print "returned 2" 
 
 
    #   
    # another way to go about it for hanging URL 
    # 
    proxyhost = "responder.w2" 
    proxyport = 1050 
    opener = urllib2.build_opener(SocksiPyHandler(socks.PROXY_TYPE_SOCKS5, proxyhost, int(proxyport)) ) 
    resp = opener.open("http://erma.orr.noaa.gov/cgi-bin/mapserver/charts?version=1.1.1&service=wms&request=GetCapabilities", timeout=30.0) 
    # it hangs here 
    print "returned 3" 

请您参考如下方法:

这对我有用:

socks.socket.setdefaulttimeout(7) 

你应该避免直接编辑 python socks 库。