一、分布式概念和作用

比如爬100本小说,分配后每个服务器只爬一部分小说

分布式:一个业务分拆多个子业务,部署在不同的服务器上;

是一种将任务分布在不同地方的工作方式

作用:提高安全性(被抓了也只是单个被抓,不会全部中断)和效率(多个服务器爬取速度倍增)

除了在爬虫上运用,网站的访问运用到分布式最多,比如在单个服务器得到多个用户的需求后,分配给多个服务器进行完成,减少工作量

二、scrapy_redis

redis 的安装与使用:

1.redis(支持分布式的数据库) 下载地址
https://github.com/MicrosoftArchive/redis/releases
2.安装教程https://www.cnblogs.com/ttlx/p/11611086.html
3.设置(redis-windows.conf中设置)
bind 0.0.0.0 这是绑定的服务器IP,0.0.0.0是任何服务器都可以访问,注释掉绑定本地的IP,用0.0.0.0,为了让外部多个服务器都能够访问,自己电脑上开启的多个爬虫服务器不算,加上远程操作的服务器接入才用到0.0.0.0
4.启动服务与数据库
redis-server redis-cli
5.redis 简单命令
set key value 写入数据(写入字符串,再写入时相当于字符串增长)
get key 读取数据
lpush key value1 …一个或多个值插入到列表头部 (写入到列表中)(和set不能混用)

lrange key 读取数据(get只能读取set的一个值,lrange能读多个值的键)

keys * 获取所有的键

flushdb 清空

Redis Desktop Manager可视化的redis,相当于navicat的可视化功能

scrapy _redis:(1、接收请求然后分配。2、接收item传给管道)

特点和架构:

scrapy_redis是一个基于Redis开发的一个Scrapy组件,用于scrapy项目的分布式部署和开发。

特点:
分布式爬取

你可以启动多个spider对象,互相之间共享有一个redis的request队列。最适合多个域名的广泛内容的爬取。

分布式数据处理

爬取到的item数据被推送到redis中,这意味着你可以启动尽可能多的item处理程序。

scrapy即插即用

scrapy调度程序+过滤器,项目管道,base spidre,使用简单。

安装和使用:

一般通过pip安装Scrapy-redis:

pip install scrapy-redis
scrapy-redis依赖:

Python 2.7, 3.4 or 3.5以上
Redis >= 2.8
Scrapy >= 1.1

scrapy-redis的使用非常简单,几乎可以并不改变原本scrapy项目的代码,只用做少量设置。

常用设置:(放在settings中进行设置)

启用调度将请求存储进redis

调度器没有分布式功能,所以只能把大量的数据先放到redis组件中,然后其他各个服务器到redis去拿到任务再去执行,这就起到分配任务的结果(有redis组件之后,调度器就直接把请求放到redis里面去了)

必须

SCHEDULER = “scrapy_redis.scheduler.Scheduler”(把redis变成了公用的调度器,让其他服务器也能用)

确保所有spider通过redis共享相同的重复过滤。

必须

DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter” (确保过滤)

可以写成from scrapy_redis.dupefilter import RFPDupeFilter

​ DUPEFILTER_CLASS =RFPDupeFilter()

#公共管道:(其他服务器都要提交的一个管道)

(item不留的话是和其他服务器共同完成一个任务,留了就是不全是放redis的,还有放其他服务器那里或其他地方的,是执行了其他任务的)
ITEM_PIPELINES = {
‘scrapy_redis.pipelines.RedisPipeline’ : 300 (redis不仅要接收请求,还要接收item)
} (数据可以自己留,也可以给redis,也可以给其他机器,最好还是给redis进行统一的处理)

指定连接到Redis时要使用的主机和端口。

必须

REDIS_HOST = ‘localhost’(连别的机器的时候不能写本地端口,有密码的还有写密码)
REDIS_PORT = 6379

不清理redis队列,允许暂停/恢复抓取。

可选 允许暂定,redis数据不丢失

