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引擎和爬蟲(chóng)之間的框架,主要工作是處理蜘蛛的響應(yīng)輸入和請(qǐng)求輸出勃黍。

# Spider Middleware功能:處理爬蟲(chóng)的請(qǐng)求輸入和響應(yīng)輸出

# scrapy已經(jīng)提供了一些直接使用的中間件侨把,他被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類(lèi)==================

class MaoyanSpiderMiddleware(object):?

?????????@classmethod

?????????# 類(lèi)方法耀鸦,參數(shù)crawler瞧哟,可以通過(guò)crawler調(diào)用settings里的全局參數(shù)?

?????????def from_crawler(cls, crawler):?

?????????????????????""" :param crawler: 獲取settings里的全局參數(shù)且轨,如????????????????????crawler.settings.get(參數(shù)) """?

?????????s = cls()

?????????????# 調(diào)用spider_opened函數(shù)進(jìn)行爬取數(shù)據(jù)并對(duì)該函數(shù)發(fā)送該信號(hào)毛肋。該信號(hào)一? ? ? ? ? ? ? ? ? 般用來(lái)分配spider的資源?

?????crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)?

? ? ? ?# 調(diào)用spider_closed函數(shù)進(jìn)行關(guān)閉爬蟲(chóng)并對(duì)該函數(shù)發(fā)送該信號(hào)梨水。該信號(hào)用來(lái)釋放? ? ? spider在spider_opened時(shí)占用的資源。?

?????# crawler.signals.connect(s.spider_closed, signal=signals.spider_closed)

?????????return s?

?# 當(dāng)返回來(lái)的response被Spider Middleware處理時(shí)僚饭,該方法被調(diào)用?

?def process_spider_input(self, response, spider):?

?????"""?

?????????????:param response: 被Spider Middleware處理的response對(duì)象?

?????????????:param spider: 返回response對(duì)應(yīng)的spider對(duì)象?

?"""?

?????????????????return None?

?# 當(dāng)spider處理response對(duì)象的結(jié)果后震叮,該方法被調(diào)用?

?def process_spider_output(self, response, result, spider): ????

?????????""" :param response: 被spider處理后得到結(jié)果的response對(duì)象?

? ? ? ? ? ? ? ? :param result: result包含Item或request對(duì)象的可迭代對(duì)象,即spider返回的response結(jié)果?

?????????????????:param spider: 返回response對(duì)象的spider對(duì)象 """

?????????????# 遍歷返回的可迭代對(duì)象?

?????????????for i in result:?

?????????????????????yield i?

?????????# 當(dāng)spider的process_spider_input和process_spider_output發(fā)生異常時(shí)調(diào)用該方法?

def process_spider_exception(self, response, exception, spider):?

?"""

?????????????:param response: 異常被拋出時(shí)被處理的response對(duì)象?

?????????????:param exception: 拋出的異常?

? ? ? ? ? ? ?:param spider: 拋出該異常的spider對(duì)象 """?

? ? ? ? ? ? ? pass 鳍鸵、

# 以spider啟動(dòng)的request為參數(shù)調(diào)用該方法,返回一個(gè)request可迭代對(duì)象?

?def process_start_requests(self, start_requests, spider):?

?"""?

?????????????:param start_requests: 開(kāi)始請(qǐng)求的可迭代對(duì)象?

?????????????:param spider: 開(kāi)始請(qǐng)求所對(duì)應(yīng)的spider對(duì)象 """?

? ? ? ? ? ? ? ? # 遍歷可迭代對(duì)象?

? ? ? ? ? ? ? ? for r in start_requests: yield r?

?# 當(dāng)spider開(kāi)啟時(shí)調(diào)用該函數(shù)苇瓣,說(shuō)明開(kāi)始爬取數(shù)據(jù)并分配spider的資源?

?def spider_opened(self, spider):?

?????????""" :param spider: 開(kāi)始爬取的spider對(duì)象 """?

?????????spider.logger.info('Spider opened: %s' % spider.name)

? ? ? ? ? ?# # 當(dāng)某個(gè)spider被關(guān)閉時(shí),說(shuō)明關(guān)閉該爬蟲(chóng)并釋放spider在spider_opened時(shí)占用的資源权纤。?

?# def spider_closed(self, spider):?

?# """ # :param spider: 開(kāi)始爬取的spider對(duì)象 # """?

?# spider.logger.info('Spider opened:%s'%spider.name)# ======================DownloaderMiddleware=======================定義:位于Scrapy引擎和下載器之間的框架钓简,主要是處理Scrapy引擎與下載器之間的請(qǐng)求及響應(yīng)。見(jiàn)scrapy框架圖

# Downloader Middleware功能:可以修改User-Agent汹想、處理重定向外邓、設(shè)置代理、失敗重試古掏、設(shè)置Cookies等

# scrapy已經(jīng)提供了一些直接使用的中間件损话,他被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類(lèi)=================

class MaoyanDownloaderMiddleware(object):?

?????@classmethod?

?????# 類(lèi)方法,參數(shù)crawler槽唾,可以通過(guò)crawler調(diào)用settings里的全局參數(shù)?

?????def from_crawler(cls, crawler):?

?""" :param crawler: 獲取settings里的全局參數(shù)丧枪,如crawler.settings.get(參數(shù)) """?

?????????????????s = cls()?

?????????????????# 調(diào)用spider_opened函數(shù)進(jìn)行爬取數(shù)據(jù)并對(duì)該函數(shù)發(fā)送該信號(hào)。該信號(hào)一般用來(lái)分配spider的資源?

