urllib2的代理


76

我用以下网址打开网址:

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

我想做的是用同样的方式连接到我在某处告诉我的代理:

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

但这也不起作用。

我知道urllib2具有类似代理处理程序的功能,但是我不记得该功能了。

Answers:


142
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

@ Satoru.Logic也许您可以编写装饰器来简化安装/卸载过程?
ZelluX 2011年

2
似乎中没有uninstall方法urllib2,但是我们可以进行一次代理设置。installing我们创建一个request对象,而不是打开器,并对其使用打开器open
satoru

3
@ Satoru.Logic:我认为传统方法是配置一个环境变量,例如HTTP_PROXY,然后检查您的代码是否使用定义os.environ["HTTP_PROXY"]
ccpizza 2012年

:不要忘记的端口号例如3128代理= urllib2.ProxyHandler({ '127.0.0.1:3128'的'http'})
J'e

18

您必须安装ProxyHandler

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

我在urlopen返回_opener中获得文件“ D:/ Desktop / Desktop / mygoogl”,行64,站点= url.urlopen('google.com)文件“ C:\ Python26 \ lib \ urllib2.py”,行124。打开(URL,数据,超时)AttributeError:ProxyHandler实例不具有“打开”属性
Chris Stryker,

我错过了对
urllib2.build_opener

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']?
乔纳森·本

7

要使用默认系统代理(例如,从http_support环境变量获取),以下内容适用于当前请求(无需将其全局安装到urllib2中):

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

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

2

如果我们想使用代理访问网页,也可以使用请求。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地址吗?
阿曼·辛格

嗨@AmanSingh我很久以前就做过。但据我所知,我是从互联网上找到这些代理地址的。我手动将它们注入代码中。
Waqar Detho

0

此外,为命令行会话设置代理在可能要运行脚本的命令行中打开命令行

netsh winhttp set proxy YourProxySERVER:yourProxyPORT

在该终端上运行脚本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.