一、介绍

1、原生的scrapy框架

原生的scrapy框架是实现不了分布式的,其原因有:

  1. 因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls列表中的url。(多台机器无法共享同一个调度器)

  2. 多台机器爬取到的数据无法通过同一个管道对数据进行统一的数据持久出存储。(多台机器无法共享同一个管道)

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

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

2. 实现方式
基于该组件的RedisSpider类
基于该组件的RedisCrawlSpider类 3. 配置
1,下载scrapy-redis组件:pip install scrapy-redis
2,redis配置文件的配置
- 注释该行:bind 127.0.0.1,表示可以让其他ip访问redis
- 将yes该为no:protected-mode no,表示可以让其他ip操作redis

二、搭建分布式爬虫

1、搭建分布式的流程

1.下载scrapy-redis组件:pip install scrapy-redis

2.创建scrapy工程和爬虫文件(可以创建基于原生的分布式,可以创建基于CrawlSpider的分布式)
scrapy startproject projectName
scrapy genspider -t crawl spiderName www.xxx.com 3.修改爬虫文件中的代码:
3.1 导包:from scrapy_redis.spiders import RedisCrawlSpider
3.2 将爬虫类的父类修改成基于RedisSpider或者RedisCrawlSpider
注意:如果原始爬虫文件是基于Spider的,则应该将父类修改成RedisSpider
如果原始爬虫文件是基于CrawlSpider的,则应该将其父类修改成RedisCrawlSpider
3.3 allowed_domains 和 start_urls删除
3.4 增加一个新的属性:redis_key = xxx 这个属性值xxx就是scrpy-redis组件中调度器队列的名称 4.修改配置文件settings.py
4.0 scrapy_redis是scrapy-redis组件中提供的一个类
4.1 开启使用scrapy-redis组件中封装好的调度器(可以被共享的调度器)
# 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
SCHEDULER_PERSIST = True # 是否允许暂停
4.2 指定可以被共享的管道:
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400
} 5. 指定持久化存储时,数据存储的数据库的相关信息:
REDIS_HOST = 'redis服务的ip地址'
REDIS_PORT = 6379
REDIS_ENCODING = 'utf-8'
REDIS_PARAMS = {'password':''} # 不设密码可不写这行 6.配置redis数据库:redis.windows.conf
protected-mode no
#bind 127.0.0.1 7.开启redis的server and client (windows下开启)
redis-server.exe redis.windows.conf
redis-cli 8.运行当前的爬虫文件
scrapy runspider spiderName.py
注意此时不是:scrapy crawl spiderName 9.处理起始url:
在redis-cli中执行:lpush redis_key属性的值 起始url

2、代码实现

爬取抽屉网站的所有页码的链接标题和提交方

1. settings.py
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
ROBOTSTXT_OBEY = False # 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
SCHEDULER_PERSIST = True ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400
} REDIS_HOST = '192.168.3.16'
REDIS_PORT = 6379 2. 爬虫文件
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.spiders import RedisCrawlSpider
from chouti_redis.items import ChoutiRedisItem class ChoutiSpider(RedisCrawlSpider):
name = 'chouti'
# allowed_domains = ['https://dig.chouti.com/']
# start_urls = ['https://dig.chouti.com/'] # scrapy-redis组件中提供的调度器队列的名称
redis_key = 'ct'
link = LinkExtractor(allow=r'/all/hot/recent/\d+')
rules = (
# 规则解析器
# follow = True:将链接提取器继续作用到链接提取器提取出的链接所对应的页面中
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:
title = div.xpath('./div[4]/div[1]/a[1]/text()').extract_first()
submitted = div.xpath('./div[4]/div[2]/a[4]/b/text()').extract_first() item = ChoutiRedisItem()
item['title'] = title
item['submitted'] = submitted
yield item 3. items.py
class ChoutiRedisItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
submitted = scrapy.Field() 4. 开启分布式爬虫
1,在多台机器上开启爬虫程序
scrapy runspider spiderName.py 2,在主机器上开启redis
# 开启服务端
redis-server.exe redis.windows.conf # 开启客户端
redis-cli # 在redis客户端中设置起始url
lpush ct https://dig.chouti.com/ # 爬取到数据后,在redis中会生成下面几个key
"chouti:items"
"chouti:requests"
"chouti:dupefilter"

基于scrapy-redis的分布式爬虫的更多相关文章

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

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

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

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

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

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

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

    scrapy-redis组件安装 分布式实现流程 scrapy-redis组件安装 - 下载scrapy-redis组件:pip install scrapy-redis - 更改redis配置文件: ...

  5. 基于Scrapy的B站爬虫

    基于Scrapy的B站爬虫 最近又被叫去做爬虫了,不得不拾起两年前搞的东西. 说起来那时也是突发奇想,想到做一个B站的爬虫,然后用的都是最基本的Python的各种库. 不过确实,实现起来还是有点麻烦的 ...

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

    需求:爬取的是基于文字的网易新闻数据(国内.国际.军事.航空). 基于Scrapy框架代码实现数据爬取后,再将当前项目修改为基于RedisSpider的分布式爬虫形式. 一.基于Scrapy框架数据爬 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 博弈论入门之nim游戏

    更好的阅读体验点这里 nim游戏 nim游戏 有两个顶尖聪明的人在玩游戏,游戏规则是这样的: 有\(n\)堆石子,两个人可以从任意一堆石子中拿任意多个石子(不能不拿),没法拿的人失败.问谁会胜利 ni ...

  2. 后台返回excel文件流,js下载

    /** 下载excel */ downloadExcel(data: Blob): void { var blob = new Blob([data], { type: 'application/vn ...

  3. Oracle DB 12c first glance

    单机上装了个12c,只看了看EM的界面……

  4. 简易仿ios菊花加载loading图

    原文链接:https://mp.weixin.qq.com/s/wBbQgOfr59wntNK9ZJ5iRw 项目中经常会用到加载数据的loading显示图,除了设计根据app自身设计的动画loadi ...

  5. Android 开源框架Glide的使用

    Glide是一个快速高效的多媒体管理和图像加载的框架,封装了Android平台的多媒体的解码,内存和硬盘缓存等,Glide支持解码.显示视频.图像和GIFs,Glide是基于定制的HttpUrlCon ...

  6. 程序员利器Tmux使用手册

    转:https://blog.csdn.net/chenqiuge1984/article/details/80132042

  7. FPGA驱动VGA显示静态图片

    一 .前言 本文设计思想采用明德扬至简设计法.VGA是最常见的视频显示接口,时序也较为简单.本文从利用显示屏通过VGA方式显示测试图案及静态图片着手带大家接触图像显示应用,算是为后续VGA显示摄像头采 ...

  8. 能ping通虚拟机,但snmp报文 Destination unreachable(Host administratively prohibited

    如题目,使用virtual box 虚拟机,虚拟机系统为centos6.5, 主机系统为win10 内外设置ip在同一网段后,互相能ping通,centos 系统开启snmp服务,此处说明以下, sn ...

  9. .net 获取远程访问的ip

    这两天一直做获取远程访问的ip和自己的ip相关的问题. 在解决获取ip相关问题的时候,主要使用了上下文对象,httpcontext对象.原理很简单,内部有两大对象,request和response.里 ...

  10. js 页面history.back()返回上一页,ios 不重新加载ready的解决办法

    参考自 http://blog.csdn.net/hbts_901111zb/article/details/76691900 项目中,主页面有很多输入字段,当由主页跳转到子页面, 将子页面的字段 s ...