使用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。

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

原文地址:https://www.cnblogs.com/jcjc/p/11613411.html

时间: 2024-10-10 21:36:16

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

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

scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征: ? 分布式爬取 您可以启动多个spider工程,相互之间共享单个redis的requests队列.最适合广泛的多个域名网站的内容爬取. ? 分布式数据处理 爬取到的scrapy的item数据可以推入到redis队列中,这意味着你可以根据需求启动尽可能多的处理程序来共享item的队列,进行item数据持久化处理 ? Scrapy即插即用组件 Scheduler调度器 + D

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

在爬虫开发过程中,你肯定遇到过需要把爬虫部署在多个服务器上面的情况.此时你是怎么操作的呢?逐一SSH登录每个服务器,使用git拉下代码,然后运行?代码修改了,于是又要一个服务器一个服务器登录上去依次更新? 有时候爬虫只需要在一个服务器上面运行,有时候需要在200个服务器上面运行.你是怎么快速切换的呢?一个服务器一个服务器登录上去开关?或者聪明一点,在Redis里面设置一个可以修改的标记,只有标记对应的服务器上面的爬虫运行? A爬虫已经在所有服务器上面部署了,现在又做了一个B爬虫,你是不是又得依次

Redis实现分布式爬虫

redis分布式爬虫 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的爬取 原生的scrapy是不可以实现分布式爬虫, 原因如下: 调度器无法共享 管道无法共享 scrapy-redis组件:专门为scrapy开发的一套组件. 该组件可以让scrapy实现分布式 pip install scrapy-redis 分布式爬取的流程: 1 redis配置文件的配置 将 bind 127.0.0.1 进行注释 将 protected-mode no 关闭保护模式 2 redis服务器的开启:基于

redis之分布式爬虫

分布式爬虫一般最少需要三台机器,一台为主服务器,用于生产爬虫任务,其它服务器用于消费爬虫任务. 准备爬取妹子图,主页地址 主服务器生产爬取任务 getUrlList.py #!/usr/bin/env python # _*_ coding:utf-8 _*_ __Author__ = 'KongZhaGen' import requests import bs4 import redis def creUrlList(): # 连接到redis服务器,需要密码 r = redis.Redis(

基于requests+redis的分布式爬虫

简单的网络爬虫是对一个url进行请求,并等待其返回响应.在数据量小的情况下很实用,但是当你的数据量很大,显然分布式爬虫就更占优势!关于分布式,一般是使用一台主机(master)充当多个爬虫的共享redis队列,其他主机(slave)采用远程连接master,关于redis如何安装,这里不多做介绍! 以爬虫伯乐在线的python文章为例,我的分布式爬虫由main01 main02 main03三个python文件构成,main01的主要任务是运行在master上,将文章的url爬取下来存入redi

docker快速搭建分布式爬虫pyspider

简介 pyspider是Python中强大Web爬虫框架,并且支持分布式架构. 为什么使用docker搭建pyspider 在安装pyspider时爬过一些坑,比如使用pip install pyspider时,python的版本要求在3.6及以下,因为async等已经是python3.7的关键字:使用git clone代码安装pyspider,python3 setup.py intall,使用过程会遇到ssl证书的问题,总而言之,可能会遇到版本兼容问题. 使用docker部署pyspider

总结在部署分布式爬虫环境过程中常见的若干问题

1.pip安装的第三方包/本地包都到哪里了? https://blog.csdn.net/yinshuilan/article/details/93590388 2.Running setup.py install for Twisted ... error https://blog.csdn.net/code_AC/article/details/71159244 3.什么是Twisted? https://www.cnblogs.com/tangkaixin/articles/4315697

CK21144-Python分布式爬虫必学框架Scrapy打造搜索引擎

随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到程序开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了.对于学习有困难不知道如何提升自己可以加扣:1225462853进行交流得到帮助,获取学习资料. 下载地址:http://pan.baidu.com/s/1jI05TPW 单机爬虫(Scrapy)到分布式爬虫(Scrapy-Redis)的完美实战 不怕你和别的爬虫课程比较,随便去看,你会明白,慕课网的情怀从来不是

基于Python使用scrapy-redis框架实现分布式爬虫 注

注:本文是在http://www.111cn.net/sys/CentOS/63645.htm,http://www.cnblogs.com/kylinlin/p/5198233.html的基础上加以改动的!版权归alex.shu,kylinlin所有. 1.首先介绍一下:scrapy-redis框架 scrapy-redis:一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能.github地址: https://github.com/darkrho/s