11、分布式爬虫(一)
一、分布式概念和作用
比如爬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、分布式爬虫(一)相关推荐
- Python面试必备—分布式爬虫scrapy+redis解析
传智播客博学谷 微信号:boxuegu- get最新最全的IT技能 免费领取各种视频资料 注意:文末送书 很多小伙伴留言,最近准备跳槽,但是面试的机会比较少,好不容易得到面试机会,由于技术点的匮乏,面 ...
- 《Java EE企业级应用开发》,《分布式爬虫》等书包邮送50本!企业开发利器!...
来给大家送一波福利,这次联系了10个好友一起给各位送书,每个号送 5 本,一共 50本,还包邮哦. 感谢传智播客对本次活动的赞助. 金主介绍:传智播客是国内数一数二的IT培训机构,现在关注传智播客 ...
- 如何构建一个分布式爬虫:基础篇
继上篇(如何构建一个分布式爬虫:理论篇)我们谈论了Celery的基本知识后,本篇继续讲解如何一步步使用Celery构建分布式爬虫.这次我们抓取的对象定为celery官方文档(Celery - Dist ...
- python教学视频a_2019何老师一个月带你玩转Python分布式爬虫实战教程视频(视频+源码)...
├─章节1-爬虫前奏(官网免费) │ 001.爬虫前奏_什么是网络爬虫.mp4 │ 002.爬虫前奏_HTTP协议介绍.mp4 │ 003.爬虫前奏_抓包工具的使用网络请求.mp4 │ ├─章节2-网 ...
- 纯手工打造简单分布式爬虫(Python)
https://www.cnblogs.com/qiyeboy/p/7016540.html 本章讲的依旧是实战项目,实战内容是打造分布式爬虫,这对初学者来说,是一个不小的挑战,也是一次有意义的尝试. ...
- 基于redis的简易分布式爬虫框架
代码地址如下: http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需, ...
- Win10+Python3.6配置Spark创建分布式爬虫
介绍Spark在Win 10系统中的的安装.配置以及在分布式爬虫中的使用,Python版本为3.6.8. Spark安装.配置和使用请参考<Python程序设计开发宝典>"第12 ...
- Redis实现分布式爬虫
redis分布式爬虫 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的爬取 原生的scrapy是不可以实现分布式爬虫, 原因如下: 调度器无法共享 管道无法共享 scrapy-redis组件:专 ...
- 爬取房天下新房、二手房房源数据(scrapy-redis分布式爬虫)
前言 该项目基于Scrapy-Redis框架实现分布式爬虫.其中,我使用了自身电脑(win10)作为redis服务器, WSL虚拟机和一台mac作为爬虫服务器,从而实现分布式爬虫. 环境搭建 开发环境 ...
- Python分布式爬虫打造搜索引擎
Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 未来是什么时代?是数据时代!数据分析服务.互联网金融,数据建模.自 ...
最新文章
- Oracle SQL Perfomance Tuning
- nodejs基础学习-文件读取
- mysql_install_db参数_MySQL初始化脚本mysql_install_db使用简介及选项参数
- java 发送带basic认证的http post请求实例代码_图解HTTP学习笔记(八)—确认访问用户身份的认证...
- 西门子滚筒洗衣机教程_西门子洗衣机怎么样 西门子洗衣机哪款好
- 介绍Linux系统如何初始化和启动系统服务的
- 解决从登录页通过this.$router.push跳转首页后 点返回健路由变而页面不变的问题
- 增选54位院士,京东副总裁梅涛等18位华人入选!
- CentOS8 之dhcp、tftp、syslinux部署
- Vue.js+axios制作的仿酷狗音乐-音乐播放界面
- newifimini出厂固件_newifi 新路由 mini用哪个Pandora固件
- CVPR 2021最全论文开放下载!附pdf下载链接!
- 合并两个有序表(C语言)
- Python3对股票数据进行分析
- CF373C-Counting Kangaroos is Fun
- esp8266 OTA 云远程更新固件 wifiupdate
- 书论20 袁昂《古今书评》
- 无线智能蓝牙追踪防丢器
- 图灵机器人SDK接入指南
- 【疑难问题】——Game中子弹的代码结构设计(未完)——是每个实例去监听某个事件
热门文章
- mysql作排名,MYSQL实现排名及查询指定用户排名功能(并列排名功能)实例代码...
- IBM第二季度营收155亿美元增长9%;液化空气将在上海化学工业区投资超2亿欧元新建制氢装置及配套设施 | 美通企业日报...
- 【报告分享】中国移动阅读市场年度综合分析2021-易观智库(附下载)
- 【附源码】Java计算机毕业设计高校流动党员信息管理系统(程序+LW+部署)
- 计算机关机时出现蓝屏,电脑关机后出现蓝屏为什么
- PADS运行脚本出现“Active X Automation:server could not be found”
- windows11隐藏/删除 导航栏主文件夹图标
- python游戏代码示例_代码实例1:python 小人打架游戏
- 【SDX62】WCN6856 wifi驱动加载出现cnss: Invalid SBL log data
- I2C适配器驱动及设备驱动代码详解