是否可以在每个开启者基础上通过一个袜子服务器上的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请求设置相同的代理。如何为不同的开启者设置不同的代理?
答案 0 :(得分: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()
答案 1 :(得分:11)
是的,你可以。我在How can I use a SOCKS 4/5 proxy with urllib2?上重复我的回答 您需要为每个代理创建一个开启器,就像使用http代理一样。将此功能添加到SocksiPy的代码可以在GitHub 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()
有关详细信息,我编写了一个运行多个Tor实例的示例,其行为类似于旋转代理:Distributed Scraping With Multiple Tor Circuits
答案 2 :(得分:0)
== EDIT ==(旧的HTTP代理示例在这里..)
我的错.. urllib2没有对SOCKS代理的内置支持..
有一些' hacks '将SOCKS添加到urllib2(或一般的套接字对象)here。
但我几乎不怀疑这将适用于您需要的多个代理。
只要您不想挂钩/继承urllib2.ProxyHandler,我建议您使用pycurl。
答案 3 :(得分:0)
所有开启者只有一个套接字,实现socks的套接字级别。所以,你不能 我建议你使用pycurl库,它更灵活。
答案 4 :(得分: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¢: - )
答案 5 :(得分:0)
使用SOCKS代理的繁琐但有效的解决方案是使用代理链设置provixy,然后通过系统变量或任何其他方式设置privoxy提供的HTTP_PROXY。
答案 6 :(得分:-3)
您可以通过以下格式设置环境变量HTTP_PROXY来实现:
用户:通过@代理:端口
或者如果您使用bat / cmd,请在调用脚本之前添加:
设置HTTP_PROXY = user:pass @ proxy:port
我正在使用这样的cmd文件使easy_install在代理下工作。