zoukankan      html  css  js  c++  java
  • 使用scrapy-redis 搭建分布式爬虫环境

     scrapy-redis 简介

       scrapy-redis 是 scrapy 框架基于 redis 数据库的组件,用于 scraoy 项目的分布式开发和部署。

      有如下特征:

        分布式爬取:

          你可以启动多个 spider 工程,相互之间共享单个的 requests 队列,最适合广泛的多个域名的内容的抓取。

      分布式数据处理:

        爬取到的 scrapy 的 item 数据可以推入到 redis 队列中,着意味着你可以根据需求启动尽可能多的处理程序来共享 item 队列,进行 item 数据持久化处理

      scrapy 即插即用的组件:

        Scheduler 调度器+ Duplication 复制 过滤器, Item Pipeline, 基本 spider 

    scrapy-redis 架构

    1、首先 Slave 端从 Master 端那任务 (Requests, Url ) 进行数据抓取,Slaver 抓取数据的同时,产生新任务 Request编提交给 Master 处理。

    2、Master 端只有一个 Redis 数据库,负责处理的 Request 去重任务分配,将处理后的 Ruqest 加入待爬队列,并且存储爬取的数据,Scrapy-redis 默认使用的就是这种策略,我们实现起来很简单,因为任务调度等工作 Scrapy-redis都已经帮我们做好了,我们只需要继承 RedisSpider 、指定redis_key 就行了。

    缺点是:

      Scrapy-redis 调度的任务是 Request 对象,里面的信息量比较大(不仅包括url,还有 callback、header 等信息)

      可能导致的结果是会降低爬虫速度,而且会占用 Redis 大量的存储空间,所以如果要保证效率,那么就需要一定的硬件水平。

    scrapy-redis安装

      通过 pip 安装即可, pip install scrapy-redis

      一般需要 python、redis、scrapy 这三个安装包

      官方文档:https://scrapy-redis.readthedocs.io/en/stable/ 

      源码位置:https://github.com/rmax/scrapy-redis 

      参考博客:https://www.cnblogs.com/kylinlin/p/5198233.html

    scrapy-redis 常用配置

      一般在配置文件中添加如下几个常用的配置选项:

      1、(必须)使用了 scrapy-redis 的去重组件,在 redis 数据库中去重

    DUPEFILTER_CLASS = "scrapy-redis.dupefilter.RFPDupeFiter"

      2、(必须)使用了 scrapy-redis 的调度器,在 redis 里分配请求

    SCHEDULER = "scrapy_redis.scheduler.Scheduler"

      3、(可选)在 redis 中保持 scrapy-redis 用到的各个队列,从而允许暂停和暂停后恢复,也就是不清理 redis requests

    SCHEDULER_PERSIST = True

      4、(必须)通过配置 RedisPipeline 将 item 写入 key 为 spider .name:items 的 redis 的list 中。供后面的分布式处理item 这个已经有 scrapy-redis 实现,不需要写代码,直接使用即可:

    ITEM_PIPELINE = {
         "scrapy_redis.pipeline.RedisPipeline":100,
    }

      5、(必须)指定 redis 数据库的连接参数:

    REDIS_HOST = 127.0.0.1
    REDIS_PORT = 6309A

    Scrapy_redis 键名介绍

      scrapy-redis 中都是用 key-value 形式存储数据,其中有几个常见的 key-value 形式:

      1、“项目名:items” --> list 类型。保存爬虫获取到数据 item 内容是 json 字符串

      2、“项目名:dupefilter” --> set 类型,用于爬虫访问 url 去重内容是 40 个字符的 url 的 hash 字符串

      3、“项目名:start_url:” --> list 类型,用于获取 spider 启动是爬取的第一个 url 

      4、”项目名: requests“ --> zset 类型。用于scheduler 调度处理 requests 内容是 requests 对象的序列化字符串

    Scrapy-redis 简单实例

      在原来非分布式爬虫的基础上,使用scrapy-redis 简单搭建一个分布式爬虫,过程只需要修改以下spider 的继承和配置文件即可,很简单:

      首先修改配置文件,在 setting.py 文件中添加代码:

      

    DUPEFILTER_CLASS = "scrapy-redis.dupefilter.RFPDupeFiter"
    SCHEDULER = “scrapy-redis.scheduler.Scheduler”
    SCHEDULER_PERSIST = True
    ITEM_PIPELINE = {
        “scrapy-redis.pipelines,RedisPipeline”:300,
    
    }
    REDIS_HOST = '127.0.0.1'
    REDIS_PORT = 6379

    然后需要修改的文件,是 spider 文件,源文件代码为:

      

     修改为:

      

    # -*0- coding: utf-8 -*-
    import scrapy
    from scrapy_redis.spider import RedisSpider
    
    from tencent,items import TencentItem, DetailItem
    
    class TencetWantedSpider(RedisSpider):
        name = 'tencent_wanted'
        # allowed_domain = ["hr.rencent.com"]
    
        # start_url = ["https://hr.tencent.com/position.php"]
        redis_key = 'tencent:start_urls'
        base_url = 'tencent://hr.tencent.com/'
        
    
        def parse(self, response):
            ...

    只修改了两个地方,一个是继承类: 由 scrapy.Spider 修改为 RedisSpider 

    然后 start_url 已经不需要了,修改为: redis)key = “xxxx” ,其中,这个键的值暂时是自己取得名字

    一般用项目名, start_urls 来代替初始爬取的 url ,由于分布式 scray-redis 中每个请求都是从 redis 中 取出来的,因此,在redis 数据库中,设置一个 redis_key的值,作为初始的 url ,scrapy 就会自动在 redis 中 去除 redis_key 的值,作为初始 url ,实现自动爬取。

    因此,来到 redis 中,添加代码:

     

     即:

      在 redis 中设置了一个键值对,键为 tencent2:start_urls,值为:初始化url.即可将传入的 url 作为初始爬取的 url。

      如此一来,分布式爬虫搭建完毕!

      

  • 相关阅读:
    JS 数组总结
    JS 数据类型及其判断
    CSS 优先级
    正则表达式及其使用例子
    常见的图片格式
    React 箭头函数的使用
    手动搭建 react+webpack 开发环境
    JS 函数参数及其传递
    JS 中的 this 指向问题
    JS 中函数的 length 属性
  • 原文地址:https://www.cnblogs.com/jcjc/p/11613411.html
Copyright © 2011-2022 走看看