日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

scrapy的信号(signal)以及对下载中间件的一些总结

發(fā)布時(shí)間:2024/3/24 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scrapy的信号(signal)以及对下载中间件的一些总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

直接往redis里記錄一下,我今天爬了多少數(shù)據(jù)
是否和我預(yù)期一樣
爬蟲(chóng)狀態(tài)碼異常,你怎么查
我的爬蟲(chóng)沒(méi)任務(wù)了它就會(huì)退出了,我不想它退出怎么辦
爬蟲(chóng)關(guān)閉了,我不想看進(jìn)程,我希望給我來(lái)個(gè)郵件
怎么辦
我現(xiàn)在給你一批url讓你去爬,完了,我待會(huì)再給你一批。時(shí)間不確定
你怎么辦?


以上,完美的闡述了scrapy信號(hào)的用途。

首先,信號(hào)的一些基本概念就不說(shuō)了,可以直接百度 : scrapy signal的使用

直接上代碼說(shuō)用途

我將這段代碼放到中間件里,本來(lái)應(yīng)該是,再與setting同級(jí)的目錄下創(chuàng)建一個(gè)py文件,然后來(lái)寫(xiě)的。
然后再在setting的 EXTENSIONS 里啟用并給出等級(jí),就像piplin和middleware一樣。

class QianlongwangSpiderMiddleware(object):# Not all methods need to be defined. If a method is not defined,# scrapy acts as if the spider middleware does not modify the# passed objects.@classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s = cls()crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)crawler.signals.connect(s.item_scraped, signal=signals.item_scraped)crawler.signals.connect(s.spider_closed, signal=signals.spider_closed)crawler.signals.connect(s.spider_error, signal=signals.spider_error)crawler.signals.connect(s.spider_idle, signal=signals.spider_idle)return s# 當(dāng)spider開(kāi)始爬取時(shí)發(fā)送該信號(hào)。該信號(hào)一般用來(lái)分配spider的資源,不過(guò)其也能做任何事。def spider_opened(self, spider):spider.logger.info('pa chong kai shi le: %s' % spider.name)print('start','1')def item_scraped(self,item, response, spider):global hahahahahaha += 1# 當(dāng)某個(gè)spider被關(guān)閉時(shí),該信號(hào)被發(fā)送。該信號(hào)可以用來(lái)釋放每個(gè)spider在 spider_opened 時(shí)占用的資源。def spider_closed(self,spider, reason):print('-------------------------------all over------------------------------------------')global hahahaprnit(spider.name,' closed')# 當(dāng)spider的回調(diào)函數(shù)產(chǎn)生錯(cuò)誤時(shí)(例如,拋出異常),該信號(hào)被發(fā)送。def spider_error(self,failure, response, spider):code = response.statusprint('spider error')# 當(dāng)spider進(jìn)入空閑(idle)狀態(tài)時(shí)該信號(hào)被發(fā)送。空閑意味著:# requests正在等待被下載# requests被調(diào)度# items正在item pipeline中被處理def spider_idle(self,spider):for i in range(10):print(spider.name)

主要是看代碼。以后有這種需求了,最起碼知道代碼寫(xiě)在哪里了。

然后記錄一下今天測(cè)試下載中間件的一些總結(jié)

首先需要明確:

  • 請(qǐng)求是引擎發(fā)出來(lái)的,不是爬蟲(chóng)發(fā)出來(lái)的
  • 引擎從爬蟲(chóng)拿url,給調(diào)度器去重,同時(shí)會(huì)從調(diào)度器的任務(wù)隊(duì)列里取出一個(gè)任務(wù),給下載器
  • 下載器下載完以后,下載器把response返回給引擎
  • 先說(shuō)process_request(request, spider)

  • 當(dāng)設(shè)置了很多中間件的時(shí)候,會(huì)按照setting里的設(shè)置,按照從小到大執(zhí)行
  • 假如有兩個(gè)中間件的等級(jí)一樣,這兩個(gè)中間都會(huì)被執(zhí)行。(執(zhí)行順序沒(méi)有得出有效結(jié)論)
  • 即使某個(gè)中間件的設(shè)置時(shí)錯(cuò)的,比如,故意在代理中間件里給一個(gè)錯(cuò)誤的ip,依然不會(huì)中斷中間件的執(zhí)行,也就是,scrapy無(wú)法檢測(cè)代理中的操作是否合法。
  • 經(jīng)過(guò)中間件故意的錯(cuò)誤的加代理,下載器仍然去執(zhí)行這個(gè)任務(wù)了,只不過(guò)根據(jù)另一個(gè)中間件:RetryMiddleware 的設(shè)定去處理了這個(gè)請(qǐng)求(默認(rèn)的是,請(qǐng)求連續(xù)失敗三次退出任務(wù))
  • 當(dāng)這個(gè)請(qǐng)求第一次失敗時(shí)候,依然會(huì)再次經(jīng)過(guò)設(shè)置的中間件。
  • 第一個(gè)發(fā)出error信號(hào)的不是引擎,是scraper,它是連接引擎、爬蟲(chóng)、下載器的一個(gè)東西。。。。然后引擎才發(fā)出錯(cuò)誤信號(hào)
  • (重點(diǎn))每一個(gè)任務(wù),也就是每一個(gè)請(qǐng)求,不管在什么情況下,只要設(shè)置了中間件,就會(huì)孜孜不倦的去通過(guò)這些中間件,然后到達(dá)下載器
  • 然后說(shuō)process_response(request, response, spider)

  • 因?yàn)楂@取的響應(yīng)是從下載器到引擎的,所以response經(jīng)過(guò)中間件的順序剛好與request相反
  • 是從大到小執(zhí)行的
  • 最后明確

    第一個(gè)中間件是最靠近引擎的,最后一個(gè)中間件是最靠近下載器的

    總結(jié)

    以上是生活随笔為你收集整理的scrapy的信号(signal)以及对下载中间件的一些总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。