通过代理使用urllib2

时间:2013-02-18 01:54:56

标签: python http proxy urllib2

我正在尝试通过代理使用urllib2;但是,在尝试使用urllib2传递我的验证详细信息的每个变体之后,我要么得到一个永久挂起并且不返回任何内容的请求,或者我得到407 Errors。我可以使用我的浏览器连接到网络,连接到prox-pac并相应地重定向;但是,我似乎无法通过命令行curlwgeturllib2等做任何事情,即使我使用prox-pac重定向到的代理。我尝试使用urllib2将我的代理设置为来自pac文件的所有代理,但这些代理都不起作用。

我当前的脚本如下所示:

import urllib2 as url

proxy = url.ProxyHandler({'http': 'username:password@my.proxy:8080'})
auth = url.HTTPBasicAuthHandler()
opener = url.build_opener(proxy, auth, url.HTTPHandler)
url.install_opener(opener)
url.urlopen("http://www.google.com/")

引发HTTP Error 407: Proxy Authentication Required,我也尝试过:

import urllib2 as url

handlePass = url.HTTPPasswordMgrWithDefaultRealm()
handlePass.add_password(None, "http://my.proxy:8080", "username", "password")
auth_handler = url.HTTPBasicAuthHandler(handlePass)
opener = url.build_opener(auth_handler)
url.install_opener(opener)
url.urlopen("http://www.google.com")

挂起,如curlwget超时。

我需要做什么来诊断问题?我怎样才能通过我的浏览器进行连接,而不是使用看似相同的代理和凭据从同一台计算机上的命令行进行连接?

可能与路由器有关吗?如果是这样,它如何区分浏览器HTTP请求和命令行HTTP请求?

1 个答案:

答案 0 :(得分:3)

这样的挫折促使我使用Requests。如果您正在使用urllib2进行大量工作,那么您真的应该检查一下。例如,要使用“请求”执行您​​要执行的操作,您可以编写:

import requests
from requests.auth import HTTPProxyAuth

proxy = {'http': 'http://my.proxy:8080'}
auth = HTTPProxyAuth('username', 'password')
r = requests.get('http://wwww.google.com/', proxies=proxy, auth=auth)
print r.text

或者你可以把它包装在Session对象中,每个请求都会自动使用代理信息(加上它会自动存储和处理cookie!):

s = requests.Session(proxies=proxy, auth=auth)
r = s.get('http://www.google.com/')
print r.text