scrapy框架详解五 中间件

# -*- 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

===========================SpiderMiddleware====================== 定义:介于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)# ======================DownloaderMiddleware=======================定义:位于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)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • Django中间件 概念:Django中一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改...
    梦醒家先生阅读 1,057评论 0 0
  • 反反爬虫相关机制 (有些网站使用不同程度的复杂性规则防止爬虫访问,绕过这些规则是困难和复杂的,有时可能需要特殊的设...
    暴走的金坤酸奶味阅读 955评论 0 0
  • 云词库 http://blog.csdn.net/xiemanr/article/details/72796739...
    虎七阅读 226评论 0 1
  • 1. 这个世界上没有如果 邹鹿告诉我,如果一开始她就知道,后来的自己真的会喜欢上薛牧。不管是什么原因,她都一定不会...
    空的呼啸阅读 285评论 0 0
  • 公司作为一个经营实体,必须靠利润去维持发展,而要发展,便需要公司中的每个员工都贡献自己的力量和才智。公司是员工努力...
    溢发幽香福佑天成阅读 462评论 1 2