翻到 这个帖子: https://ruby-china.org/topics/22711
最近看了一下 Python 的 scrapy,感觉没有什么特别的地方,用 Ruby 实现的话技术上也没什么不可行的,甚至更好用(Python 那语法,不说了)。不知道大家有没有 Ruby 爬虫框架的需求。想撸一个。
我在 2 个项目中用到了 scrapy,说真的,感觉自己用 ruby 写可能更灵活一点,scrapy 其实就并发和调度这块做的不错,但是用 ruby+sidekiq+redis 也可以实现
scrapy 挺弱的这个还真不赞同,就爬虫 框架 来说,代码层次的灵活性真不是其它框架能比的。
https://docs.scrapy.org/en/latest/topics/architecture.html
架构清晰,middleware 可以很好的处理用来做些定向网站抓取的异常处理,或 cookies 切换,或 代理 IP 切换。
item pipelines 能够很方便的能数据进行清洗和保存。
而 downloader 对那些保存下载资源的项目来说,也可以很好的把资源下载下来再保存到本地或 s3.
scrapinghub 提供了 Splash 这个库,浏览器集成非常高,支持用 lua 或 js 来定制,对某些情景来说,直接使用它能很简单的处理一些反爬虫。
不过 splash 本身有内存泄漏问题,官方的推荐做是是起两个 docker ,前面再用一个 haproxy 做负载均衡,当一个超内存时,直接重启此 docker .
本身基于 Twisted 异步网络库实现,所以 GIL 的问题影响并没有那么大。
弱点来说,就是基于 Twisted , 数据库驱动和 ORM 对它支持的并不是很好。
相对简单粗爆的处理办理参考 Twisted 官方文档,数据保存另外起线程。否则会阻塞整个 Twisted reactor,在一个页面有很多 items, piplines 的保存反而成为瓶颈。
或使用 redis twisted 库,先保存到 redis,再另外起进程来清洗数据。
就这个弱点来说,如果在 ruby 中使用 EventMachine ,也会存在此问题。
如果纯粹参考 scrapy 来实现的话,感觉还是很难超越它。就 ruby 的 EventMachine 库来说,HTTP Client 还是第三方实现。而 Twisted 官方已经在准备 http2 的实现了。
偏个题,我们目前爬虫没有自己搭,而是用了第三方服务,http://www.shenjianshou.cn/, 功能并不多,但是省去了很多运维成本;
炮哥开坑的话,可以多考虑下运维友好。
Ruby 的 mechanize 还行吧,看过一些标题党,我也可以几行代码爬数据,btw 论文本解析,Ruby 应该比 Python 好用太多。
现在的爬虫趋势是用 headless chrome,通过 amazon lambda 运行,之前写过 2 个脚本,支持 ajax,加上 css selector/xpath,用来抓数据非常方便,大规模爬虫,代理IP,都很容易设置。
如果做爬虫框架的话,求支持这种模式。
自己的淘宝客项目在用 scrapy 抓取数据练手。
公司有其它同事负责的爬虫项目,不过是用 ruby 自己写的,灵活性相对来说比较弱。