通过代理使用urllib2

2 投票
1 回答
5268 浏览
提问于 2025-04-17 16:13

我正在尝试通过代理使用 urllib2,但是在用 urllib2 传递我的验证信息时,试了很多种方法,要么请求一直挂着不返回任何东西,要么就出现 407 错误。我用浏览器连接网络没问题,浏览器可以通过一个代理自动配置文件(prox-pac)正常工作;但是我在命令行下用 curlwgeturllib2 等工具却无法成功,即使我使用的是那个代理配置文件里指定的代理。我尝试用 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 错误 407: 需要代理身份验证,我还尝试了:

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 个回答

3

像这样的烦恼让我开始使用Requests库。如果你在用urllib2做很多工作,真的应该试试这个库。比如,使用Requests来完成你想做的事情,你可以这样写:

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对象里,这样每次请求都会自动使用代理信息(而且它还会自动存储和处理cookies!):

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

撰写回答