2009-09-20 75 views
66

我打开网址:代理与urllib2的

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

而我想要做的是同样的方式与代理 我得到的地方告诉我连接:

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

但那也没用。

我知道urllib2有类似代理处理程序的东西,但我不记得那个函数。

回答

130
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,我只想对某些功能设置启用了代理,意味着什么我必须安装和卸载每次调用该函数的开罐器? – satoru 2011-11-11 08:42:15

+0

@ Satoru.Logic也许你可以编写一个装饰器来简化安装/卸载过程? – ZelluX 2011-11-11 13:25:59

+2

似乎'urllib2'中没有'uninstall'方法,但我们可以进行一次性代理设置;我们不是“安装”开放者,而是创建一个“请求”对象,并使用开放者来“打开”它。 – satoru 2011-11-11 13:39:04

15

您必须安装一个ProxyHandler

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

我得到 文件 “d:/桌面/桌面/ mygoogl”,第64行, 站点= url.urlopen('google.com) 文件“C:\ Python26 \ lib中\ urllib2.py “,124行,在urlopen 返回_opener。开(网址,数据,超时) AttributeError的:ProxyHandler实例没有属性“打开” – 2009-09-20 02:43:56

+0

我错过了一个电话给urllib2.build_opener() – dcrosta 2009-09-20 02:51:44

6

要使用系统默认代理(例如,从http_support环境变量),当前请求以下工作(不安装到的urllib2全球) :

url = 'http://www.example.com/' 
proxy = urllib2.ProxyHandler() 
opener = urllib2.build_opener(proxy) 
in_ = opener.open(url) 
in_.read() 
7

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

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') 
+0

你不应该使用eg os.environ ['http_proxy']在你的下面两组例子中? – 2017-04-13 20:51:47

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 

在终端运行你的脚本。

1

如果我们想使用代理访问网页,也可以使用请求。 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]>