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方法相关推荐

  1. 【Linux 内核】CFS 调度器 ⑥ ( CFS 调度器就绪队列 cfs_rq | Linux 内核调度实体 sched_entity | “ 红黑树 “ 数据结构 rb_root_cached )

    文章目录 一.CFS 调度器就绪队列 cfs_rq 二.Linux 内核调度实体 sched_entity 三." 红黑树 " 数据结构 rb_root_cached 一.CFS ...

  2. MapReduce多用户任务调度器——容量调度器(Capacity Scheduler)原理和源码研究

    前言:为了研究需要,将Capacity Scheduler和Fair Scheduler的原理和代码进行学习,用两篇文章作为记录.如有理解错误之处,欢迎批评指正. 容量调度器(Capacity Sch ...

  3. golang var 初始化时机_你应该知道的 Go 调度器知识:Go 核心原理 — 协程调度时机...

    点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 本文作者:叶不闻 原文链接:https://juejin.im/post/5dafc241f265da ...

  4. scrapy去重原理,scrapy_redis去重原理和布隆过滤器的使用

    1.去重的应用场景: 如果你只是做一些简单的爬虫,可能不会遇到这种问题,可是如果你正在做一个大型的全站爬虫,或是一个持久化的爬虫,那你一定会遇到这样的问题:刚开始爬虫速度还可以,随着待爬取的队列达到数 ...

  5. Yarn调度器和调度算法(FIFO、容量调度器 与 公平调度器)

    目录 Yarn调度器和调度算法 一.先进先出调度器(FIFO) 二.容量调度器(Capacity Scheduler) 1. 容量调度器特点 2. 容量调度器资源分配算法 三.公平调度器(Fair S ...

  6. 一个IO的传奇一生 (9) -- Noop和Deadline调度器

    Linux中常见IO调度器 Noop调度器算法 Noop是Linux中最简单的调度器,这个调度器基本上没做什么特殊的事情,就是把邻近bio进行了合并处理.从IO的QoS角度来看,这个Noop调度器就是 ...

  7. hadoop3 Yarn容量(Capacity Scheduler)调度器和公平(Fair Scheduler)调度器配置

    文章目录 组件模块说明 容量调度器(Capacity Scheduler) 容量调度器特点 公平调度器(Fair Scheduler) 配置容量调度器案例 例子1 例子2 例子3 例子4 配置公平调度 ...

  8. Yarn调度器和调度算法(From 尚硅谷)

    个人学习整理,所有资料来自尚硅谷 B站学习连接:添加链接描述 Yarn调度器和调度算法 ​ 目前,Hadoop作业调度器主要有三种:FIFO.容量(Capacity Scheduler)和公平(Fai ...

  9. mysql命令查看事件调度_mysql 5.1事件调度器 状态查看、开启命令,以及测试

    五.事件调度器测试 5.1.测试目的 5.1.1  配置方法 5.1.2  是否正常工作 5.1.3  日常的维护 5.2.事件调度器介绍 自MySQL5.1.6起,增加了一个非常有特色的功能–事件调 ...

  10. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (11) - 乱序引擎/重命名器调度器

    Renamer 从上图中可以看出,重命名器是连接"有序前端"与"调度器的数据流世界(即乱序引擎)"的桥梁.它每周期可以最多从微指令队列搬移4条微指令到乱序引擎. ...

最新文章

  1. 基于VTK的MFC应用程序开发(1)
  2. Python编程:制作电子相册
  3. JavaScript解析Json字符串
  4. System.FormatException: GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。...
  5. POJ 3984 迷宫问题
  6. P1412-经营与开发【dp】
  7. 【强化学习】PPO代码注释版本
  8. Oracle 循环相关
  9. ubuntu 改linux密码忘了怎么办,Ubuntu 14.04忘记root密码的解决方法
  10. htaccess有什么用
  11. 如何在Windows上制作一个包含.lib和.dll的Rust Crate包
  12. 2021-04-02
  13. linux wps 公式编辑器,WPS 2012数学公式编辑器的使用方法(详细图解)
  14. 给移动互联网创业公司的六条建议
  15. 【软件工程】需求规格说明书
  16. 四连涨!海尔智家这波私有化还有多大想象空间?
  17. excel设置行高_手把手教你用wps表格excel制作田字格书法练习字帖
  18. RK3326 8.1系统定制化通用修改
  19. JavaScript学习:函数
  20. RT-Thread GD32F4xx enc28j60 + Lwip使用记录

热门文章

  1. 什么是数字式射频信号发生器
  2. 机器学习、数据挖掘、神经网络、人工智能和模式识别之间,主要是什么关系
  3. 【大规模MIMO学习笔记】大规模MIMO的信道特点
  4. C语言基础学习——基本数据类型(float型)
  5. 三星S5P6818工控底板 (ARM Cortex-A53架构)
  6. 乐山市计算机学校灵异事件,我也来说个以前上学时候的灵异事件
  7. 编写一个程序,将两个字符串连接起来,不要用strcat 或 strncat 函数。
  8. 日紫白飞星算法_年月日时紫白飞星算法
  9. 1.CPU基本工作流程
  10. 信息系统项目干系人管理