使用urllib2和SOCKS代理

15 投票
7 回答
19918 浏览
提问于 2025-04-15 20:59

有没有办法通过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() 

撰写回答