代理与urllib2

我打开url:

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

而我想要做的就是用一个代理连接相同的方式我有一个地方告诉我:

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

但是这也不起作用。

我知道urllib2有一个像代理处理程序的东西,但我不记得那个function。

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

你必须安装一个ProxyHandler

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

要使用默认的系统代理(例如从http_support环境variables),下面的代码适用于当前请求(无需全局安装到urllib2中):

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

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

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

除了被接受的答案:我的scipt给了我一个错误

 File "c:\Python23\lib\urllib2.py", line 580, in proxy_open if '@' in host: TypeError: iterable argument required 

解决scheme是在代理string前添加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') 

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

另外设置命令行会话的代理打开您可能想要运行脚本的命令行

 netsh winhttp set proxy YourProxySERVER:yourProxyPORT 

在那个terminal上运行你的脚本。

urllib2如何能够构成一个真正的浏览器,因为许多脚本将阻止脚本从网站上刮取?

示例代码:

 import sys import urllib2 from bs4 import BeautifulSoup parser = "html.parser" quote_page = "https://www.bloomberg.com/quote/SPX:IND" proxy = urllib2.ProxyHandler({'http': 'myproxy:3128'}) opener = urllib2.build_opener(proxy) urllib2.install_opener(opener) page = urllib2.urlopen(quote_page) soup = BeautifulSoup(page, parser) print soup.prettify()