Mechanize的内存问题

Mechanize 来写爬虫是非常轻松的一件事。简单的事情不一定会完美,比方说:

agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 6'
10000.times do
  page = agent.get("http://some.site")
  puts (page/"div#title").text
end

暂且假设 http://some.site 不会封禁你的访问,同时每一次agent.get都返回了正确的页面(网络无问题)。这一万次页面访问有问题吗?

有!问题在于 Mechanize 实在很强大,它模拟自然的浏览器行为,所以默认它会去保留访问历史纪录,并且这个纪录貌似没有加以大小限制!运行这段ruby代码,很快内存使用会上升至 1G 以上。

把历史纪录的大小设为一个合理的值,在这种情况下设为1比较合适:

agent.max_history = 1

再运行这段代码,内存使用在20~30M间波动,非常稳定。