自动检测代理设置Linux

3
我正在编写一个Python应用程序,需要从互联网发送和检索一些信息。我想自动检测代理设置(以避免要求用户设置代理配置)。似乎 urllib 可以在Windows和Mac OsX上实现此功能,但不能在Unix/Linux上实现。
我需要/更喜欢使用mechanize模块,而不是urllib/urllib2。(它更容易处理编码为“multipart/form-data”的数据)。
mechanize模块能否自动检测代理设置?如果可以,在Windows、Mac OsX和Linux上都能正常工作吗?
以下代码不起作用(我在Linux后面有一个代理),除非我取消注释第四行。
import mechanize

br = mechanize.Browser()
#br.set_proxies({'http': 'myproxy.com:3128'})
br.open('http://www.google.com')
response = br.geturl()
print response

我猜这意味着 mechanize 无法自动检测代理设置(或者我做错了什么)。
如何在 Linux 上自动检测代理设置(使用 Python)?
编辑:9月9日添加
我可以确认 Mechanize 在 Windows 上自动检测代理设置,但在 Linux 上不行。正如 mru 所指出的,在 Linux 下没有标准化的方法来确定代理,所以我想最好的解决方案是检查用户是否正在使用 Linux,并在这种情况下尝试从 http_proxy 环境变量或 gconf(对于 Gnome)或 kioslaverc(KDE)中获取代理设置。如果所有方法都失败了,我将要求用户提供正确的代理设置(我认为这是一个公平的解决方案,因为一方面我认为大多数 Linux 用户知道什么是代理,另一方面至少我试图让事情变得更容易 :-))。

1
顺便说一下,在Linux下没有标准化的方法来确定代理。HTTP_PROXY环境变量(顺便说一下,我认为它是小写)通常仅针对cli程序设置。如果您正在使用像KDE / Gnome这样的桌面环境并使用它们的设置,则不会显示在http_proxy下。 - Ulrich Dangel
好的...我有一台笔记本电脑,只在大学里面使用代理,我已经配置了Firefox自动检测代理设置(也许我可以问问他们是如何做到的:-)),如果需要的话,我会按应用程序更改代理设置(例如Mendeley和有时候的synaptic)...我想这意味着我没有全局代理设置(即HTTP_PROXY=None)。 - aloctavodia
2
Firefox做了另外一件事,它使用http://en.wikipedia.org/wiki/Web_Proxy_Autodiscovery_Protocol。 - Ulrich Dangel
我发现了这个 Python 库 http://code.google.com/p/pacparser/,我认为它可以帮助实现 Firefox 所做的事情... 但我认为对我来说这不是最好的解决方案(我想重新分发代码并保持依赖关系的最小化)。 - aloctavodia
1个回答

0
一种方法是检查HTTP_PROXY环境变量(这是wget检查是否必须使用代理的方式)。例如,代码可能如下所示:
import os
import mechanize

br = mechanize.Browser()

proxy = os.environ.get('HTTP_PROXY')
if proxy is not None:
    br.set_proxies({'http': proxy})

br.open('http://www.google.com')
response = br.geturl()
print response

但这在Windows上不起作用(我不知道MacOS是否基于UNIX)。


谢谢你的回答。我尝试了你的代码,但是我总是得到 os.environ.get('HTTP_PROXY') 返回 None 的结果。 - aloctavodia
urllib 应该自行使用 HTTP_PROXY,而无需显式地使用 .set_proxies() - jfs
顺便说一下,我尝试了使用小写和大写的变量HTTP_PROXY。 - aloctavodia
@aloctavodia,你通常如何在你的系统上设置代理? - mdeous
我有一台笔记本电脑,只在大学使用代理,我已经配置了Firefox自动检测代理设置,并且我按应用程序基础更改代理设置...我没有为系统设置代理(即HTTP_PROXY = None)...我尝试使用“网络代理”(一个Gnome应用程序)更改代理设置,但我仍然得到None。如果我使用命令“http_proxy = http:// username:password @ host:port / export http_proxy”,我会得到代理。我认为这与@mru的评论有关。 - aloctavodia
我发现Mechanize已经检查http_proxy和https_proxy环境变量是否存在。问题在于还有其他选项(不涉及这些变量)来配置代理设置。 - aloctavodia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接