Python 使用urllib2、socks5代理和socksipy超时不工作

Python 使用urllib2、socks5代理和socksipy超时不工作,python,proxy,urllib2,socks,Python,Proxy,Urllib2,Socks,我在Python2.6中将socksipy与urllib2一起使用。除了我点击挂起的URL时超时外,一切正常。urllib2函数超时参数或全局套接字默认超时均无效。我甚至在下面的子缓存处理程序中尝试了多种不同的方式设置超时,但都没有成功。有什么想法吗 下面是一个测试脚本(假设您安装了socksipy项目并将其添加到系统路径): 事实证明,我上面提到的“挂起/超时”问题实际上是代码中的“阻塞”问题。如果您访问的端点仍有200个响应,但不发送任何数据(0字节),那么socks.py将阻塞,因为它就是

我在Python2.6中将socksipy与urllib2一起使用。除了我点击挂起的URL时超时外,一切正常。urllib2函数超时参数或全局套接字默认超时均无效。我甚至在下面的子缓存处理程序中尝试了多种不同的方式设置超时,但都没有成功。有什么想法吗

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

事实证明,我上面提到的“挂起/超时”问题实际上是代码中的“阻塞”问题。如果您访问的端点仍有200个响应,但不发送任何数据(0字节),那么socks.py将阻塞,因为它就是这样写的。以下是创建自己的超时的前后步骤:

socks.py之前

def __recvall(self, bytes):
    """__recvall(bytes) -> data
    Receive EXACTLY the number of bytes requested from the socket.
    Blocks until the required number of bytes have been received.
    """
    data = ""
    while len(data) < bytes:
       data = data + self.recv(bytes-len(data))
    return data
def __recvall(self, bytes):
    """__recvall(bytes) -> data
    Receive EXACTLY the number of bytes requested from the socket.
    Blocks until the required number of bytes have been received.
    """
    data = self.recv(bytes, socket.MSG_WAITALL)
    if type(data) not in (str, unicode) or len(data) != bytes:
        raise socket.timeout('timeout')
    return data
这对我很有用:

socks.socket.setdefaulttimeout(7)

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

我正试图做这个人正在做的事情,但我需要超时:使用请求模块会有帮助吗?这要简单得多@hughdbrown:如果请求模块支持socks5代理,我可能会重写所有内容。我运行了这段代码,30秒后在第二个URL上收到超时异常:urllib2.URLError:也许这个答案可以帮助您:
socks.socket.setdefaulttimeout(7)