# -*- coding: utf-8 -*-

# 在这里定义蜘蛛中间件的模型
# Define here the models for your spider middleware
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/spider-middleware.html from scrapy import signals # ===========================Spider Middleware============================
# 定义:介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
# Spider Middleware功能:处理爬虫的请求输入和响应输出
# scrapy已经提供了一些直接使用的中间件,他被SPIDER_MIDDLEWARES_BASE定义:
# {
# 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50,
# 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500,
# 'scrapy.spidermiddlewares.referer.RefererMiddleware': 700,
# 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800,
# 'scrapy.spidermiddlewares.depth.DepthMiddleware': 900,
# } # =================SpiderMiddleware类==================
class MaoyanSpiderMiddleware(object):
@classmethod # 类方法,参数crawler,可以通过crawler调用settings里的全局参数
def from_crawler(cls, crawler):
"""
:param crawler: 获取settings里的全局参数,如crawler.settings.get(参数)
"""
s = cls()
# 调用spider_opened函数进行爬取数据并对该函数发送该信号。该信号一般用来分配spider的资源
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened) # 调用spider_closed函数进行关闭爬虫并对该函数发送该信号。该信号用来释放spider在spider_opened时占用的资源。
# crawler.signals.connect(s.spider_closed, signal=signals.spider_closed)
return s # 当返回来的response被Spider Middleware处理时,该方法被调用
def process_spider_input(self, response, spider):
"""
:param response: 被Spider Middleware处理的response对象
:param spider: 返回response对应的spider对象
"""
return None # 当spider处理response对象的结果后,该方法被调用
def process_spider_output(self, response, result, spider):
"""
:param response: 被spider处理后得到结果的response对象
:param result: result包含Item或request对象的可迭代对象,即spider返回的response结果
:param spider: 返回response对象的spider对象
"""
# 遍历返回的可迭代对象
for i in result:
yield i # 当spider的process_spider_input和process_spider_output发生异常时调用该方法
def process_spider_exception(self, response, exception, spider):
"""
:param response: 异常被抛出时被处理的response对象
:param exception: 抛出的异常
:param spider: 抛出该异常的spider对象
"""
pass # 以spider启动的request为参数调用该方法,返回一个request可迭代对象
def process_start_requests(self, start_requests, spider):
"""
:param start_requests: 开始请求的可迭代对象
:param spider: 开始请求所对应的spider对象
"""
# 遍历可迭代对象
for r in start_requests:
yield r # 当spider开启时调用该函数,说明开始爬取数据并分配spider的资源
def spider_opened(self, spider):
"""
:param spider: 开始爬取的spider对象
"""
spider.logger.info('Spider opened: %s' % spider.name) # # 当某个spider被关闭时,说明关闭该爬虫并释放spider在spider_opened时占用的资源。
# def spider_closed(self, spider):
# """
# :param spider: 开始爬取的spider对象
# """
# spider.logger.info('Spider opened:%s'%spider.name) # ======================Downloader Middleware========================
# 定义:位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。见scrapy框架图
# Downloader Middleware功能:可以修改User-Agent、处理重定向、设置代理、失败重试、设置Cookies等
# scrapy已经提供了一些直接使用的中间件,他被DOWNLOADER_MIDDLEWARES_BASE定义:
# {
# 'scrapy.contrib.downloadermiddleware.robotstxt.RobotsTxtMiddleware': 100,
# 'scrapy.contrib.downloadermiddleware.httpauth.HttpAuthMiddleware': 300,
# 'scrapy.contrib.downloadermiddleware.downloadtimeout.DownloadTimeoutMiddleware': 350,
# 'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 400,
# 'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 500,
# 'scrapy.contrib.downloadermiddleware.defaultheaders.DefaultHeadersMiddleware': 550,
# 'scrapy.contrib.downloadermiddleware.redirect.MetaRefreshMiddleware': 580,
# 'scrapy.contrib.downloadermiddleware.httpcompression.HttpCompressionMiddleware': 590,
# 'scrapy.contrib.downloadermiddleware.redirect.RedirectMiddleware': 600,
# 'scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware': 700,
# 'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 750,
# 'scrapy.contrib.downloadermiddleware.chunked.ChunkedTransferMiddleware': 830,
# 'scrapy.contrib.downloadermiddleware.stats.DownloaderStats': 850,
# 'scrapy.contrib.downloadermiddleware.httpcache.HttpCacheMiddleware': 900,
# } # ===============DownloaderMiddleware类=================
class MaoyanDownloaderMiddleware(object):
@classmethod # 类方法,参数crawler,可以通过crawler调用settings里的全局参数
def from_crawler(cls, crawler):
"""
:param crawler: 获取settings里的全局参数,如crawler.settings.get(参数)
"""
s = cls()
# 调用spider_opened函数进行爬取数据并对该函数发送该信号。该信号一般用来分配spider的资源
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened) # 调用spider_closed函数进行关闭爬虫并对该函数发送该信号。该信号用来释放spider在spider_opened时占用的资源。
# crawler.signals.connect(s.spider_closed, signal=signals.spider_closed)
return s # request被scrapy从调度器调度给Downloader Middleware之前调用该方法对request对象进行处理
def process_request(self, request, spider):
"""
:param request: 就是scrapy从调度器调度出来的request对象
:param spider: 就是scrapy调度出来的request对象的spider对象
"""
return None # request对象被Downloader Middleware执行后返回response是才调用该方法对response对象进行处理
def process_response(self, request, response, spider):
"""
:param request: 调度出来被Downloader Middleware处理的request对象
:param response: Downloader Middleware处理request对象返回后的response对象
:param spider: response返回来的spider对象
"""
return response # 当process_request和process_response发生异常时调用
def process_exception(self, request, exception, spider):
"""
:param request: 产生异常的request对象
:param exception: 抛出的异常对象
:param spider: 产生异常的request对象的spider对象
"""
pass # 当spider开启时调用该函数,说明开始爬取数据并分配spider的资源
def spider_opened(self, spider):
"""
:param spider: 开始爬取的spider对象
"""
spider.logger.info('Spider opened: %s' % spider.name) # # 当某个spider被关闭时,说明关闭该爬虫并释放spider在spider_opened时占用的资源。
# def spider_closed(self, spider):
# """
# :param spider: 开始爬取的spider对象
# """
# spider.logger.info('Spider opened: %s' % spider.name)

