分布式爬虫—原理与实现

分布式爬虫,就是…我还是上图吧
先来看scrapy的结构图

原理

《分布式爬虫—原理与实现》 image.png

这就是scrapy爬虫框架的流程
从下往上看,Spiders生成的请求经由Scheduler调度器发送给Downloader下载器,Downloader下载器从internet下载所需要的网络数据,返回response给Spiders,Spiders接着把数据放进item容器
而scrapy-redis就是建立一个redis队列,调度器把Spiders生成的请求发送给redis队列,再用Scheduler从队列里取出请求,其他爬虫也可以从队列中取出请求。

《分布式爬虫—原理与实现》 scrapy-redis .jpg

《分布式爬虫—原理与实现》 队列与调度.jpg

每一个爬虫的调度器Scheduler都从队列中取出请求和存入请求,这样就实现多个爬虫,多台机器同时爬取的目标
scrapy-redis分布式框架还有两个常用的功能,去重和启动判断(可以接着暂停的地方继续爬)

怎么用

pip3 install scrapy
pip3 install scrapy-redis
在settings中替换调度器

SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 300
}#把item存到远程主机的redis中,好处是可以集中存储,坏处的降低速度
REDIS_HOST = 'localhost'#远程主机中redis的host和端口
REDIS_PORT = 6379
如果redis有密码
用REDIS_URL = 'redis://user:pass@hostname:9001'
SCHEDULER_FLUSH_ON_START = True#False是重启爬虫后请求队列,重新爬取,默认是注释掉,不用改

至于去重,scrapy-redis的队列会为每个请求生成一个指纹,把请求存入队列中时会先判断指纹,重复就不存。
什么?你还不会再服务器中安装redis,那还玩什么分布式爬虫,赶紧来这里学

    原文作者:我想宿舍的瞄姬了
    原文地址: https://www.jianshu.com/p/65feea239bcd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