笔者近期有一个特定网站全站爬取的需求因为全站数据量大,又希望时间开销小作为一个入门级的爬虫工作者,根据以往经验笔者(主要使用python
编程)设想了以下几種方案:
1、用 selenium
模拟浏览器爬虫,自己改造框架使得可以多层全站爬取。
这里模拟浏览器的好处在于可以加载运行JS
脚本,能够解决一些JS
腳本动态生成链接的问题但是对于全站爬取而非特定页面,这样的时间开销很大工作也很复杂,不太适合入门级的选手(关于时间開销,如果有加速的办法和分布式解决方案请给笔者留言)
尽管可以限制爬取的文件类型和爬取深度但是命令行的参数可配置性非常有限。最重要的是简单暴力的wget
给人的感觉应该是快,而实际上wget
的爬取速度很慢尤其是对于一个大站点,据笔者的经验scrapy
5分钟的工作量,wget
1個小时才能完成
另外,要想加速爬取需要多线程和分布式,笔者调研了wget
的多线程版本mwget
完全只有大文件下载加速功能(没有wget
的各种功能)。所以wget
方案可定制性差速度慢,没有现成的多线程解决方案
3、scrapy
这个非常成熟的爬虫框架,用python
实现有无数先辈实践,而且有基于redis
嘚分布式版本其优点不再赘述。
笔者在实现了简易的定制scrapy
爬虫后把分布式爬取提上了日程。在搜索资料的时候发现了一款名为 gerapy
软件,网上介绍说可以实现分布式爬取下面记录实践经历。
scrapyd 这里要注意的是,安装并不会生成conf
文件笔者发现很多介绍的文章中都指出默認的管理接口是127.0.0.1:6800
,为了使master
节点可以远程控制它需要改配置文件。官方的说明文档中说明了scrapyd
运行时搜索配置文件的位置和优先级却没有說明需要自己建立配置文件。(重要!!!)
运行项目操作很简单不再赘述。这里笔者要说的是gerapy
目前能够实现的分布式不是scrapy-redis
的分布式即并不能将一个任务用多个主机加速进行。现在gerapy
能够做到的是将相同或不同的任务分配给不同主机集中管理,但完全不能加速某一个特定项目(划重点!!!)
它的TODO
列表中有真正的分布式实现但是目前还有很大的距离。虽然你不能要求开源项目本身太多笔者也很感激gerapy
的作者為爬虫工作者开发管理界面,但是还是希望转载宣传的人能够准确的描述项目以免带来歧义。