测试Ruby抓取gem
最近有不少抓取的需求,因为之前看到Ruby写的很方便,就拿过来用了。一开始用的就是nokogiri的默认代码(就是nokogiri页面上的那个),也没进行优化和引入多线程。后面随着需求的增加和变化(例如先抓取列表页,然后详情),需要引入多线程了,看到推荐,选择了typhoeus。
忙完了,顺手测试一下目前一些gem,按照ruby-toolbox的排名随便挑几个测试一下:
单线程: rest-client,httparty,faraday,mechanize (可以支持session和cookies,自动化库)。
多线程: typhoeus,em-http-request。
测试的条件:最简单的抓取页面(不解析),分别测试10,100,200,1000次消耗的时间(通过Benchmark.bmbm统计,关于 benchmark 的文章,详见参考1)。
单线程测试结果:200个以内的Mechanize最快,500个及以上就Error:too many connection resets,按照错误来看,底层都是调用rest-client的。
多线程测试结果:200个以内,typhoeus 和 em-http-request 不相上下,500个及以上typhoeus快。
PS: 1,因为只测试了10,100,200,500,1000这几个值,因此结论也是按照这几个分界点来粗略判断的,详细的分界点需要更详细的测试(例如那个分界点之后xxx比yyy快),这里暂不涉及。
2,测试代码比较粗劣,如果有错,欢迎联系我指出。多谢。
单线程测试代码及结果:
https://gist.github.com/cashplk/7173445
多线程测试代码及结果:
https://gist.github.com/cashplk/7173472
参考文章:
1,How do I benchmark Ruby code? : 地址
Originally published at cashplk.logdown.com on October 27, 2013.