本文紧接上篇博客,在上一篇博客中我们讲解了如何使用编程的方式运行Scrapy spider。本文将讲解如何通过维护多个网站的爬取规则来抓取各个网站的数据。
具体要实现的目标是这样的,有一张 Rule表用来存储各个网站的爬取规则,Scrapy获取 Rule表中的记录后,针对每一条rule自动生成一个spider,每个spider去爬它们各自网站的数据。这样我们只需要维护Rule表中的规则(可以写个Web程序来维护),而不用针对上千个网站写上千个spider文件了。
我们使用 SQLAlchemy来映射数据库,Rule表的结构如下:
接下来我们要重新定制我们的spider,命名为 DeepSpider,让他能够通过rule参数初始化。我们令 DeepSpider继承自
CrawlSpider,一个提供了更多强大的规则(rule)来提供跟进link功能的类。 deep_spider.py长这个样子:
要注意的是 start_urls, rules等都初始化成了对象的属性,都由传入的 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上看到本文的完整项目。
原文:http://wuchong.me/blog/2015/05/22/running-scrapy-dynamic-and-configurable/
0 Comments