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":,
}

  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”:, }
REDIS_HOST = '127.0.0.1'
REDIS_PORT =

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

  

修改为:

  

# -*- coding: utf- -*-
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。

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

使用scrapy-redis 搭建分布式爬虫环境的更多相关文章

  1. 基于Python,scrapy,redis的分布式爬虫实现框架

    原文  http://www.xgezhang.com/python_scrapy_redis_crawler.html 爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色.相比于其他 ...

  2. Scrapy+redis实现分布式爬虫

    概述 什么是分布式爬虫 需要搭建一个由n台电脑组成的机群,然后在每一台电脑中执行同一组程序,让其对同一网络资源进行联合且分布的数据爬取. 原生Scrapy无法实现分布式的原因 原生Scrapy中调度器 ...

  3. 使用scrapy-redis搭建分布式爬虫环境

    scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征:  分布式爬取 您可以启动多个spider工 ...

  4. 使用Docker Swarm搭建分布式爬虫集群

    https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653195618&idx=2&sn=b7e992da6bd1b2 ...

  5. scrapy——7 scrapy-redis分布式爬虫,用药助手实战,Boss直聘实战,阿布云代理设置

    scrapy——7 什么是scrapy-redis 怎么安装scrapy-redis scrapy-redis常用配置文件 scrapy-redis键名介绍 实战-利用scrapy-redis分布式爬 ...

  6. 基于scrapy框架的分布式爬虫

    分布式 概念:可以使用多台电脑组件一个分布式机群,让其执行同一组程序,对同一组网络资源进行联合爬取. 原生的scrapy是无法实现分布式 调度器无法被共享 管道无法被共享 基于 scrapy+redi ...

  7. scrapy如何实现分布式爬虫

    使用scrapy爬虫的时候,记录一下如何分布式爬虫问题: 关键在于多台主机协作的关键:共享爬虫队列 主机:维护爬取队列从机:负责数据抓取,数据处理,数据存储 队列如何维护:Redis队列Redis 非 ...

  8. 阿里云Centos7.6上面部署基于redis的分布式爬虫scrapy-redis将任务队列push进redis

    Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取.但是当我们要爬取的页面非常多的时候,单个服务器的处理能力就不能满足我们的需求了(无论是处理速度还是网络请 ...

  9. 在阿里云Centos7.6上面部署基于Redis的分布式爬虫Scrapy-Redis

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_83 Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取.但是当我们要爬取的页面非常多的 ...

随机推荐

  1. C语言 fgets

    C语言 fgets #include <stdio.h> char *fgets(char *s, int size, FILE *stream); 功能:从stream指定的文件内读入字 ...

  2. Mongo查询list数组中一个字段大于特定条数

    由于刚刚接触mongodb,很多语法还不是很了解,写的不好的地方请大佬指出 查询的demo数据 { "_id":Object("xxxxxxxx"), &quo ...

  3. pocketsphinx实现连续大词汇量语音识别

    之前有个项目需求是要在客户内网实现一个连续大词汇语音识别功能,由于客户的内网是独立的,不能访问互联网,所以我只能到开源社区去找找碰碰运气了.后来在网上找到了cmusphinx(地址:http://cm ...

  4. Spring Cloud和Spring Boot版本问题导致Nacos 注册失败!

    之前学习consul注册中心的时候就遇到版本问题,这次学习nacos的时候又遇到版本问题,可惜没长记性,排查了一天最后才发现是boot和cloud的版本有问题. 记录一下,防止以后再出现这种浪费时间的 ...

  5. 百炼OJ - 1007 - DNA排序

    题目链接:http://bailian.openjudge.cn/practice/1007 #include<stdio.h> #include<algorithm> usi ...

  6. docker容器 - 进入容器、删除容器

    实验环境 CentOS 7.5 容器 容器是镜像的运行实例.不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层:同时,容器中的应用进程处于运行状态. 进入容器 可使用以下命令进入容器: ...

  7. MyBatis(6)——分页的实现

    分页的实现 a)通过mysql的分页查询语句: 说明:sql的分页语句格式为select * from aaa limit #{startIndex},#{pageSize} //---------- ...

  8. SQLAlchemy -高级查询

    查询 # -*- coding: utf-8 -*-   from sqlalchemy.orm import sessionmaker   from SQLAlchemy.create import ...

  9. oracle建表时出现“标识符无效”错误

    oracle用以下sql语句新建表时,出现"标识符无效"错误: create table users( user_id integer not null, user_name va ...

  10. honoka和格点三角形(牛客寒假训练营day1)

    可以把面积为1的好三角形分成两类分开统计:两条边和两个坐标轴平行:只有一条边和某个坐标轴平行. 对于第一种情况,一定是1*2或者2*1的形式,一个1*2的矩形中含有4个不同的三角形.总数是4*((n- ...