简单的Python HTTP代理?

31 投票
3 回答
102819 浏览
提问于 2025-04-16 08:22

我到处找,发现了成千上万的Python代理服务器,但没有一个能完全满足我的需求(我觉得是这样:s)。

我对Python有一定的经验,但对HTTP协议的深奥知识还很陌生。

我觉得一个非常简单的代理示例会很有用,这个代理可以连接到,然后它会尝试连接到传给它的地址。

另外,我觉得让我困惑的是那些隐藏的东西在做什么,比如当一个类继承自BaseHTTPServer.BaseHTTPRequestHandler时,请求一个页面时到底发生了什么。在我找到的很多例子中,没有提到路径变量,但突然之间,self.path就被用在一个函数里。我猜这是继承来的,但它是怎么得到这个路径的呢?

抱歉如果我说得不太清楚,因为我对自己问题的理解可能有点混乱 :(

如果你能想到什么能让我的问题更清楚的建议,请一定告诉我。谢谢!

编辑:

另外,如果能提供一个链接,解释代理处理请求的详细过程,包括如何请求页面(在这个时候如何读取/修改数据)并将其传递给原始请求者,我会非常感激。谢谢!

3 个回答

5

proxpy 看起来很不错,它可以很简单地修改请求和响应。

17

来自twisted的维基百科

from twisted.web import proxy, http
from twisted.internet import reactor
from twisted.python import log
import sys
log.startLogging(sys.stdout)

class ProxyFactory(http.HTTPFactory):
    protocol = proxy.Proxy

reactor.listenTCP(8080, ProxyFactory())
reactor.run()
41

这是一个非常简单的代理示例,连接后它会尝试连接到传给它的地址。这几乎就是HTTP代理的定义。

这里有一个非常简单的代理示例:http://effbot.org/librarybook/simplehttpserver.htm

它的核心部分只有3行代码:

class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        self.copyfile(urllib.urlopen(self.path), self.wfile)

所以这是一个SimpleHTTPRequestHandler,在收到GET请求后,它会打开路径中的URL(代理请求通常看起来像是“GET http://example.com/”,而不是“GET /index.html”)。然后它会把从那个URL读取到的内容复制到响应中。

需要注意的是,这个示例真的很简单。它完全不处理头信息,我想。

顺便提一下:path的相关信息可以在http://docs.python.org/library/basehttpserver.html找到。它是在你的do*方法被调用之前就已经设置好的。

撰写回答