使用urllib2和SOCKS代理
有没有办法通过SOCKS代理,用urllib2来获取网页,而且每个打开器(opener)用不同的SOCKS服务器?我看到过使用setdefaultproxy方法的解决方案,但我需要在不同的打开器中使用不同的SOCKS。
有一个叫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
== 编辑 == (之前有个旧的HTTP代理示例在这里..)
这是我的错.. urllib2 并不支持 SOCKS 代理..
有一些方法可以把 SOCKS 加到 urllib2(或者一般的 socket 对象)上,具体可以参考 这里。
不过我怀疑这能否在你需要的多个代理上正常工作。
如果你不想去修改或扩展 urllib2.ProxyHandler,我建议你使用 pycurl。
11
是的,你可以这样做。我在这里重复一下我之前的回答,关于如何使用SOCKS 4/5代理与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实例,让它们像旋转代理一样工作,链接在这里:使用多个Tor电路进行分布式抓取
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()