分布式爬虫与增量式爬虫

首先要说一下scrapy-redis

  配置文件settings主要配置Scrapy_Redis的功能,其中配置SCHEDULER是改变Scrapy原有的调度器。当项目运行的时候,Scrapy从配置文件中读取配置信息,根据配置信息运行Scrapy_Redis的功能,使得整个项目的调度器Scheduler和Spider都是Scrapy_Redis定义的,从而实现了分布式爬虫

从Scrapy_Redis的分布式爬虫原理得知,当前请求的URL地址和响应内容都已经保存在Redis数据库的时候,Scrapy不再对当前请求发送HTTP请求,而是直接执行下面一条请求,这样可以防止分布式的爬虫程序重复爬取,从而保证了数据的唯一性

  根据分布式爬虫的原理可以衍生出一种新的使用方式--增量式爬虫。增量式爬虫是在已经保存网站部分数据的情况下,当再次运行爬虫的时候,它不会对应有的数据重复爬取,只爬取数据库中尚未保存的数据,分布式爬虫Scrapy_Redis也可以作为增量式爬虫,此外还可以在Scrapy项目里自主开发增量式爬虫,,实现的方式和Scrapy_Redis的大差不差

  自主开发增量式爬虫的两种方式:基于管道实现增量式爬虫和中间件实现增量式。两个在Scrapy的不同文件中实现

  基于管道实现增量式爬虫是在pipelineswenjian的process_ite()方法内判断数据是否已经保存在redis数据库中,如果存在则不做数据库入库处理,反之就将当前数据写入到Redis数据库和目标数据库中

  基于中间件实现增量式爬虫,是在middlewares文件中定义中间件,判断当前请求的URL地址是否已经存在在Redis数据库中,如果存在就跳过当前请求并且直接执行下一个请求,反之就讲当前的URL地址写入Redis数据库并对该请求向下执行

基于管道实现增量式爬虫

  基于管道实现是将Scrapy_Redis的pipelines单独使用,它最大的有点是对以访问的URL地址重复访问并且获得数据,这样可以及时更新数据的动态变化

  应用场景:

    排行榜、论坛贴吧等网站的爬取;

  缺点:

    它会对URL地址重复的访问,如果网站数据固定不变就会造成网络资源的浪费,同时也增大了反爬虫机制检测的风险

  实现管道增量式爬虫可以使用Scrapy_Redis的pipelines文件的RedisPipeline类,不过他会涉及到Scrapy_Redis其他文件的使用。为了简化功能的复杂度,可以根据原理在项目的pipelines文件编写相对应的功能就可以了,

基于中间件实现增量式爬虫

  基于中间件实现增量式爬虫是在发送HTTP请求之前,首先要对该请求的URL地址进行判断,如果该URL地址在此之前已经发送过HTTP请求,则本次请求将不再往下执行了,这样可以避免同一个URL地址的重复访问。因此自定义中间件主要对当前请求的URL地址进行判断,根据不同的判断结果执行不同的处理方式

总结

  基于管道实现增量式爬虫是在pipelines文件的process_item()方法里判断数据是否保存在Redis数据库,如果存在则不需要做数据库入库处理,反之就需要将当前数据写入Redis数据库和目标数据库

  基于中间件实现的增量式爬虫是在middlewares文件里定义中间件,判断当前请求的URL地址是否已经存在于Redis数据库中,如果存在则跳过当前请求并直接执行下一个请求,反之就需要将当前的URL地址写入到Redis数据库并对该请求向下执行

猜你喜欢

转载自www.cnblogs.com/tulintao/p/11594481.html