6 scrapy框架之分布式操作
分布式爬虫
一.redis简单回顾
1.启动redis:
mac/linux: redis-server redis.conf
windows: redis-server.exe redis-windows.conf
2.对redis配置文件进行配置:
- 注释该行:bind 127.0.0.1,表示可以让其他ip访问redis
- 将yes该为no:protected-mode no,表示可以让其他ip操作redis
二.scrapy基于redis的数据持久化操作流程
1.安装scrapy-redis组件:
- pip install scrapy-redis
- scrapy-redis是基于scrapy框架开发出的一套组件,其作用就是可以让scrapy实现分布式爬虫。
2.编写爬虫文件:
- 同之前scrapy中基于Spider或者CrawlSpider的编写方式一致。
3.编写管道文件:
- 在scrapy-redis组件中已经帮助我们封装好了一个专门用于连接存储redis数据库的管道(RedisPipeline),因此我们直接使用即可,无需自己编写管道文件。
4.编写配置文件:
- 在settings.py中开启管道,且指定使用scrapy-redis中封装好的管道。
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 400
}
- 该管道默认会连接且将数据存储到本机的redis服务中,如果想要连接存储到其他redis服务中需要在settings.py中进行如下配置:
REDIS_HOST = 'redis服务的ip地址'
REDIS_PORT = 6379
REDIS_ENCODING = ‘utf-8’
REDIS_PARAMS = {‘password’:’123456’}
三.redis分布式部署
1.scrapy框架是否可以自己实现分布式?
- 不可以。原因有二。
其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls列表中的url。(多台机器无法共享同一个调度器)
其二:多台机器爬取到的数据无法通过同一个管道对数据进行统一的数据持久出存储。(多台机器无法共享同一个管道)
2.redis实现分布式基本流程:
- 使用基于scrapy-redis组件中的爬虫文件。
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from movieproject.items import MovieprojectItem
#导入scrapy-redis中的模块
from scrapy_redis.spiders import RedisCrawlSpiderclass NnSpider(RedisCrawlSpider):name = 'nn'allowed_domains = ['www.id97.com']#redis_key表示调度器中的队列(将要爬取的页面数据对应的url都需要放置到调度器队列中)redis_key = 'nnspider:start_urls'# 根据规则提取所有的页码链接page_link = LinkExtractor(allow=r'/movie/\?page=\d')detail_link = LinkExtractor(restrict_xpaths='//div[contains(@class,"col-xs-1-5")]/div/a')# detail_link = LinkExtractor(allow=r'/movie/\d+\.html$')# follow : 是否跟进rules = (# 所有的页码不用处理,跟进即可Rule(page_link, follow=True),# 所有的详情页处理,不用跟进Rule(detail_link, callback='parse_item', follow=False),)def parse_item(self, response):# 创建一个item对象item = MovieprojectItem()# 电影海报item['post'] = response.xpath('//a[@class="movie-post"]/img/@src').extract_first()# 电影名字item['name'] = response.xpath('//h1').xpath('string(.)').extract_first()yield item
view
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from redisPro.items import RedisproItemfrom scrapy_redis.spiders import RedisCrawlSpiderclass QiubaiSpider(RedisCrawlSpider):name = 'qiubai'#allowed_domains = ['https://www.qiushibaike.com/pic/']#start_urls = ['https://www.qiushibaike.com/pic/']#调度器队列的名称redis_key = 'qiubaispider' #表示跟start_urls含义是一样,redis数据库里面的值link = LinkExtractor(allow=r'/pic/page/\d+')rules = (Rule(link, callback='parse_item', follow=True),)def parse_item(self, response):div_list = response.xpath('//div[@id="content-left"]/div')for div in div_list:img_url = "https:"+div.xpath('.//div[@class="thumb"]/a/img/@src').extract_first()item = RedisproItem()item['img_url'] = img_urlyield item
- 使用scrapy-redis组件中封装好的调度器,将所有的url存储到该指定的调度器中,从而实现了多台机器的调度器共享。
# 使用scrapy-redis组件的去重队列
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 是否允许暂停
SCHEDULER_PERSIST = True
- 使用scrapy-redis组件中封装好的管道,将每台机器爬取到的数据存储通过该管道存储到redis数据库中,从而实现了多台机器的管道共享。
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 400,
}
- 执行:scrapy runspider xxx.py,然后向调度器队列中传入起始url:lpush nnspider:start_urls http://www.xxx.com/
6 scrapy框架之分布式操作相关推荐
- scrapy框架之分布式操作
分布式概念 分布式爬虫:1.概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取.2.原生的scrapy是不可以实现分布式爬虫?a)调度器无法共享b)管道无法共享3.scrapy-redis ...
- Scrapy框架+Gerapy分布式爬取海外网文章
Scrapy框架+Gerapy分布式爬取海外网文章 前言 一.Scrapy和Gerapy是什么? 1.Scrapy概述 2.Scrapy五大基本构成: 3.建立爬虫项目整体架构图 4.Gerapy概述 ...
- scrapy框架之分布式爬虫
概念:我们需要搭建一个分布式的机群,让其对一组资源进行分布联合爬取 作用:提升爬取数据的效率 如何实现分布式? 安装一个scrapy-redis的组件(使用的是redis数据库) 原生的scrapy是 ...
- Scrapy框架-redis分布式(从Scrapy框架创建项目到redis分布式)
盗墓笔记案例: 目标网址:http://www.daomubiji.com/ scrapy项目: 1. 创建项目 2. 创建爬虫 3. 定义item 数据内容: 1. 书的名称 2. 章节名称 3. ...
- 解析python网络爬虫pdf 黑马程序员_正版 解析Python网络爬虫 核心技术 Scrapy框架 分布式爬虫 黑马程序员 Python应用编程丛书 中国铁道出版社...
商品参数 书名:Python应用编程丛书:解析Python网络爬虫:核心技术.Scrapy框架.分布式爬虫 定价:52.00元 作者:[中国]黑马程序员 出版社:中国铁道出版社 出版日期:2018-0 ...
- Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB
通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...
- Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB
通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本涵盖了爬虫 ...
- 22-爬虫之scrapy框架分布式09
分布式 实现分布式的方式:scrapy+redis(scrapy结合着scrapy-redis组件) 原生的scrapy框架是无法实现分布式的 什么是分布式 需要搭建一个分布式机群,然后让机群中的每一 ...
- python中data.find_all爬取网站为空列表_Python网络爬虫之Scrapy 框架-分布式【第二十九节】...
1. 介绍scrapy-redis框架 scrapy-redis 一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能. github地址: https://g ...
最新文章
- this - 想说爱你不容易
- qeephp 修改acl.yaml文件实现访问控制
- 【Problem solved】 error C2665: “loadimage”: 2 个重载中没有一个可以转换所有参数类型...
- activity切换动画特效
- 基于vue的移动web app页面缓存解决方案
- why carbon 13?
- html 编辑xml,编辑XML\HTML时取消浏览“amp”
- Oracle SQL语句收集
- 3D 鼠标跟随脚本详解
- py 的 第 19 天
- python 干什么工作具有明显优势-python能做什么?有哪些优点?
- 九章算法班L6 Graph Search
- SQL*Plus格式化查询结果
- 如何将python转换成exe执行
- 如何在Mysql中运行SQL文件
- 服务器容灾性能,容灾和性能
- php写aaa-zzz,php算法打印aa aaa ab aab直到zzz
- 网络服务器是指带有大容量硬盘的计算机,中国人民大学网络教育201812统考计算机模拟题...
- 数学建模算法与应用 线性规划(cvxpy包)
- 这5种计算机视觉技术,刷新你的世界观
热门文章
- δ在web里面怎么输入_【高等数学】用ε-δ语言证明函数极限
- 修完 1300 万行代码,我帮苹果省下 2 亿美元,但没拿到承诺的千万股票
- “有一个产品经理的女朋友是什么体验?”
- 抄作业了!6 大 Flask 开源实战项目推荐
- 安利!阿里程序员常用的 15 款开发者工具
- 杀手级 AI 补代码工具问世,支持 23 种语言及 5 种主流编辑器,程序员沸腾了...
- java 实现 web 客户端_Java web客户端和服务器端交互的原理
- java实现语法分析器_200 行 JS 代码,带你实现代码编译器
- mysql数据库连接javaweb_javaweb中mysql数据库连接方法
- python编写函数求斐波那契数列的某一项_求解一道Python编程题