代码之家  ›  专栏  ›  技术社区  ›  Fluffy

将urllib2与SOCKS代理一起使用

  •  14
  • Fluffy  · 技术社区  · 16 年前

    是否可以通过SOCKS代理在每个openerbasic一个SOCKS服务器上获取带有urllib2的页面?我见过使用setdefaultproxy方法的解决方案,但是我需要在不同的开瓶器中使用不同的袜子。

    import socks
    import socket
    socket.socket = socks.socksocket
    import urllib2
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "x.x.x.x", y)
    

    也就是说,它为所有urllib2请求设置相同的代理。如何为不同的开场白设置不同的代理?

    7 回复  |  直到 16 年前
        1
  •  17
  •   systempuntoout    16 年前

    尝试 pycurl :

    import pycurl
    c1 = pycurl.Curl()
    c1.setopt(pycurl.URL, 'http://www.google.com')
    c1.setopt(pycurl.PROXY, 'localhost')
    c1.setopt(pycurl.PROXYPORT, 8080)
    c1.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
    
    c2 = pycurl.Curl()
    c2.setopt(pycurl.URL, 'http://www.yahoo.com')
    c2.setopt(pycurl.PROXY, 'localhost')
    c2.setopt(pycurl.PROXYPORT, 8081)
    c2.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
    
    c1.perform() 
    c2.perform() 
    
        2
  •  11
  •   Community Mohan Dere    9 年前

    How can I use a SOCKS 4/5 proxy with urllib2? 您需要为每个代理创建一个opener,就像使用http代理一样。GitHub中提供了将此功能添加到SocksiPy的代码 https://gist.github.com/869791 简单到:

    opener = urllib2.build_opener(SocksiPyHandler(socks.PROXY_TYPE_SOCKS4, 'localhost', 9999))
    print opener.open('http://www.whatismyip.com/automation/n09230945.asp').read()
    

    Distributed Scraping With Multiple Tor Circuits

        3
  •  0
  •   Andrew    16 年前

    您只有一个用于所有开启器的套接字,而实现socks是在套接字级别。所以,你不能。
    我建议你使用pycurl库,它更灵活。

        4
  •  0
  •   Heals JarMan    16 年前

    ==编辑==(这里是旧的HTTP代理示例..)

    是我的错。。urllib2不支持SOCKS代理。。

    '将SOCKS添加到urllib2(或通常的socket对象) here .
    但我几乎不怀疑,这将与多个代理一样,你需要它工作。

    只要您不想钩住/子类urllib2.ProxyHandler,我建议您使用pycurl。

        5
  •  0
  •   cryo    16 年前

    如果一次建立的连接不太多,并且需要从多个线程访问,则可以使用线程锁:

    import socks
    import socket
    import thread
    lock = thread.allocate_lock()
    socket.socket = socks.socksocket
    
    def GetConn():
        lock.acquire()
        import urllib2
        socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "x.x.x.x", y)
        conn = urllib2.urlopen(ARGUMENTS HERE)
        lock.release()
        return conn
    

    您还可以在每次需要建立连接时使用以下内容:

    urllib2 = execfile('urllib2.py')
    urllib2.socket = dummy_class() # dummy_class needs the socket module's methods
    

        6
  •  0
  •   ccpizza    15 年前

    使用SOCKS代理的一个麻烦但有效的解决方案是使用代理链接设置provixy,然后通过系统变量或任何其他方式设置privoxy提供的HTTP\u代理。

        7
  •  -3
  •   Dmitry Kochkin    16 年前

    用户:pass@proxy:端口

    或者,如果使用bat/cmd,则在调用脚本之前添加:

    我正在使用这样的cmd文件,使轻松安装下的代理工作。