scrapy 引擎,调度器出入队列及去重原理及几个构造request方法
scrapy -engine
1.engine.py
# 调度四个模块def _start(self):request = self.spider.start_request() spider把起始url得到的request 交给 enginerequest = self.spider_mid.process_request(request) 爬虫中间件:在spider交给 engine之前 做事情 *******self.scheduler.add_request(request) engine把request 交给 调度器 入队列request = self.scheduler.get_request() 调度器出队列 又交给 enginerequest = self.down_mid.process_request(request) 下载中间件:engine 把request交给下载器之前做事情 *******response = self.downloader.get_response(request) engine 把 request 交给下载器之后得到的响应对象response = self.down_mid.process_response(response) 下载中间件:下载器把response交给engine 之前替换新的 *******response = self.spider_mid.process_response(response) 爬虫中间件:engine把response交给spider之前做事情 *******result = self.spider.parse(response) spider拿到的响应对象处理解析if isinstance(result, Request): engine 把解析结果中的url request判断出来分别给 调度器 和 管道self.scheduler.add_request(result) 类型是request 交给调度器else:self.pipeline.process_item(result) 类型是数据 交给管道
2.调度器的出入队列 queue及去重原理
from six.moves.queue import Queue
class Scheduler(object):def __init__(self):self.queue=Queue()self.filter_container=set()# 入队列def add_request(self,request):if not self.fillter_request(request): #重复self.queue.put(request)self.filter_container.add(request.url)# 出队列def get_request(self):try:return self.queue.get(False)except Exception as e:return None#过滤def fillter_request(self,request):if request.url in self.filter_container:return Trueelse:return False
2.指纹结合去重
def _creat_fp(self,request):# 1.排序url=w3lib.url.canonicalize_url(request.url)# 2.method大小写method=request.method.upper()# 3.paramsparams=sorted(request.params.items())data=sorted(request.data.items())fp_str=url+method+str(params)+str(data)# 4.生成指纹fp=hashlib.sha1()fp.updte(fp_str.encode())return fp_str.hexdigest()
3.scrapy中构造requests的几个方法
1.yield response.follow(
) 当next_url不全时,自动补全net_url
next_url = response.xpath('//a[@class="pn-next"]/@href').extract_first()yield response.follow(next_url,callback=self.parse_book,meta={'book': item})
2.scrapy.Request()
3.中间件中的process_exception
当中间件中的process_exception 捕获到 超时异常 或其他 代理原因时 可使用 process_exception捕获异常
def process_exception(self, request, exception, spider):# passself.logger.debug('捕获到超时异常!!!!!')self.logger.debug('重试')request.meta['proxy'] = 'https:60.235.28.165:8088' #更换代理或其他return request#在爬虫文件中重写父类 处理捕获到的 异常重新构造一个请求def make_requests_from_url(self, url):return scrapy.Request(url=url, meta={'download_timeout': 5}, callback=self.parse)
4.start_requests()和make_requests_from_url()的区别
有start_requests时不会执行另一个 作用: 构造url 为请求对象 url 可以自己指定
make_requests_from_url 构造 start_urls列表中的url 为请求对象
2.from copy import deepcopy
scrapy 中循环嵌套循环时 使用 deepcopy(item)开启一个新的内存空间 使得item中的数据不会被覆盖,
from copy import deepcopy
class JingdSpider(scrapy.Spider):name = 'jingd'start_urls = ['https://book.jd.com/booksort.html']def parse(self, response):dt_list = response.xpath('//*[@id="booksort"]/div[2]/dl/dt[1]') #for dt in dt_list:item = JdongItem()item['big_name'] = dt.xpath('./a/text()').extract_first()for em in em_list:item['small_name'] = em.xpath('./a/text()').extract_first()yield scrapy.Request(url=small_link, callback=self.parse_book, meta={'book': deepcopy(item)})
#for循环下的itemdef parse_book(self, response):item = response.meta['book']book_list = response.xpath('//*[@id="plist"]/ul/li[1]') #for book in book_list:item['img_url'] = 'https:' + book.xpathyield scrapy.Request(url=price_url, callback=self.parse_price, meta={'book': deepcopy(item)})
#for 循环下的itemdef parse_price(self, response):item = response.meta['book']item['book_price'] = loads(response.body.decode())[0]['p']#没有在循环下yield item
在for 循环下有多个item['***']数据时使用
scrapy 引擎,调度器出入队列及去重原理及几个构造request方法相关推荐
- 【Linux 内核】CFS 调度器 ⑥ ( CFS 调度器就绪队列 cfs_rq | Linux 内核调度实体 sched_entity | “ 红黑树 “ 数据结构 rb_root_cached )
文章目录 一.CFS 调度器就绪队列 cfs_rq 二.Linux 内核调度实体 sched_entity 三." 红黑树 " 数据结构 rb_root_cached 一.CFS ...
- MapReduce多用户任务调度器——容量调度器(Capacity Scheduler)原理和源码研究
前言:为了研究需要,将Capacity Scheduler和Fair Scheduler的原理和代码进行学习,用两篇文章作为记录.如有理解错误之处,欢迎批评指正. 容量调度器(Capacity Sch ...
- golang var 初始化时机_你应该知道的 Go 调度器知识:Go 核心原理 — 协程调度时机...
点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 本文作者:叶不闻 原文链接:https://juejin.im/post/5dafc241f265da ...
- scrapy去重原理,scrapy_redis去重原理和布隆过滤器的使用
1.去重的应用场景: 如果你只是做一些简单的爬虫,可能不会遇到这种问题,可是如果你正在做一个大型的全站爬虫,或是一个持久化的爬虫,那你一定会遇到这样的问题:刚开始爬虫速度还可以,随着待爬取的队列达到数 ...
- Yarn调度器和调度算法(FIFO、容量调度器 与 公平调度器)
目录 Yarn调度器和调度算法 一.先进先出调度器(FIFO) 二.容量调度器(Capacity Scheduler) 1. 容量调度器特点 2. 容量调度器资源分配算法 三.公平调度器(Fair S ...
- 一个IO的传奇一生 (9) -- Noop和Deadline调度器
Linux中常见IO调度器 Noop调度器算法 Noop是Linux中最简单的调度器,这个调度器基本上没做什么特殊的事情,就是把邻近bio进行了合并处理.从IO的QoS角度来看,这个Noop调度器就是 ...
- hadoop3 Yarn容量(Capacity Scheduler)调度器和公平(Fair Scheduler)调度器配置
文章目录 组件模块说明 容量调度器(Capacity Scheduler) 容量调度器特点 公平调度器(Fair Scheduler) 配置容量调度器案例 例子1 例子2 例子3 例子4 配置公平调度 ...
- Yarn调度器和调度算法(From 尚硅谷)
个人学习整理,所有资料来自尚硅谷 B站学习连接:添加链接描述 Yarn调度器和调度算法 目前,Hadoop作业调度器主要有三种:FIFO.容量(Capacity Scheduler)和公平(Fai ...
- mysql命令查看事件调度_mysql 5.1事件调度器 状态查看、开启命令,以及测试
五.事件调度器测试 5.1.测试目的 5.1.1 配置方法 5.1.2 是否正常工作 5.1.3 日常的维护 5.2.事件调度器介绍 自MySQL5.1.6起,增加了一个非常有特色的功能–事件调 ...
- Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (11) - 乱序引擎/重命名器调度器
Renamer 从上图中可以看出,重命名器是连接"有序前端"与"调度器的数据流世界(即乱序引擎)"的桥梁.它每周期可以最多从微指令队列搬移4条微指令到乱序引擎. ...
最新文章
- 基于VTK的MFC应用程序开发(1)
- Python编程:制作电子相册
- JavaScript解析Json字符串
- System.FormatException: GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。...
- POJ 3984 迷宫问题
- P1412-经营与开发【dp】
- 【强化学习】PPO代码注释版本
- Oracle 循环相关
- ubuntu 改linux密码忘了怎么办,Ubuntu 14.04忘记root密码的解决方法
- htaccess有什么用
- 如何在Windows上制作一个包含.lib和.dll的Rust Crate包
- 2021-04-02
- linux wps 公式编辑器,WPS 2012数学公式编辑器的使用方法(详细图解)
- 给移动互联网创业公司的六条建议
- 【软件工程】需求规格说明书
- 四连涨!海尔智家这波私有化还有多大想象空间?
- excel设置行高_手把手教你用wps表格excel制作田字格书法练习字帖
- RK3326 8.1系统定制化通用修改
- JavaScript学习:函数
- RT-Thread GD32F4xx enc28j60 + Lwip使用记录