自detect代理设置 Linux

3 投票
1 回答
5257 浏览
提问于 2025-04-17 01:43

我正在写一个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 个回答

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的)。

撰写回答