如何在python mechanize模块中禁用历史记录?

10 投票
1 回答
2005 浏览
提问于 2025-04-15 20:05

我有一个网络爬虫脚本,每分钟会获取一次新数据,但经过几天后,这个脚本的内存使用量会超过200MB。我发现这是因为mechanize这个库在为.back()函数保留无限的浏览历史。

我查看了文档,找到了浏览器类中的clear_history()函数,每次刷新时我都会调用这个函数,但每次页面刷新后,内存使用量还是会增加2-3MB。 编辑: 嗯,似乎在我调用clear_history之后,它还是继续增加内存使用量,直到大约达到30MB,然后又降回到10MB左右(这是我程序启动时的基本内存量)……有没有办法让这个行为更规律一些?

我该如何阻止mechanize存储这些信息?我并不需要保留任何数据。我希望我的Python脚本内存使用量保持在15MB以下。

1 个回答

19

当你创建一个Browser对象时,可以传入一个参数history=whatever; 默认值是None,这意味着浏览器会自动创建一个History类的实例,这样就可以使用backreload功能。最简单的方法是这样做(如果你调用backreload时,会出现属性错误的异常):

class NoHistory(object):
  def add(self, *a, **k): pass
  def clear(self): pass

b = mechanize.Browser(history=NoHistory())

更好的方法是在NoHistory中实现其他方法,这样在错误使用浏览器的backreload时,会给出更清晰的异常提示,但这个简单的方法在其他情况下应该也能满足需求。

需要注意的是,这是一种优雅的(虽然文档不太完善;-))依赖注入设计模式的用法:在一个(唉)“猴子补丁”的世界里,客户端代码会被期望在浏览器实例化后覆盖b._history,但通过依赖注入,你只需传入你想要使用的“历史”对象。我常常认为,依赖注入可能是“Gang of 4”书中没有提到的最重要的设计模式!-)

撰写回答