一、什么是分布式爬虫
之前的爬虫只能在主机爬取,爬取的效率有限。,分布式爬虫则是将多台主机组合起来,共同完成一个爬取任务, 这将大大提高爬取的效率。
Scrapy 单机爬虫中有一个本地爬取队列的Queue,这个队列是利用 deque 模块实现的。 如果新的 Request生成就会放到队列里面,随后request被scheduler调度如果两个 Scheduler 同时从队列里面取 Request,每个 Scheduler都有其对应的 Downloader,那么 在带宽足够、正常爬取且不考虑队列存取压力的情况下, 爬取效率会有什么变化?没错,爬取效率会翻倍。
这样Scheduler 可以扩展多个, Download也可以扩展多个。 而爬取队列 Queue 必须始终为一个,也就是所谓的共享爬取队列。 这样才能保证 Scheduer 从队列里调度某个 Request 之后,其他Scheduler不会重复调度此 Request,就可以做到多个 Schduler 同步爬取
二、具体代码实现
首先创建项目,开启爬虫文件
下一步要在setting中编写代码
ITEM_PIPELINES = {
'CrawlSpiderDemo.pipelines.CrawlspiderdemoPipeline': 300,
# 分布式的爬虫的数据可以不通过本地的管道(数据不需要往本地存),数据需要存在redis数据库中,在这里需要加入一个redis数据库的管道组件
"scrapy_redis.pipelines.RedisPipeline":400
}
# 指定Redis数据库相关配置
# Redis的主机地址
REDIS_HOST = "10.36.133.159"
# 端口号
REDIS_PORT = 6379
#1、调度器需要切换成Scrapy_Redis的调度器(这个调度器是Scrapy_Redis组件对scrapy原生调度器的重写,加入一些分布式调度的算法)
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 2、加入scrapy_redis的去重组件
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 3、爬取过程中是否允许暂停
SCHEDULER_PERSIST = True
三、setting中的代码弄好了。下面返回到爬虫文件中。要把starts_url注释掉
class DushuSpider(RedisCrawlSpider):
name = 'dushu'
allowed_domains = ['dushu.com']
# start_urls = ['https://www.dushu.com/book/1002.html'] # 分布式的爬虫所有的url都是从redis数据库的相关键下面提取
# redis_key这个属性指定了分布式爬虫在获取url的时候从哪些键中获取的
redis_key = "dushu:start_urls"
rules = (
Rule(LinkExtractor(allow=r'/book/100\d_\d+\.html'), callback='parse_item', follow=True),
)
四、命令行终端输入代码,同时打开redis可视化工具(确保数据库已经连接到服务器)
lpush dushu:start_urls https://www.dushu.com/book/1002.html
网友评论