Scrapy-分布式(scrapy-redis)介绍

  • 1 Scrapy-分布式介绍
    • 1.1 Scrapy-redis工作原理
    • 1.2 Scrapy-redis 安装和基本使用
      • 1.2.1 安装
      • 1.2.2 基本使用
  • 2 Scrapy转为Scrapy-分布式
    • 2.1 scrapy爬取京东读书
    • 2.2 改为Scrapy-分布式

1 Scrapy-分布式介绍

1.1 Scrapy-redis工作原理

首先回顾一下Scrapy的工作流程,然后进一步介绍Srapy-分布式的工作流程和原理。
(1)Scrapy的工作流程
详见:python爬虫之Scrapy入门介绍——安装、工作流程、模块介绍

首先,调度器(Scheduler)存放着目标urls或者是存放引擎发过来的request请求。
然后,引擎(Scrapy engine)协调调度器(Scheduler)把请求发给下载器(Downloader),让下载器下载请求,并返回给引擎。
接着,引擎(Scrapy engine)把获得的响应发给爬虫(Spider),爬虫处理引擎发来的response,提取数据,提取url,并交给引擎‘
最后,引擎(Scrapy engine)把响应内容发给管道(Item Pipline),管道处理引擎传过来的数据,比如存储。

(2)而Scrapy-分布式是为了弥补Scrapy的一些不足而发展起来。主要是起到去重url和更好实现多线程爬取。

那Scrapy-分布式是如何实现去重?它借助了redis快速读取功能来实现去重。具体而言:1)利用redis数据库分别存储待爬取的request对象;2)存储爬取过了的request对象,即指纹集合。3)在1)和2)存储的内容进行对比,进而实现去重。
除此之外,redis也可以存储爬取了的数据

1.2 Scrapy-redis 安装和基本使用

1.2.1 安装

(1)python 安装

pip install scrapy_redis

(2)基本使用数据来源

clone github scrapy_redis源码文件
git clone https://github.com/rolando/scrapy-redis.git

(3)打开example示例项目

1.2.2 基本使用

(1)了解example项目里的setting文件

SPIDER_MODULES = ['example.spiders']
NEWSPIDER_MODULE = 'example.spiders'USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'# 指定去重方法给request对象去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 指定Scheduler队列
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 队列中的内容是否持久保存,为false的时候在关闭Redis的时候,清空Redis
SCHEDULER_PERSIST = True
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"# 打开scrapy里面的pipeline和scrapy_redis.pipelines
ITEM_PIPELINES = {'example.pipelines.ExamplePipeline': 300,# scrapy_redis实现的items保存到redis的pipline'scrapy_redis.pipelines.RedisPipeline': 400,
}LOG_LEVEL = 'DEBUG'# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl.
DOWNLOAD_DELAY = 1

(2)运行example-project里面的dmoz.py
1)先要启动radis服务端

redis-server

2)创建start文件

from scrapy import cmdlinecmdline.execute(['scrapy','crawl','dmoz'])

3)启动redis服务端,了解数据库存储数据情况

redis-cli.exe

4)运行结果


5)结果解释

dmoz:requests   存放的是待爬取的requests对象
dmoz:item       爬取到的信息
dmoz:dupefilter 爬取的requests的指纹

6)总结

2 Scrapy转为Scrapy-分布式

步骤:
普通爬虫改成分布式爬虫
1.改造爬虫
1.1 导入类
1.2 继承类
1.3 注释start_url
2.改写配置文件

2.1 scrapy爬取京东读书

按常规创建jdspider项目,下面仅展示爬虫文件逻辑

import scrapy
from copy import deepcopy''''
需求:抓取京东图书的信息
目标:抓取京东图书包含图书的名字、
封面图片地址、图书url地址、
作者、出版社、出版时间、价格、图书所属大分类、图书所属小的分类、分类的url地址
'''class JdSpider(scrapy.Spider):name = 'jd'allowed_domains = ['jd.com']start_urls = ['https://book.jd.com/booksort.html']def parse(self, response):# 获取图书大类(小说、文学、青春文学等),存储在 //div[@class="mc"]/dl/dt/adt_list = response.xpath('//div[@class="mc"]/dl/dt')for dt in dt_list:item = {}item['b_cate'] = dt.xpath('./a/text()').extract_first()# 获取图书小类(中国近当代小说中国近现代小说中国古典小说),存储在//div[@class="mc"]/dl/dd/emem_list = dt.xpath("./following-sibling::dd[1]/em")for em in em_list:item['s_cate'] = em.xpath("./a/text()").extract_first()item['s_href'] = em.xpath("./a/@href").extract_first()if item['s_href'] is not None:item['s_href'] = "https:" + item['s_href']# 目前已获取到图书的大类和小类,现在要进入列表页获取图书的价格、出版社等信息yield scrapy.Request(url=item['s_href'],callback=self.parse_book_list,meta={'item': deepcopy(item)})def parse_book_list(self,response):item = response.meta.get('item')li_list = response.xpath("//div[@id='J_goodsList']/ul/li")for li in li_list:# 在列表页获取书名、书的图片、价格和出版社item['book_name'] = li.xpath('.//div[@class="p-img"]/a/em/text()').extract_first()item['book_img'] = li.xpath('.//div[@class="p-img"]/a/img/@src').extract_first()item['book_price'] = li.xpath('.//div[@class="p-price"]/strong/i/text()').extract_first()item["book_press"] = li.xpath(".//span[@class='p-bi-store']/a/text()").extract_first()# print(item)yield item