第十九节:Scrapy爬虫框架之Middleware文件详解的更多相关文章

  1. 第十八节:Scrapy爬虫框架之settings文件详解

    # -*- coding: utf-8 -*- # Scrapy settings for maoyan project## For simplicity, this file contains on ...

  2. 第三百一十九节,Django框架,文件上传

    第三百一十九节,Django框架,文件上传 1.自定义上传[推荐] 请求对象.FILES.get()获取上传文件的对象上传对象.name获取上传文件名称上传对象.chunks()获取上传数据包,字节码 ...

  3. “全栈2019”Java第六十九章:内部类访问外部类成员详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. 第二百六十九节,Tornado框架-Session登录判断

    Tornado框架-Session登录判断 Session需要结合cookie来实现 Session的理解 1.用户登录系统时,服务器端获取系统当前时间,进行nd5加密,得到加密后的密串 2.将密串作 ...

  5. 第二百五十九节,Tornado框架-模板语言的三种方式

    Tornado框架-模板语言的三种方式 模板语言就是可以在html页面,接收逻辑处理的self.render()方法传输的变量,将数据渲染到对应的地方 一.接收值渲染 {{...}}接收self.re ...

  6. 第三十五节,目标检测之YOLO算法详解

    Redmon, J., Divvala, S., Girshick, R., Farhadi, A.: You only look once: Unified, real-time object de ...

  7. 第十五节,卷积神经网络之AlexNet网络详解(五)

    原文 ImageNet Classification with Deep ConvolutionalNeural Networks 下载地址:http://papers.nips.cc/paper/4 ...

  8. 第十七节:Scrapy爬虫框架之item.py文件以及spider中使用item

    Scrapy原理图: item位于原理图的最左边 item.py文件是报存爬取数据的容器,他使用的方法和字典很相似,但是相比字典item多了额外的保护机制,可以避免拼写错误或者定义错误. 1.创建it ...

  9. Scrapy爬虫框架补充内容一(Linux环境)

    Scrapy爬虫框架结构及工作原理详解 scrapy框架的框架结构如下: 组件分析: ENGINE:(核心):处理整个框架的数据流,各个组件在其控制下协同工作 SCHEDULER(调度器):负责接收引 ...

随机推荐

  1. java-异常简介

    1.简介 ############################################################### ############################### ...

  2. javascript---DOM大编程2

    编程挑战 现在利用之前我们学过的JavaScript知识,实现选项卡切换的效果. 效果图: 文字素材: 房产: 275万购昌平邻铁三居 总价20万买一居    200万内购五环三居 140万安家东三环 ...

  3. docker 端口被占用问题解决

    启动容器A, A的端口映射是 80:8080 外部的25000端口映射到服务内部的8080端口:有时候将容器关闭,重新构建镜像及启动容器时会出现一些报错, 比如端口被占用的报错,但通过docker p ...

  4. Linux命令-自动挂载文件/etc/fstab功能详解

    Linux命令-自动挂载文件etcfstab功能详解 一./etc/fstab文件的作用 磁盘被手动挂载之后都必须把挂载信息写入/etc/fstab这个文件中,否则下次开机启动时仍然需要重新挂载. 系 ...

  5. bzoj1233 [Usaco2009Open]干草堆tower 【单调队列dp】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1233 单调队列优化的第一题,搞了好久啊,跟一开始入手斜率优化时感觉差不多... 这一题想通了 ...

  6. TIME-April

    一转眼四月份又过了三分之一,现在才开始计划自己的四月还真是对自己太过放松了呀!不过前一段时间都在搞学生会的五四评优答辩,索然不是我喜欢的过程,但是结果还比较令人欢喜.翻掉过去的篇章,展开新的一页. 四 ...

  7. (三)python函数式编程

    一.高阶函数 高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 结论:函数本身也可以赋值给变量,即:变量可以指向函数 ...

  8. JEECMS9.3集成dubbo操作记录

    需求描述: 门户及其他应用系统需要查询JEECMS9.3中发布的栏目及数据,而其他系统都是基于dubbo开发的,因此想要将JEECMS9.3中集成dubbo并对外提供内容管理服务. 需求实现: 1.添 ...

  9. 基于CentOS6.5下Suricata(一款高性能的网络IDS、IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐)

    不多说,直接上干货! 为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物 ...

  10. mysql之通过cmd连接远程数据库

    ---恢复内容开始--- 目录 前提 连接远程数据库 前提: 本地安装了mysql数据库 本地和远程网络是连通的,通过命令ping ip (即ping 192.168.0.333),可以ping通 连 ...