Python爬虫框架Scrapy教程(2)—动态可配置

本文紧接上篇博客,在上一篇博客中我们讲解了如何使用编程的方式运行Scrapy spider。本文将讲解如何通过维护多个网站的爬取规则来抓取各个网站的数据。

具体要实现的目标是这样的,有一张Rule表用来存储各个网站的爬取规则,Scrapy获取Rule表中的记录后,针对每一条rule自动生成一个spider,每个spider去爬它们各自网站的数据。这样我们只需要维护Rule表中的规则(可以写个Web程序来维护),而不用针对上千个网站写上千个spider文件了。

我们使用 SQLAlchemy 来映射数据库,Rule表的结构如下:

 

接下来我们要重新定制我们的spider,命名为DeepSpider,让他能够通过rule参数初始化。我们令DeepSpider继承自 CrawlSpider,一个提供了更多强大的规则(rule)来提供跟进link功能的类。deep_spider.py长这个样子:

要注意的是start_urlsrules等都初始化成了对象的属性,都由传入的rule对象初始化,parse_item方法中的抽取规则也都有rule对象提供。

为了同时运行多个spider,我们需要稍稍修改上节中的运行脚本run.py,如下所示:

我们从数据库中查出启用的rules,并对于rules中每一个规则实例化一个DeepSpider对象。这儿的一个小技巧是建立了一个RUNNING_CRAWLERS列表,新建立的DeepSpider对象 spider 都会加入这个队列。在 spider 运行完毕时会调用spider_closing方法,并将该spider从RUNNING_CRAWLERS移除。最终,RUNNING_CRAWLERS中没有任何spider了,我们会停止脚本。

运行run.py后,就能对Rule表中网站进行爬取了,但是我们现在还没有对爬下来的结果进行存储,所以看不到结果。下一篇博客,我们将使用 Scrapy 提供的强大的 Pipline 对数据进行保存并去重。

现在我们可以往Rule表中加入成百上千个网站的规则,而不用添加一行代码,就可以对这成百上千个网站进行爬取。当然你完全可以做一个Web前端来完成维护Rule表的任务。当然Rule规则也可以放在除了数据库的任何地方,比如配置文件。

由于本人刚接触 Scrapy 不久,如有理解不当之处或是更好的解决方案,还请不吝赐教 :)

你可以在 GitHub 上看到本文的完整项目。

注:本文使用的 Scrapy 版本是 0.24,GitHub 上的master分支已支持 Scrapy 1.0

本系列的三篇文章

  1. Python爬虫框架Scrapy教程(1)——入门
  2. Python爬虫框架Scrapy教程(2)—动态可配置
  3. Python爬虫框架Scrapy教程(3)—使用Redis和SQLAlchemy对Scrapy Item去重并存储

参考资料

文/wuchong

1 Likes

你目前的身份是游客,评论请输入昵称和电邮!