?????????????????crawler.signals.connect(s.spider_opened, signal=signals.spider_opened) # 調(diào)用spider_closed函數(shù)進(jìn)行關(guān)閉爬蟲(chóng)并對(duì)該函數(shù)發(fā)送該信號(hào)庞萍。該信號(hào)用來(lái)釋放spider在spider_opened時(shí)占用的資源拧烦。

?????????????????# crawler.signals.connect(s.spider_closed, signal=signals.spider_closed) ????????????????return s?

?# request被scrapy從調(diào)度器調(diào)度給Downloader Middleware之前調(diào)用該方法對(duì)request對(duì)象進(jìn)行處理?

?????def process_request(self, request, spider):?

?????""" :param request: 就是scrapy從調(diào)度器調(diào)度出來(lái)的request對(duì)象?

?????????:param spider: 就是scrapy調(diào)度出來(lái)的request對(duì)象的spider對(duì)象?

?????"""?

?????????????return None?

?# request對(duì)象被Downloader Middleware執(zhí)行后返回response是才調(diào)用該方法對(duì)response對(duì)象進(jìn)行處理?

?????????def process_response(self, request, response, spider):?

?""" :param request: 調(diào)度出來(lái)被Downloader Middleware處理的request對(duì)象?

?????:param response: Downloader Middleware處理request對(duì)象返回后的response對(duì)象 :param spider: response返回來(lái)的spider對(duì)象?

?????"""?

?????????????????????return response?

?# 當(dāng)process_request和process_response發(fā)生異常時(shí)調(diào)用?

?????def process_exception(self, request, exception, spider):?

?????????????""" :param request: 產(chǎn)生異常的request對(duì)象?

? ? ? ? ? ? ? ? ? :param exception: 拋出的異常對(duì)象?

? ? ? ? ? ? ? ? ? :param spider: 產(chǎn)生異常的request對(duì)象的spider對(duì)象 """?

?????????????????????pass # 當(dāng)spider開(kāi)啟時(shí)調(diào)用該函數(shù),

說(shuō)明開(kāi)始爬取數(shù)據(jù)并分配spider的資源

?????def spider_opened(self, spider):

?""" :param spider: 開(kāi)始爬取的spider對(duì)象 """?

?????????????spider.logger.info('Spider opened: %s' % spider.name)?

?# # 當(dāng)某個(gè)spider被關(guān)閉時(shí)钝计,說(shuō)明關(guān)閉該爬蟲(chóng)并釋放spider在spider_opened時(shí)占用的資源恋博。

?????# def spider_closed(self, spider):?

?????????????# """ # :param spider:

?????????????????????????開(kāi)始爬取的spider對(duì)象 #?

?????????????????""" # spider.logger.info('Spider opened: %s' % spider.name)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市私恬,隨后出現(xiàn)的幾起案子债沮,更是在濱河造成了極大的恐慌,老刑警劉巖本鸣,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疫衩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荣德,警方通過(guò)查閱死者的電腦和手機(jī)闷煤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)命爬,“玉大人曹傀,你說(shuō)我怎么就攤上這事∷峭穑” “怎么了皆愉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)艇抠。 經(jīng)常有香客問(wèn)我幕庐,道長(zhǎng),這世上最難降的妖魔是什么家淤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任异剥,我火速辦了婚禮,結(jié)果婚禮上絮重,老公的妹妹穿的比我還像新娘冤寿。我一直安慰自己歹苦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布督怜。 她就那樣靜靜地躺著殴瘦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪号杠。 梳的紋絲不亂的頭發(fā)上蚪腋,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音姨蟋,去河邊找鬼屉凯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛眼溶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播堂飞,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼哩簿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了酝静?” 一聲冷哼從身側(cè)響起节榜,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎别智,沒(méi)想到半個(gè)月后宗苍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薄榛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年讳窟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敞恋。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丽啡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硬猫,到底是詐尸還是另有隱情补箍,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布啸蜜,位于F島的核電站坑雅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏衬横。R本人自食惡果不足惜裹粤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜂林。 院中可真熱鬧遥诉,春花似錦拇泣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至愕难,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惫霸,已是汗流浹背猫缭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壹店,地道東北人猜丹。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像硅卢,于是被迫代替她去往敵國(guó)和親射窒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Django中間件 概念:Django中一個(gè)輕量級(jí)将塑、底層的插件系統(tǒng)脉顿,可以介入Django的請(qǐng)求和響應(yīng)處理過(guò)程,修改...
    夢(mèng)醒家先生閱讀 1,059評(píng)論 0 0
  • 反反爬蟲(chóng)相關(guān)機(jī)制 (有些網(wǎng)站使用不同程度的復(fù)雜性規(guī)則防止爬蟲(chóng)訪問(wèn)点寥,繞過(guò)這些規(guī)則是困難和復(fù)雜的艾疟,有時(shí)可能需要特殊的設(shè)...
    暴走的金坤酸奶味閱讀 958評(píng)論 0 0
  • 云詞庫(kù) http://blog.csdn.net/xiemanr/article/details/72796739...
    虎七閱讀 229評(píng)論 0 1
  • 1. 這個(gè)世界上沒(méi)有如果 鄒鹿告訴我,如果一開(kāi)始她就知道敢辩,后來(lái)的自己真的會(huì)喜歡上薛牧蔽莱。不管是什么原因,她都一定不會(huì)...
    空的呼嘯閱讀 288評(píng)論 0 0
  • 公司作為一個(gè)經(jīng)營(yíng)實(shí)體仪糖,必須靠利潤(rùn)去維持發(fā)展,而要發(fā)展迫肖,便需要公司中的每個(gè)員工都貢獻(xiàn)自己的力量和才智乓诽。公司是員工努力...
    溢發(fā)幽香福佑天成閱讀 464評(píng)論 1 2