#SCHEDULER_PERSIST = True(开启断点续爬,可以在暂停的时候不掉数据,再次开始的时候能接着暂停的位置开始)
官方文档:https://scrapy-redis.readthedocs.io/en/stable/

redis中存储的数据:

spidername:items

list类型,保存爬虫获取到的数据item内容是json字符串。

spidername:dupefilter 请求形成的一个独特 的数据 (属于爬虫的一个指纹)(去重操作,避免重复下载相同的内容)

set类型,用于爬虫访问的URL去重内容是40个字符的url的hash字符串

spidername:start_urls

list类型,用于接收redisspider启动时的第一个url

spidername:requests

zset类型,用于存放requests等待调度。内容是requests对象的序列化字符串。

三、分布式项目演示

项目配置:

把项目分成两份,不仅给公共区域一份,自己也留有一份。由于有page页数,一个服务器爬取第一页请求后,另一个服务器就只能爬取另一页了,所以起到合作高效率的作用

构造出redis的服务器属于伪服务器,具体是让两个伪服务器的爬虫文件一起工作去访问同一个请求

与仅仅用一个爬虫进行工作的区别在于:

伪服务器要导入from scrapy_redis.spiders import RedisSpider,然后伪服务器的爬虫文件类不再继承基础类,改成继承RedisSpider类。

伪服务器的初始url(start_urls)可以删除,因为伪服务器用的是redis_key = “db:start_urls”(开启爬虫的钥匙)

里面的db:start_urls要通过在redis数据库里加这个键值对(用lpush key value1 …),键是db:start_urls,值就是对应的初始url(该环节属于在redis公共区域写一个请求,给所有服务器来访问)

RedisSpider不仅继承了spider类,还继承了RedisMixin类(多继承)

执行的时候,打开多个控制台,到各自服务器的目录中都开启scrapy crawl 爬虫文件名

由于第一个伪服务器拿到第一页请求处理后,然后把第二页的请求发送给调度器,传到公共区域,准备去继续执行的时候,发现第二页被另一个伪服务器拿走了,然后无法继续执行。而另一个伪服务器在执行完第二页后发现自己的page页数是0,然后在加1的时候想执行第一页,因为第二页执行过了,所以被过滤了,导致直接停止操作。

所以要构造好page页数,才能明确的分工,在每个页数构造完之后传请求给调度器的同时加多一个meta参数,来让对方知道自己要爬的下一页的页数,meta={“num”:self.page_num},并且做好接收meta,self.page_num=response.meta[“num”]。就是谁拿到请求了,就加多一页就行了。

由于第一个拿的可能没有num这个meta键,所以要在num接收这里加多一个判断,

if response.meta.get("num"):如果得到了num就执行self.page_num=response.meta["num"]

没有放进爬虫钥匙时,爬虫文件执行后也只是在等待,可以多开一个控制台操纵redis来lpush key value1 …放入请求开始运转

