【Scrapy框架基于scrapy-redis实现分布式爬虫】 򓮘

原文: http://blog.gqylpy.com/gqy/370

"Scrapy框架无法自己实现分布式,原因有二

  1. 多台机器上部署的Scrapy各自拥有各自的调度器,这样就使得多台机器无法分配 start_urls 列表中的url,即多台机器无法共享同一个调度器。
  2. 多台机器爬取到的数据无法通过同一个管道进行统一的持久化存储,即多台机器无法共享同一个管道。
    ___

基于 scrapy-redis 组件的分布式爬虫

安装 :pip install scrapy-redis

scrapy-redis组件为我们封装好了可以共享给多台机器的调度器和管道,我们可以直接使用它来实现分布式爬取数据。

scrapy-redis 常见键名

  1. 爬虫名:items list类型,保存爬虫获取到的数据,item对象,内容为JSON字符串。
  2. 爬虫名:dupefilter set类型,用于对爬虫访问过的url进行去重,内容是40个字符的url的hash字符串。
  3. 爬虫名:start_urls list类型,默认的共享调度器名称,可指定为其它名称,用于获取spider启动时爬取的起始url,需手动写入起始url。
  4. 爬虫名:requests zset类型,用于scheduler调度处理 requests 内容是 request 对象的序列化字符串。

使用步骤

  1. 修改爬虫类的父类,如果原始爬虫文件时基于 Spider 的,则应该将父类修改为 RedisSpider,如果原始爬虫文件时基于 CrawlSpider 的,则应该将其父类修改成 RedisCrawlSpider。
  2. 删掉 start_urls 列表,并加入 redis_key 属性,该属性的值为scrapy-redis组件中的调度器队列名称。
  3. 在配置文件中进行相关配置来开启使用scrapy-redis组件中封装好的管道,相关配置如下。

相关配置

# 使用scrapy-redis组件中封装好的管道,直接将数据存入Redis中,不再需要pipelines文件
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 100
}

# 使用scrapy-redis组件的去重队列,不再使用scrapy默认的去重方式
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'

# 使用scrapy-redis组件的调度器,不使用默认的调度器
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'

# 允许暂停,redis请求记录不会丢失
SCHEDULER_PERSIST = True
# 即:配置调度器是否允许持久化,即爬取结束后 是否清空Redis中的请求队列和去重指纹set

"""请求队列形式"""
# 1.按优先级(默认)
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
# 2.队列形式,请求先进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
# 3.栈形式,请求先进后出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"

"""连接Redis配置"""
REDIS_HOST = '9.0.0.1'  # Redis监听地址
REDIS_PORT = 6380  # Redis监听端口
REDIS_ENCODING = 'utf-8'  # 编码

# 如果你的Redis设置了连接密码:
# REDIS_PARAMS = {'password': 'Redis密码'}


开始使用

第一种,基于 RedisSpider 的分布式爬虫:

# -*- coding: utf-8 -*-
import scrapy
from blog.items import  BlogItem
from scrapy_redis.spiders import RedisSpider  # pip install scrapy-redis

class Blog01Spider(RedisSpider):  # 更改继承类为RedisSpider
    name = 'blog01'

    # 删掉起始url列表,使用下面的redis_key
    # start_urls = ['http://www.xxx.com/']

    # 指定共享的调度器队列名称(起始url列表)
    redis_key = 'cmda'  # cmda:中国医师协会简称
    # 如果你不指定此属性,则默认的共享调度器队列名称为:blog01:start_urls

    present_page = 1  # 用于标识当前页面
    max_page = 1000  # 你想爬取多少页数据
    url = 'http://db.pharmcube.com/database/cfda/detail/cfda_cn_instrument/%d'  # 用于计算页面的url

    def parse(self, response):

        # 解析每一个页面
        item = BlogItem()
        item['num'] = response.xpath('/html/body/div/table/tbody/tr[1]/td[2]/text()').extract_first()  # 注册证编号
        item['company_name'] = response.xpath('//html/body/div/table/tbody/tr[2]/td[2]/text()').extract_first()  # 注册人名称
        item['company_address'] = response.xpath('/html/body/div/table/tbody/tr[3]/td[2]/text()').extract_first()  # 注册人住所

        yield item
        # 在items文件中写好要保存的字段
        # 这里会将item对象提交给scrapi-redis组件的管道

        # 下面开始递归爬取所有页面
        urls = []
        if self.present_page <= self.max_page:
            self.present_page += 1
            url = format(self.url % self.present_page)
            yield scrapy.Request(url, callback=self.parse)

# 注意修改你的配置文件,写入相关的配置

第二种,基于 RedisCrawlSpider 的分布式爬虫:

# -*- coding: utf-8 -*-
import scrapy
from blog.items import ChoutiProItem
from scrapy_redis.spiders import RedisCrawlSpider  # pip install scrapy-redis
from scrapy.linkextractors import LinkExtractor
# LinkExtractor:链接提取器,用于提取起始url页面中符合匹配规则的链接
from scrapy.spiders import CrawlSpider, Rule
# CrawlSpider:是Spider的一个子类,除了继承了Spider的特性和功能外,还派生了自己独有的强大特性和功能
# Rule:规则解析器,用于将链接提取器提取到的链接对应的页面源码数据根据指定的解析方法(回调函数)进行解析

