简单的Python HTTP代理?
我到处找,发现了成千上万的Python代理服务器,但没有一个能完全满足我的需求(我觉得是这样:s)。
我对Python有一定的经验,但对HTTP协议的深奥知识还很陌生。
我觉得一个非常简单的代理示例会很有用,这个代理可以连接到,然后它会尝试连接到传给它的地址。
另外,我觉得让我困惑的是那些隐藏的东西在做什么,比如当一个类继承自BaseHTTPServer.BaseHTTPRequestHandler时,请求一个页面时到底发生了什么。在我找到的很多例子中,没有提到路径变量,但突然之间,self.path就被用在一个函数里。我猜这是继承来的,但它是怎么得到这个路径的呢?
抱歉如果我说得不太清楚,因为我对自己问题的理解可能有点混乱 :(
如果你能想到什么能让我的问题更清楚的建议,请一定告诉我。谢谢!
编辑:
另外,如果能提供一个链接,解释代理处理请求的详细过程,包括如何请求页面(在这个时候如何读取/修改数据)并将其传递给原始请求者,我会非常感激。谢谢!
3 个回答
proxpy 看起来很不错,它可以很简单地修改请求和响应。
来自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()
这是一个非常简单的代理示例,连接后它会尝试连接到传给它的地址。这几乎就是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*
方法被调用之前就已经设置好的。