2.2 改为Scrapy-分布式

1.改造爬虫
1.1 导入类
1.2 继承类
1.3 注释start_url

import scrapy
from copy import deepcopy
from scrapy_redis.spiders import RedisSpider # 导入类''''
需求:抓取京东图书的信息
目标:抓取京东图书包含图书的名字、
封面图片地址、图书url地址、
作者、出版社、出版时间、价格、图书所属大分类、图书所属小的分类、分类的url地址
'''class JdSpider(RedisSpider):  # 继承类name = 'jd'allowed_domains = ['jd.com']# start_urls = ['https://book.jd.com/booksort.html']redis_key = "jd

2.改写seting配置文件

# 指定那个去重的方法给requests对象去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 指定Scheduler队列
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# Redis中的数据是否保存持久 如果是false 关闭Redis的时候 数据会被清空
SCHEDULER_PERSIST = True
ITEM_PIPELINES = {'JDSpideer.pipelines.JdspideerPipeline': 300,'scrapy_redis.pipelines.RedisPipeline': 400,
}

3.启动radis服务端和客户端
在客户端中输入,以为设置初始url

LPUSH jd https://book.jd.com/booksort.html

结果:

python爬虫之Scrapy介绍八——Scrapy-分布式(以爬取京东读书为示例)相关推荐

  1. Python爬虫新手入门教学(十):爬取彼岸4K超清壁纸

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  2. Python爬虫新手入门教学(十七):爬取yy全站小视频

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  3. Python爬虫新手入门教学(十三):爬取高质量超清壁纸

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  4. Python爬虫: 单网页 所有静态网页 动态网页爬取

    Python爬虫: 单网页 所有静态网页 动态网页爬取 前言:所有页代码主干均来自网上!!!感谢大佬们. 其实我对爬虫还挺感兴趣的,因为我玩instagram(需要科学上网),上过IG的人都知道IG虽 ...

  5. python爬虫实战之图灵社区图书信息的爬取(找了久,才找到一个比较好爬取的网站)

    python爬虫实战之图灵社区图书信息的爬取 程序的描述 目标 获取图灵社区(https://www.ituring.com.cn/book)中40本图书的书名 将获取的信息以列表的形式输出到屏幕上, ...

  6. python怎么爬取b站_【Python爬虫实例学习篇】——4、超详细爬取bilibili视频

    [Python爬虫实例学习篇]--4.超详细爬取bilibili视频 由于经常在B站上学习,但无奈于家里网络太差,在线观看卡顿严重,于是萌生了下载视频的想法(如果只是单纯想下载视频,请用you-get ...

  7. Python爬虫新手入门教学(二):爬取小说

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  8. Python爬虫初级(十三)—— 水木社区论坛爬取实战

    欢迎关注公众号K的笔记阅读博主更多优质学习内容 上一篇文章:Python爬虫初级(十二)-- 新闻消息抓取实战 实战阶段一:分析首页大板块 URL 我们首先打开待爬取页面 -- 水木社区的首页:htt ...

  9. python爬虫网易云音乐评论再分析_Scrapy爬取网易云音乐和评论(一、思路分析)...

    目录: 前提: scrapy这个框架很多人用过,网上教程也很多,但大多就是爬爬小说这种比较简单且有规律的.尤其大多网站它是可以通过点击下一页的方式爬取下一页,我看到的教程也都是这样的.而网易云的按钮光 ...

最新文章

  1. 情境学习理论视野中的成人学习
  2. redis cluster 添加 删除 重分配 节点
  3. arcgis api for javascript 距离与面积量算
  4. Elasticsearch SQL介绍及实例
  5. HttpClientFactory 结合 Polly 轻松实现重试机制
  6. arduino loar_如何使用Arduino开发板制作函数生成器(波形发生器)
  7. JAVA:jar包下载地址大全
  8. 数组的定义、作为方法参数传递、作为方法的返回值
  9. 在 CentOS7 安装 ELK
  10. 富士康对夏普收购报价大幅缩水20多亿美元
  11. 体验重构版的可道云Kodbox
  12. 网易蜗牛读书与微信读书竞品分析
  13. python tolist()函数
  14. 【隧道篇 / IPsec】(5.6) ❀ 01. IPsec 结构与需求 ❀ FortiGate 防火墙
  15. 服务器虚拟化的主要特点,网络虚拟化的七大特征
  16. AndroidManifast警告On SDK version 23 and up, your app data will be automatically backed up...
  17. 联想拯救者R720在重装Win10系统时无法识别固态硬盘的解决方法
  18. git 克隆到指定分支
  19. 本地同城地方门户网这样运营轻轻松松拿到5W广告费
  20. 双生百合android百度云,双生百合

热门文章

  1. 【毕业设计】基于单片机的智能衣柜系统设计 - 物联网 stm32 嵌入式
  2. SpringBoot监控
  3. 什么是黑盒测试和白盒测试?
  4. 讲透学烂二叉树(六):二叉树的笔试题:翻转|宽度|深度
  5. java设计模式——装饰模式
  6. 游戏全区全服和分区分服 QQ斗地主的设计
  7. 剑灵显示服务器延迟怎么看,windows7电脑如何查看剑灵延迟
  8. 【LeetCode】999. 车的可用捕获量
  9. Dell技术支持年度笑话总结
  10. java面试——集合(ArrayList、lterator、LinkedList)源码理解