class Blog02Spider(RedisCrawlSpider):  # 更改继承类为RedisCrawlSpider
    name = 'blog02'

    # allowed_domains = ['www.xxx.com']

    # 删掉起始url列表,使用下面的redis_key
    # start_urls = ['http://www.xxx.com/']

    # 指定共享的调度器队列名称(共享的起始url列表)
    redis_key = 'chouti' # https://dig.chouti.com/r/scoff/hot
    # 如果你不指指定此属性,则默认的共享调度器队列名称为:blog01:start_urls

    # 定义链接提取规则
    link = LinkExtractor(allow=r'/r/scoff/hot/\d+')

    # 在这里定义规则解析器
    rules = (
        Rule(link, callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        div_list = response.xpath('//div[@id="content-list"]/div')
        for div in div_list:
            item = ChoutiProItem()
            item['title'] = div.xpath('.//div[@class="part1"]/a/text()').extract_first()  # 段子标题
            item['author'] = div.xpath('.//div[@class="part2"]/a[4]/b/text()').extract_first()  # 段子内容
            print(item.__dict__)

            yield item
            # 在items文件中写好要保存的字段
            # 这里会将item对象提交给scrapi-redis组件的管道

# 注意修改你的配置文件,写入相关的配置

准备就绪后,启动redis服务器和客户端,在所有爬虫机器上执行命令 scrapy runspider 爬虫文件路径 运行爬虫程序,然后在redis客户端中执行 lpush redis_key属性值 起始url 来传入起始url。此时,所有爬虫程序将开始工作。

成功爬取数据后,你可以在redis客户端中使用 smembers 爬虫名:dupefilter 来查看爬取到的数据。
___

所有渴望别人理解的行为,都是弱者的行为。人的强大,第一步 要学会孤独,第二步 要学会不被理解,第三步 就是用结果去碾压。加油!
"

原文: http://blog.gqylpy.com/gqy/370

原文地址:https://www.cnblogs.com/bbb001/p/11374327.html

时间: 2024-11-08 15:51:34

【Scrapy框架基于scrapy-redis实现分布式爬虫】 򓮘的相关文章

基于requests+redis的分布式爬虫

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

python爬虫随笔-scrapy框架(1)——scrapy框架的安装和结构介绍

scrapy框架简介 Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试.(引用自:百度百科) scrapy官方网站:https://scrapy.org/ scrapy官方文档:https://doc.scrapy.org/en/latest/ scrapy框架安装 首先我们安装scrapy,使用如下命令 pip install scrapy 此时很多人应该都会遇到如

Scrapy框架之基于RedisSpider实现的分布式爬虫

需求:爬取的是基于文字的网易新闻数据(国内.国际.军事.航空). 基于Scrapy框架代码实现数据爬取后,再将当前项目修改为基于RedisSpider的分布式爬虫形式. 一.基于Scrapy框架数据爬取实现 1.项目和爬虫文件创建 $ scrapy startproject wangyiPro $ cd wangyiPro/ $ scrapy genspider wangyi news.163.com # 基于scrapy.Spider创建爬虫文件 2.爬虫文件编写--解析新闻首页获取四个板块的

Redis实现分布式爬虫

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

[Python][Scrapy 框架] Python3 Scrapy的安装

1.方法(只介绍 pip 方式安装) PS.不清楚 pip(easy_install) 可以百度或留言. cmd命令: (直接可以 pip,而不用跳转到 pip.exe目录下,是因为把所在目录加入 Path 环境变量中) 通过 pip install 安装的好处: 安装起来非常的方便 安装 scrapy 和依赖包 包的一致性可以保证 2.可能遇到的一些问题 安装到的时候有些自动装不上: 上图显示装 'twisted.test.raiser' 这个子扩展包的时候自动装不上去,因为需要 VC++ 1

Orleans框架------基于Actor模型生成分布式Id

一.Actor简介 actor模型是一种并行计算的数学模型. 响应于收到的消息,演员可以:做出决定,创建更多Actor,发送更多消息,并确定如何响应接收到的下一条消息. 演员可以修改自己的状态,但只能通过消息相互影响(避免需要任何锁). actor是一个计算实体,当其收到消息时,可以并发执行如下操作: 1. 发送有限数量的消息给其他actor 2. 创建有限数量的新actor 3. 指定收到下一消息时的行为 在Orleans中使用的是虚拟Actor方式,详细:http://dotnet.gith

redis之分布式爬虫

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

scrapy框架简介和基础应用(python爬虫)

一.什么是scrapy? scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍,所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,持久化等)的具有很强通用性的项目模板,对于框架学习,重点是要学习其框架的特性,各个功能的用法即可. 二.安装 Linux: pip3 install scrapy Windows: a. pip3 install wheel b. 下载twisted http://www.lfd.uci.edu/~gohlke/p

scrapy框架编写向redis数据库中存储数据的相关代码时报错解决办法

错误信息:redis.exceptions.DataError: Invalid input of type: 'dict'. Convert to a byte, string or number first. 解决办法:python中redis包更新导致的问题,变更了srem方法的输入.使用旧版本pip install redis==2.10.6,即可解决 原文地址:https://www.cnblogs.com/lys666/p/10469981.html