• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Scrapy_redis框架原理并实现断点续爬以和分布式爬虫

武飞扬头像
IT之一小佬
帮助1

1. 下载github的demo代码

1.1 clone github scrapy-redis源码文件

git clone https://github.com/rolando/scrapy-redis.git

学新通

学新通

学新通

 cd到示例项目中:

学新通

学新通

安装缺少的scrapy-redis模块: pip install scrapy-redis

学新通

学新通

学新通

 启动爬虫:

学新通

 把启动的爬虫中止,在RDM中查看爬虫的结果:学新通

 此时发现数据队列中有174条数据,接下来继续启动爬虫,观察数据的变化:

学新通

学新通

 以上就实现断点续爬

1.2 研究项目自带的demo

mv scrapy-redis/example-project ~/scrapyredis-project

2. 观察dmoz文件

        在domz爬虫文件中,实现方式就是crawlspider类型的爬虫。

dmoz.py文件

  1.  
    from scrapy.linkextractors import LinkExtractor
  2.  
    from scrapy.spiders import CrawlSpider, Rule
  3.  
     
  4.  
     
  5.  
    class DmozSpider(CrawlSpider):
  6.  
    """Follow categories and extract links."""
  7.  
    name = 'dmoz'
  8.  
    allowed_domains = ['dmoz-odp.org']
  9.  
    start_urls = ['http://www.dmoz-odp.org/']
  10.  
     
  11.  
    # 定义数据提取规则,使用了css选择器
  12.  
    rules = [
  13.  
    Rule(LinkExtractor(
  14.  
    restrict_css=('.top-cat', '.sub-cat', '.cat-item')
  15.  
    ), callback='parse_directory', follow=True),
  16.  
    ]
  17.  
     
  18.  
    def parse_directory(self, response):
  19.  
    for div in response.css('.title-and-desc'):
  20.  
    yield {
  21.  
    'name': div.css('.site-title::text').extract_first(),
  22.  
    'description': div.css('.site-descr::text').extract_first().strip(),
  23.  
    'link': div.css('a::attr(href)').extract_first(),
  24.  
    }
学新通

        在settings.py中多了以下内容,这几行表示scrapy_redis中重新实现的了去重的类,以及调度器,并且使用RedisPipeline管道类

  1.  
    # 设置重复过滤器的模块
  2.  
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
  3.  
    # 设置调取器, scrapy_redis中的调度器具备与数据库交互的功能
  4.  
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
  5.  
    # 设置当爬虫结束的时候是否保持redis数据库中的去重集合与任务队列
  6.  
    SCHEDULER_PERSIST = True
  7.  
     
  8.  
    ITEM_PIPELINES = {
  9.  
    'example.pipelines.ExamplePipeline': 300,
  10.  
    # 当开启该管道,该管道将会把数据库存到redis数据库中
  11.  
    'scrapy_redis.pipelines.RedisPipeline': 400,
  12.  
    }
  13.  
    # 设置redis数据库
  14.  
    REDIS_URL = "redis://127.0.0.1:6379"

3. 运行dmoz爬虫,观察现象

3.1首先需要添加redis的地址,程序才能够使用redis

  1.  
    REDIS_URL = "redis://127.0.0.1:6379"
  2.  
    #或者使用下面的方式
  3.  
    # REDIS_HOST = "127.0.0.1"
  4.  
    # REDIS_PORT = 6379

3.2执行domz的爬虫,会发现redis中多了一下三个键:

学新通

3.3中止进程后再次运行dmoz爬虫

        继续执行程序,会发现程序在前一次的基础之上继续往后执行,所以domz爬虫是一个基于url地址的增量式的爬虫

4. scrapy_redis的原理分析

从settings.py中的三个配置来进行分析 分别是:

  • RedisPipeline # 管道类
  • RFPDupeFilter # 指纹去重类
  • Scheduler # 调度器类
  • SCHEDULER_PERSIST # 是否持久化请求队列和指纹集合

4.1 Scrapy_redis之RedisPipeline

RedisPipeline中观察process_item,进行数据的保存,存入了redis中

学新通

4.2 Scrapy_redis之RFPDupeFilter

RFPDupeFilter 实现了对request对象的加密

学新通

4.3 Scrapy_redis之Scheduler

scrapy_redis调度器的实现了决定什么时候把request对象加入带抓取的队列,同时把请求过的request对象过滤掉

学新通

4.4 request对象入队的条件

  • request的指纹不在集合中
  • request的dont_filter为True,即不过滤
    • start_urls中的url地址会入队,因为他们默认是不过滤

5. 实现分布式爬虫

5.1 分析demo中代码

打开example-project项目中的myspider_redis.py文件

通过观察代码:

  1. 继承自父类为RedisSpider
  2. 增加了一个redis_key的键,没有start_urls,因为分布式中,如果每台电脑都请求一次start_url就会重复
  3. 多了__init__方法,该方法不是必须的,可以手动指定allow_domains
  4. 启动方法:
    1. 在每个节点正确的目录下执行scrapy crawl 爬虫名,使该节点的scrapy_redis爬虫程序就位
    2. 在共用的redis中 lpush redis_key 'start_url',使全部节点真正的开始运行
  5. settings.py中关键的配置
  1.  
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
  2.  
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
  3.  
    SCHEDULER_PERSIST = True
  4.  
     
  5.  
    ITEM_PIPELINES = {
  6.  
    'example.pipelines.ExamplePipeline': 300,
  7.  
    'scrapy_redis.pipelines.RedisPipeline': 400,
  8.  
    }
  9.  
    REDIS_URL = "redis://127.0.0.1:6379"

5.2 实现分布式爬虫

注意:启动方式可以用别的方式:scrapy runspider book.py   可以用相对路径,也可以用绝对路径

学新通

学新通

学新通

分布式爬虫的编写流程:

1.编写普通爬虫

  • 创建项目
  • 明确目标
  • 创建爬虫
  • 保存内容

2.改造成分布式爬虫

2.1改造爬虫

  1. 导入scrapy_redis中的分布式爬虫类
  2. 继承类
  3. 注销start_url&allowed_domains
  4. 设置redis_key获取start_urls
  5. 设置__init__获取允许的域

2.2改造配置文件

  • copy配置参数

分布式爬虫使用场景:

  • 数据量特别巨大
  • 数据要求时间比较紧张

分布式的实现:

  • scrapy_redis实现分布式
  • 普通爬虫实现分布式,实现去重集合与任务队列的共享

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfibkk
系列文章
更多 icon
同类精品
更多 icon
继续加载