python爬虫之Scrapy介绍八——Scrapy-分布式(以爬取京东读书为示例)
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-分布式(以爬取京东读书为示例)相关推荐
- Python爬虫新手入门教学(十):爬取彼岸4K超清壁纸
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...
- Python爬虫新手入门教学(十七):爬取yy全站小视频
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...
- Python爬虫新手入门教学(十三):爬取高质量超清壁纸
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...
- Python爬虫: 单网页 所有静态网页 动态网页爬取
Python爬虫: 单网页 所有静态网页 动态网页爬取 前言:所有页代码主干均来自网上!!!感谢大佬们. 其实我对爬虫还挺感兴趣的,因为我玩instagram(需要科学上网),上过IG的人都知道IG虽 ...
- python爬虫实战之图灵社区图书信息的爬取(找了久,才找到一个比较好爬取的网站)
python爬虫实战之图灵社区图书信息的爬取 程序的描述 目标 获取图灵社区(https://www.ituring.com.cn/book)中40本图书的书名 将获取的信息以列表的形式输出到屏幕上, ...
- python怎么爬取b站_【Python爬虫实例学习篇】——4、超详细爬取bilibili视频
[Python爬虫实例学习篇]--4.超详细爬取bilibili视频 由于经常在B站上学习,但无奈于家里网络太差,在线观看卡顿严重,于是萌生了下载视频的想法(如果只是单纯想下载视频,请用you-get ...
- Python爬虫新手入门教学(二):爬取小说
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...
- Python爬虫初级(十三)—— 水木社区论坛爬取实战
欢迎关注公众号K的笔记阅读博主更多优质学习内容 上一篇文章:Python爬虫初级(十二)-- 新闻消息抓取实战 实战阶段一:分析首页大板块 URL 我们首先打开待爬取页面 -- 水木社区的首页:htt ...
- python爬虫网易云音乐评论再分析_Scrapy爬取网易云音乐和评论(一、思路分析)...
目录: 前提: scrapy这个框架很多人用过,网上教程也很多,但大多就是爬爬小说这种比较简单且有规律的.尤其大多网站它是可以通过点击下一页的方式爬取下一页,我看到的教程也都是这样的.而网易云的按钮光 ...
最新文章
- 情境学习理论视野中的成人学习
- redis cluster 添加 删除 重分配 节点
- arcgis api for javascript 距离与面积量算
- Elasticsearch SQL介绍及实例
- HttpClientFactory 结合 Polly 轻松实现重试机制
- arduino loar_如何使用Arduino开发板制作函数生成器(波形发生器)
- JAVA:jar包下载地址大全
- 数组的定义、作为方法参数传递、作为方法的返回值
- 在 CentOS7 安装 ELK
- 富士康对夏普收购报价大幅缩水20多亿美元
- 体验重构版的可道云Kodbox
- 网易蜗牛读书与微信读书竞品分析
- python tolist()函数
- 【隧道篇 / IPsec】(5.6) ❀ 01. IPsec 结构与需求 ❀ FortiGate 防火墙
- 服务器虚拟化的主要特点,网络虚拟化的七大特征
- AndroidManifast警告On SDK version 23 and up, your app data will be automatically backed up...
- 联想拯救者R720在重装Win10系统时无法识别固态硬盘的解决方法
- git 克隆到指定分支
- 本地同城地方门户网这样运营轻轻松松拿到5W广告费
- 双生百合android百度云,双生百合