9.1.3 网络爬虫的框架
在Python中,网络爬虫的框架有很多,常用的框架主要有Scrapy、Pyspider、Cola等。
1.Scrapy框架
Scrapy框架是Python中最著名、最受欢迎的框架。它是一个相对成熟的框架,有着丰富的文档和开放的社区交流空间。Scrapy框架是为了爬取网站数据,提取结构性数据而编写的应用框架,可以应用在数据挖掘、信息处理或存储历史数据等一系列的程序中。Scrapy使用Twisted这个异步网络库来处理网络通信,架构清晰,并且包含各种中间件接口,可以灵活地完成各种需求。Scrapy框架具有以下优点。
①极其灵活的定制化爬取。
②社区人数多、文档完善。
③URL去重采用布隆过滤器方案。
④可以处理不完整的HTML,Scrapy提供了selectors(在lxml的基础上提供了更高级的接口),可以高效地处理不完整的HTML代码。
其缺点如下。
①不支持分布式部署。
②不支持抓取JavaScript的页面。
③全命令行操作,对用户不友好,需要一定的学习周期。
Scrapy的基本结构如图9-2所示。
2.Pyspider框架
Pyspider是一个中国人编写的强大网络爬虫系统并带有强大的WebUI,采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器、任务监视器、项目管理器以及结果查看器。Pyspider的基本结构如图9-3所示。
Pyspider非常强大,强大到更像一个产品,而不是一个框架。Pyspider的主要功能包括:抓取、更新、调度多站点的特定页面;需要对页面进行结构化信息提取;灵活可扩展,稳定可监控。Pyspider满足了绝大多数Python爬虫的需求——定向抓取,结构化解析。但是面对结构迥异的各种网站,单一的抓取模式并不一定能满足需求,灵活的抓取控制是必需的。为了达到这个目的,单纯地配置文件往往不够灵活,于是,通过脚本去控制抓取成了最后的选择。以去重调度、队列、抓取、异常处理、监控等功能作为框架,提供给抓取脚本,并保证灵活性。最后加上Web的编辑调试环境,以及Web任务监控,即成了最终的框架。
图9-2 Scrapy的基本结构
图9-3 Pyspider的基本结构
优点:
①支持分布式部署。
②完全可视化,对用户非常友好。Web界面编写调试脚本,起停脚本,监控执行状态,查看活动历史,获取结果产出。
③简单易上手。脚本规则简单,开发效率高。
④支持抓取JavaScript的页面。
缺点:
①URL去重使用数据库,而不是布隆过滤器,亿级存储的db io将导致效率急剧降低。
②使用上的人性化牺牲了灵活度,定制化能力低。
3.Cola框架
Cola框架是一个分布式的爬虫框架,用户只需要编写几个特定的函数,而无须关注分布式运行的细节,任务会被自动分配到多台机器上,整个过程对用户是透明的。Cola基本结构如图9-4所示。
图9-4 Cola基本结构
在Cola集群里,当一个任务被提交的时候,Cola Master和Worker会分别启动JobMaster和JobWorker。对于一个Cola Job,当JobWorker启动完成后,会通知JobMaster,JobMaster等待所有JobWorker启动完成后开始运行Job。在一个Cola Job启动时,会启动一个消息队列(message queue,主要操作是put和get,Worker抓取的对象会被put到队列中,而要抓取新的对象时,只要从队列中取即可),每个JobWorker上都存在消息队列节点,同时会有一个去重模块(布隆过滤器实现)。