代理设置与urllib2

78

我用以下代码打开url:

site = urllib2.urlopen('http://google.com')

我想通过代理连接,已经找到了代理信息:

site = urllib2.urlopen('http://google.com', proxies={'http':'127.0.0.1'})

但这似乎没有生效。

我知道urllib2有一个代理处理器,但我无法回忆起那个函数的名称。

7个回答

143
proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')

1
嗨,@ZelluX,我只想在某些函数上启用代理设置,这是否意味着我必须在每次调用函数时安装和卸载opener? - satoru
@Satoru.Logic 也许你可以编写一个装饰器来简化安装/卸载过程? - ZelluX
2
似乎在urllib2中没有uninstall方法,但我们可以进行一次性代理设置; 我们不需要安装打开器,而是创建一个请求对象,并使用打开器来打开它。 - satoru
3
@Satoru.Logic:我认为传统的方法是配置一个环境变量,比如HTTP_PROXY,然后在你的代码中检查它是否被定义,使用os.environ["HTTP_PROXY"] - ccpizza
这个怎么知道要用哪个端口? - MikeSchem
显示剩余3条评论

19

您需要安装ProxyHandler代理处理程序

urllib2.install_opener(
    urllib2.build_opener(
        urllib2.ProxyHandler({'http': '127.0.0.1'})
    )
)
urllib2.urlopen('http://www.google.com')

我得到了 文件 "D:/桌面/桌面/mygoogl",第64行, site = url.urlopen('google.com) 文件 "C:\Python26\lib\urllib2.py",第124行,在urlopen 返回_opener.open(url, data, timeout) 属性错误:ProxyHandler实例没有'open'属性 - Chris Stryker
我错过了对urllib2.build_opener()的调用。 - dcrosta

12

您可以使用环境变量来设置代理。

import os
os.environ['http_proxy'] = '127.0.0.1'
os.environ['https_proxy'] = '127.0.0.1'
urllib2 会自动添加代理处理程序。您需要单独为不同的协议设置代理,否则它们将失败(不能通过代理),请参见以下内容。
例如:
proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')
# next line will fail (will not go through the proxy) (https)
urllib2.urlopen('https://www.google.com')

相反地

proxy = urllib2.ProxyHandler({
    'http': '127.0.0.1',
    'https': '127.0.0.1'
})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
# this way both http and https requests go through the proxy
urllib2.urlopen('http://www.google.com')
urllib2.urlopen('https://www.google.com')

你的下面两个示例中,难道不应该使用例如 os.environ['http_proxy'] 吗? - Jonathan Benn

7
要使用默认系统代理(例如从 http_support 环境变量中获取),可以使用以下方法来处理当前请求(而无需将其全局安装到 urllib2 中):
url = 'http://www.example.com/'
proxy = urllib2.ProxyHandler()
opener = urllib2.build_opener(proxy)
in_ = opener.open(url)
in_.read()

3

如果我们想要使用代理访问网页,也可以使用requests。Python 3代码:

>>> import requests
>>> url = 'http://www.google.com'
>>> proxy = '169.50.87.252:80'
>>> requests.get(url, proxies={"http":proxy})
<Response [200]>

可以添加多个代理。
>>> proxy1 = '169.50.87.252:80'
>>> proxy2 = '89.34.97.132:8080'
>>> requests.get(url, proxies={"http":proxy1,"http":proxy2})
<Response [200]>

嗨@WaqarDetho,一个人怎么知道该使用什么代理地址?它只是一些随机的IP地址吗? - Aman Singh
嗨@AmanSingh,我很久以前就做过这个。但是据我所记,我是从互联网上找到这些代理地址的。我手动将它们注入代码中。 - Waqar Detho

3
除了接受的答案之外: 我的脚本给了我一个错误。
File "c:\Python23\lib\urllib2.py", line 580, in proxy_open
    if '@' in host:
TypeError: iterable argument required

解决方法是在代理字符串前加上 http:// :
proxy = urllib2.ProxyHandler({'http': 'http://proxy.xy.z:8080'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')

0

此外,为命令行会话设置代理 打开一个命令行窗口,您可能想要在其中运行脚本

netsh winhttp set proxy YourProxySERVER:yourProxyPORT

在那个终端中运行你的脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接