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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

直接往redis里記錄一下,我今天爬了多少數據
是否和我預期一樣
爬蟲狀態碼異常,你怎么查
我的爬蟲沒任務了它就會退出了,我不想它退出怎么辦
爬蟲關閉了,我不想看進程,我希望給我來個郵件
怎么辦
我現在給你一批url讓你去爬,完了,我待會再給你一批。時間不確定
你怎么辦?


以上,完美的闡述了scrapy信號的用途。

首先,信號的一些基本概念就不說了,可以直接百度 : scrapy signal的使用

直接上代碼說用途

我將這段代碼放到中間件里,本來應該是,再與setting同級的目錄下創建一個py文件,然后來寫的。
然后再在setting的 EXTENSIONS 里啟用并給出等級,就像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# 當spider開始爬取時發送該信號。該信號一般用來分配spider的資源,不過其也能做任何事。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# 當某個spider被關閉時,該信號被發送。該信號可以用來釋放每個spider在 spider_opened 時占用的資源。def spider_closed(self,spider, reason):print('-------------------------------all over------------------------------------------')global hahahaprnit(spider.name,' closed')# 當spider的回調函數產生錯誤時(例如,拋出異常),該信號被發送。def spider_error(self,failure, response, spider):code = response.statusprint('spider error')# 當spider進入空閑(idle)狀態時該信號被發送。空閑意味著:# requests正在等待被下載# requests被調度# items正在item pipeline中被處理def spider_idle(self,spider):for i in range(10):print(spider.name)

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

然后記錄一下今天測試下載中間件的一些總結

首先需要明確:

  • 請求是引擎發出來的,不是爬蟲發出來的
  • 引擎從爬蟲拿url,給調度器去重,同時會從調度器的任務隊列里取出一個任務,給下載器
  • 下載器下載完以后,下載器把response返回給引擎
  • 先說process_request(request, spider)

  • 當設置了很多中間件的時候,會按照setting里的設置,按照從小到大執行
  • 假如有兩個中間件的等級一樣,這兩個中間都會被執行。(執行順序沒有得出有效結論)
  • 即使某個中間件的設置時錯的,比如,故意在代理中間件里給一個錯誤的ip,依然不會中斷中間件的執行,也就是,scrapy無法檢測代理中的操作是否合法。
  • 經過中間件故意的錯誤的加代理,下載器仍然去執行這個任務了,只不過根據另一個中間件:RetryMiddleware 的設定去處理了這個請求(默認的是,請求連續失敗三次退出任務)
  • 當這個請求第一次失敗時候,依然會再次經過設置的中間件。
  • 第一個發出error信號的不是引擎,是scraper,它是連接引擎、爬蟲、下載器的一個東西。。。。然后引擎才發出錯誤信號
  • (重點)每一個任務,也就是每一個請求,不管在什么情況下,只要設置了中間件,就會孜孜不倦的去通過這些中間件,然后到達下載器
  • 然后說process_response(request, response, spider)

  • 因為獲取的響應是從下載器到引擎的,所以response經過中間件的順序剛好與request相反
  • 是從大到小執行的
  • 最后明確

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

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。