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

时间:2010-03-06 17:01:56

标签: python memory mechanize

我有一个网络抓取脚本,每分钟获取一次新数据,但在几天内,脚本最终使用200mb或更多内存,我发现它是因为机械化保持无限的浏览器要使用的.back()函数的历史记录。

我查看了文档字符串,并找到了浏览器类的clear_history()函数,每次刷新时都会调用它,但是每次刷新页面时仍然会增加2-3mb的内存使用量。 编辑:嗯,好像它在我调用clear_history之后一直做同样的事情,直到我达到大约30mb的内存使用量,然后它清理回到10mb左右(这是我的程序启动的基本内存量)...是否可以更频繁地强制执行此行为?

如何保持机械化存储所有这些信息?我不需要保留它。我想保持我的python脚本低于15mb内存使用率。

1 个答案:

答案 0 :(得分:19)

您可以在实例化history=whatever时传递参数Browser;默认值为None,这意味着浏览器实际实例化History类(允许backreload)。最简单的方法(如果您回调或重新加载,将提供属性错误异常):

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

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

更清洁的方法会在NoHistory中实现其他方法,以便在错误使用浏览器的backreload时提供更明确的例外,但这个简单的方法就足够了。

请注意,这是一个优雅的(尽管没有详细记录;-)使用依赖注入设计模式:在(bleah)“monkeypatching”世界中,客户端代码将被覆盖b._history之后浏览器是实例化的,但是通过依赖注入,您只需传入想要使用的“历史”对象。我经常认为依赖注入可能是最不重要的DP,而不是“4人帮”中的书! - )。