15

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

所以有 SocksiPy 库,效果很好,但必须以这种方式使用:

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

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

4

7 回答 7

17

尝试使用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() 
于 2010-04-03T05:54:34.780 回答
11

是的你可以。我重复我对如何使用带有 urllib2 的 SOCKS 4/5 代理的回答? 您需要像使用 http 代理一样为每个代理创建一个开启程序。在 GitHub https://gist.github.com/869791中提供了将这个功能添加到 SocksiPy 的代码,并且非常简单:

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

有关更多信息,我编写了一个运行多个 Tor 实例以表现得像旋转代理的示例:Distributed Scraping With Multiple Tor Circuits

于 2011-12-12T17:43:59.197 回答
0

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

我的错.. urllib2 没有对 SOCKS 代理的内置支持..

这里有一些“黑客”将 SOCKS 添加到 urllib2(或一般的套接字对象)。 但我几乎不怀疑这将与您需要的多个代理一起使用。

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

于 2010-03-29T14:16:24.543 回答
0

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

于 2010-04-01T16:31:08.350 回答
0

如果一次没有太多连接,您可能可以使用线程锁,并且您需要从多个线程访问:

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

这些显然不是很好的解决方案,但无论如何我已经投入了 2 美分 :-)

于 2010-04-06T15:52:45.057 回答
0

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

于 2011-01-10T14:03:59.750 回答
-3

您可以通过以下格式设置环境变量 HTTP_PROXY 来做到这一点:

用户:pass@proxy:端口

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

设置 HTTP_PROXY=user:pass@proxy:port

我正在使用这样的 cmd 文件使 easy_install 在代理下工作。

于 2010-05-20T15:10:21.307 回答