是什么导致urllib2.urlopen()通过代理连接?

0 投票
1 回答
1375 浏览
提问于 2025-04-16 07:17

我正在尝试在我们公司的网络内读取一个网址。具体来说,我要联系的服务器在一个办公室,而客户端电脑在另一个办公室:

print(urlopen(r"http://london.mycompany/mydir/").read())

每当我运行这个函数时,我都会得到:

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
File "C:\Python24\lib\urllib2.py", line 130, in urlopen
  return _opener.open(url, data)
File "C:\Python24\lib\urllib2.py", line 364, in open
  response = meth(req, response)
File "C:\Python24\lib\urllib2.py", line 471, in http_response
  response = self.parent.error(
File "C:\Python24\lib\urllib2.py", line 402, in error
 return self._call_chain(*args)
File "C:\Python24\lib\urllib2.py", line 337, in _call_chain
 result = func(*args)
File "C:\Python24\lib\urllib2.py", line 480, in http_error_default
 raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 407: Proxy Authentication Required

奇怪的是,这两台电脑之间没有防火墙——出于某种原因,网址决定通过我们通常用来连接公司外部内容的代理服务器来连接网络服务器,而在这种情况下,由于我没有进行身份验证,这个连接失败了。

我很确定问题出在客户端电脑上:我做了一个nslookup和ping测试,确认了两台电脑之间是有连接的,但是当我使用TCPView监控这个过程时,我发现python.exe进程连接到了一个完全不同的服务器(没错,就是那个代理!)。

那么,这可能是什么原因呢?请注意,os.environ["http_proxy"]这个变量没有被设置——这个变量通常用来让urllib通过代理服务器连接。但在这里并不是这种情况。还有其他什么可能导致同样的效果吗?

顺便说一下,我在一个非常严格的公司环境中运行的是Windows XP 32位的Python 2.4.4。

1 个回答

2

它是从系统设置中读取信息的。可以使用 urllib.FancyURLOpener 来实现:

opener = urllib.FancyURLopener({})
f = opener.open("http://london.mycompany/mydir/")
f.read()

撰写回答