使用urllib2和SOCKS代理

时间:2010-03-29 12:17:38

标签: python urllib2 socks

是否可以在每个开启者基础上通过一个袜子服务器上的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请求设置相同的代理。如何为不同的开启者设置不同的代理?

7 个答案:

答案 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在代理下工作。