11、分布式爬虫(一)相关推荐

  1. Python面试必备—分布式爬虫scrapy+redis解析

    传智播客博学谷 微信号:boxuegu- get最新最全的IT技能 免费领取各种视频资料 注意:文末送书 很多小伙伴留言,最近准备跳槽,但是面试的机会比较少,好不容易得到面试机会,由于技术点的匮乏,面 ...

  2. 《Java EE企业级应用开发》,《分布式爬虫》等书包邮送50本!企业开发利器!...

    来给大家送一波福利,这次联系了10个好友一起给各位送书,每个号送 5 本,一共 50本,还包邮哦. 感谢传智播客对本次活动的赞助.   金主介绍:传智播客是国内数一数二的IT培训机构,现在关注传智播客 ...

  3. 如何构建一个分布式爬虫:基础篇

    继上篇(如何构建一个分布式爬虫:理论篇)我们谈论了Celery的基本知识后,本篇继续讲解如何一步步使用Celery构建分布式爬虫.这次我们抓取的对象定为celery官方文档(Celery - Dist ...

  4. python教学视频a_2019何老师一个月带你玩转Python分布式爬虫实战教程视频(视频+源码)...

    ├─章节1-爬虫前奏(官网免费) │ 001.爬虫前奏_什么是网络爬虫.mp4 │ 002.爬虫前奏_HTTP协议介绍.mp4 │ 003.爬虫前奏_抓包工具的使用网络请求.mp4 │ ├─章节2-网 ...

  5. 纯手工打造简单分布式爬虫(Python)

    https://www.cnblogs.com/qiyeboy/p/7016540.html 本章讲的依旧是实战项目,实战内容是打造分布式爬虫,这对初学者来说,是一个不小的挑战,也是一次有意义的尝试. ...

  6. 基于redis的简易分布式爬虫框架

    代码地址如下: http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需, ...

  7. Win10+Python3.6配置Spark创建分布式爬虫

    介绍Spark在Win 10系统中的的安装.配置以及在分布式爬虫中的使用,Python版本为3.6.8. Spark安装.配置和使用请参考<Python程序设计开发宝典>"第12 ...

  8. Redis实现分布式爬虫

    redis分布式爬虫 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的爬取 原生的scrapy是不可以实现分布式爬虫, 原因如下: 调度器无法共享 管道无法共享 scrapy-redis组件:专 ...

  9. 爬取房天下新房、二手房房源数据(scrapy-redis分布式爬虫)

    前言 该项目基于Scrapy-Redis框架实现分布式爬虫.其中,我使用了自身电脑(win10)作为redis服务器, WSL虚拟机和一台mac作为爬虫服务器,从而实现分布式爬虫. 环境搭建 开发环境 ...

  10. Python分布式爬虫打造搜索引擎

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 未来是什么时代?是数据时代!数据分析服务.互联网金融,数据建模.自 ...

最新文章

  1. Oracle SQL Perfomance Tuning
  2. nodejs基础学习-文件读取
  3. mysql_install_db参数_MySQL初始化脚本mysql_install_db使用简介及选项参数
  4. java 发送带basic认证的http post请求实例代码_图解HTTP学习笔记(八)—确认访问用户身份的认证...
  5. 西门子滚筒洗衣机教程_西门子洗衣机怎么样 西门子洗衣机哪款好
  6. 介绍Linux系统如何初始化和启动系统服务的
  7. 解决从登录页通过this.$router.push跳转首页后 点返回健路由变而页面不变的问题
  8. 增选54位院士,京东副总裁梅涛等18位华人入选!
  9. CentOS8 之dhcp、tftp、syslinux部署
  10. Vue.js+axios制作的仿酷狗音乐-音乐播放界面
  11. newifimini出厂固件_newifi 新路由 mini用哪个Pandora固件
  12. CVPR 2021最全论文开放下载!附pdf下载链接!
  13. 合并两个有序表(C语言)
  14. Python3对股票数据进行分析
  15. CF373C-Counting Kangaroos is Fun
  16. esp8266 OTA 云远程更新固件 wifiupdate
  17. 书论20 袁昂《古今书评》
  18. 无线智能蓝牙追踪防丢器
  19. 图灵机器人SDK接入指南
  20. 【疑难问题】——Game中子弹的代码结构设计(未完)——是每个实例去监听某个事件

热门文章

  1. mysql作排名,MYSQL实现排名及查询指定用户排名功能(并列排名功能)实例代码...
  2. IBM第二季度营收155亿美元增长9%;液化空气将在上海化学工业区投资超2亿欧元新建制氢装置及配套设施 | 美通企业日报...
  3. 【报告分享】中国移动阅读市场年度综合分析2021-易观智库(附下载)
  4. 【附源码】Java计算机毕业设计高校流动党员信息管理系统(程序+LW+部署)
  5. 计算机关机时出现蓝屏,电脑关机后出现蓝屏为什么
  6. PADS运行脚本出现“Active X Automation:server could not be found”
  7. windows11隐藏/删除 导航栏主文件夹图标
  8. python游戏代码示例_代码实例1:python 小人打架游戏
  9. 【SDX62】WCN6856 wifi驱动加载出现cnss: Invalid SBL log data
  10. I2C适配器驱动及设备驱动代码详解