近期做爬虫的一点感想

关于爬虫框架

爬虫框架做了很多的事情,但是要想适合业务场景,还是得对框架进行二次开发,pyspider 是一个很优秀的爬虫框架,但是不方便二次开发。最合适做二开的是 scrapy。老牌抓取引擎 nutch 抓取速度很慢,调过参数之后也无解。

数据量每上升一个量级,采取的解决方法需要做大调整

以我的爬虫系统为例,我的系统中有2w URL 的时候,我只需要用 scrapy,或者 Pyspider,或者基于 multiprogress的多线程库,就可以顺顺利利的完成抓取。

当我的系统有20w URL 需要抓取,我发现Python的GIL有多蛋疼了,我想能不能把多核利用起来,于是启用了 multiprogess+gevent 的模式。

当我的系统有200w URL需要抓取的时候,我发现 multiprogress+gevent 是很不优雅的。不优雅的原因以后慢慢谈,其中一个很严重的问题就是内存泄露。同时一些网络相关的问题也凸显了出来,比如讲上层 DNS 服务器承受不住太高的并发,查询时常超时,比如讲一些域名的访问速度太慢,拖慢了整个爬虫系统的效率。我在这个量级上花了很长时间,因为 pyspider 因为其生成task 的机制(Pyspider 会为每个URL 都生成一个 task 然后写入到后端数据库中),这就意味着 pyspider 需要访问200w 次数据库,并且在之后的爬虫中都对数据库进行查询,这样的开销是巨大的,并且在我们的业务场景里并不需要这样严格的时间爬行。

当我的系统有2000w URL,问题就更多了,其中一个很严重的问题是访问 URL 返回的不是HTML 文档,而是一些多媒体内容,虽然已经使用后缀过滤了很大一部分的静态文件,不过我们的爬虫如果遇上了多媒体内容会有很大问题,比如讲高的内存占用,比如讲会将对方机器的上行带宽打满,同时也浪费我们的下行带宽。

当我们的系统中有2亿 URL 时,就需要数据分析上场了,这2亿 URL 中,有很大很大很大一部分是SEO 用的站群,进入这些站群会耗费我们巨大的资源,同时爬虫系统中的 DNS 解析也是一个很大的开销,因为我们的爬虫需要散落在全世界各地的 URL,需要和全世界各地的 URL 进行通信,在解决 DNS 解析开销过大,恶意 SEO 站群的问题前,不能贸然启动爬虫系统。(很多问题还正在被解决)

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.