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