scrapy爬虫之gerapy和scrapyd

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 笔者还在学习之中,后续会分享更多的实践经验。

你可能感兴趣的:(网络测试)