分布式爬取
概念:在多台机器上执行同一个爬虫程序,实现网站数据的分布式爬取
原生scrapy不可以实现分布式爬虫,原因如下:
- 调度器无法在多台电脑上共享
- 管道无法共享
分布式爬虫组件:scrapy-redis,该组件可以让scrapy实现分布式。
- pip install scrapy-redis
分布式爬取流程:
- redis数据库安装
- redis文件配置
- 将bind 127.0.0.1注销掉
- 将保护模式改为no,关闭保护模式,即protected-mode no
- 基于配置文件启动redis服务器
代码流程:
- 创建scrapy工程,创建基于crawlSpider的项目
- 从scrapy_redis.spiders中导入RedisCrawlSpider,并将项目的父类由CrawlSpider改为RedisCrawlSpider
- 指定redis_key,指定start_urls在redis数据库中存放的位置
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from scrapy_redis.spiders import RedisCrawlSpider class QiubaiSpider(RedisCrawlSpider): name = 'qiubai' allowed_domains = ['https://www.qiushibaike.com/imgrank/'] # start_urls = ['http://https://www.qiushibaike.com/imgrank//'] #表示start_urls在redis中存放的位置,作用类似start_urls redis_key="qiubaispider" rules = ( Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True), ) def parse_item(self, response): item = {} #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get() #item['name'] = response.xpath('//div[@id="name"]').get() #item['description'] = response.xpath('//div[@id="description"]').get() return item
- 配置setting文件,将项目的管道和调度器配置成基于scrapy-redis组件对应提供的功能
#使用组件封装的管道,不使用原生的管道 ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300, } # 使用scrapy-redis组件的去重队列进行去重操作 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 使用scrapy-redis组件自己的调度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 是否允许暂停,即程序意外宕机重启后从上次意外退出的地方重新爬取 SCHEDULER_PERSIST = True #Redis服务器地址,代码拷贝到其他服务器后,爬取的数据将保存到如下地址的redis服务器中 REDIS_HOST="192.168.1.1" #Redis服务器端口 REDIS_PORT=6379
- 执行爬虫文件,进入爬虫目录scrapy runspider qiubai.py,启动后爬虫就开始监听redis的qiubaispider键对应的内容
- 将起始url放入redis中:127.0.0.1:6379> lpush qiubaispider https://www.qiushibaike.com/pic/
- 开始爬取内容
基于RedisSpider实现分布式爬虫
UA池:user-agent池
代理池:对代理IP进行批量更换
selenium如何应用到scrapy框架