scrapy結構及各部件介紹


1.總覽,數據流圖:

 

2.Engine:引擎負責控制系統所有組件之間的數據流,並在發生某些操作時觸發事件。

3.Scheduler:調度程序接收來自引擎的請求,並將它們排入隊列,並在之后,當Engine需要的時候,將requests發送給engine。

4.Downloader:下載器負責提取網頁並將它們饋送到引擎,然后引擎將其發送給spider。

5.Spiders:蜘蛛是Scrapy用戶編寫的自定義類,用於解析響應並從中提取item項目(也稱為抓取的項目)或追加的其他請求。詳情已經在上一篇文章中介紹過了,這里就不重復了。

6.Item Pipeline:Item Pipeline負責處理被蜘蛛提取的item, 典型的任務包括清理,驗證和持久性(如將項目存儲在數據庫中)。 這一部分在上一篇文章中也詳細的介紹過了。

7.Downloader middlewares:下載器中間件是位於引擎和下載器之間的特定的鈎子,當它們從引擎傳遞到下載器時處理請求,以及從下載器傳遞到引擎的響應。使用下載中間件可以達成如下的目的:

  • 在將請求發送到下載器之前處理請求(即在Scrapy將請求發送到網站之前)。在傳遞給蜘蛛之前改變接收到的響應;在傳遞給蜘蛛之前改變接收到的響應;
  • 發送新的請求,而不是將接收到的響應傳遞給蜘蛛;
  • 發送新的請求,而不是將接收到的響應傳遞給蜘蛛;向蜘蛛傳遞響應而不需要獲取網頁;

 

扔掉一些請求。

使用下載中間件:

7.1 激活下載中間件:

  設置:

DOWNLOADER_MIDDLEWARES = {'myproject.middlewares.CustomDownloaderMiddleware': 543,}
修改設置的方法,在上一篇博文中有詳細的介紹。
住:

DOWNLOADER_MIDDLEWARES設置與在Scrapy中定義的DOWNLOADER_MIDDLEWARES_BASE設置合並(並且不意味着被覆蓋),然后按順序排序以獲得最終的啟用中間件的排序列表:第一個中間件是靠近引擎的第一個中間件,最后一個是一個靠近下載器。換句話說,每個中間件的process_request()方法將以增加的中間件順序(100,200,300,...)調用,每個中間件的process_response()方法將按降序調用。

要決定分配給中間件的順序,請參閱DOWNLOADER_MIDDLEWARES_BASE設置(在上一篇文章中有詳細的介紹),並根據要插入中間件的位置選擇一個值。順序很重要,因為每個中間件都執行不同的操作,而您的中間件可能依賴於之前(或后續)正在使用的中間件。

如果要禁用內置中間件(在DOWNLOADER_MIDDLEWARES_BASE中定義並默認啟用的中間件),則必須在項目的DOWNLOADER_MIDDLEWARES設置中定義它,並將None指定為其值。例如,如果您要禁用用戶代理中間件:

 

7.2 編寫自己的下載中間件:

原函數位於:class scrapy.downloadermiddlewares.DownloaderMiddleware

每一個下載中間件,都定義了以下的一個或者多個函數:

7.2.1 process_request(requestspider):

返回 None,返回一個Response對象,返回一個Request對象,或者拋出IgnoreRequest。

每一個通過下載中間件的requests請求都要經過這個函數。

如果返回值為None,則運行其他的下載中間件,直到有下載處理器可以執行這個requests請求。

如果返回一個response對象,scrapy就不會再喚醒其他的process_request()方法或者process_exception()方法,或者其他的能返回response對象的下載函數,這個response對象將在process_response()函數中被處理。

如果返回一個request對象,scrapy將停止運行process_requests()函數,調度器將重新調度新加入的request對象。

如果引發IgnoreRequest異常,則將調用已安裝的下載器中間件的process_exception()方法。 如果它們都不處理異常,則調用請求(Request.errback)的errback函數。 如果沒有代碼處理引發的異常,它將被忽略,並且不會被記錄(不像其他異常)。

 

Parameters:
  • request (Request object) – the request being processed
  • spider (Spider object) – the spider for which this request is intended

關於request和spider對象,在上一篇文章中都有詳細的介紹。

7.2.2 process_response(requestresponsespider)

process_response() 返回一個 Response 對象,一個 Request 對象 ,或者升起一個IgnoreRequest異常。

如果它返回一個響應(可能是相同的響應,或者是一個全新的響應),那么響應將繼續用中間件鏈(開頭就提到了,中間件不止一個)中下一個中間件的process_response()來處理。

如果它返回一個Request對象,則中間件鏈將暫停,並且返回的請求將被調度器重新調度以備將來下載。 這與從process_request()返回請求的行為是一樣的。

如果引發IgnoreRequest異常,則調用請求(Request.errback)的errback函數。 如果沒有代碼處理引發的異常,它將被忽略,並且不會被記錄(不像其他異常)。

Parameters:
  • request (is a Request object) – the request that originated the response
  • response (Response object) – the response being processed
  • spider (Spider object) – the spider for which this response is intended

相應的對象都在上一篇文章中都有詳細的介紹。

7.2.3 process_exception(requestexceptionspider):

當下載處理程序或process_request()(來自下載中間件)引發異常(包括IgnoreRequest異常)時,Scrapy調用process_exception()

process_exception()應該返回 None,,一個 Response對象, 或者一個 Request 對象。

如果它返回None,Scrapy將繼續處理這個異常,執行已安裝中間件的任何其他process_exception()方法,直到所有的中間件全部被執行完,默認的異常處理開始。

如果它返回一個Response對象,則啟動已安裝中間件的process_response()方法鏈,Scrapy不會打擾其他任何中間件的process_exception()方法。

如果它返回一個Request對象,則返回的請求將被調度器重新調用以備將來下載。 這會停止執行中間件的process_exception()方法,就像返回響應一樣。

Parameters:
  • request (is a Request object) – the request that generated the exception
  • exception (an Exception object) – the raised exception
  • spider (Spider object) – the spider for which this request is intended

接下來,我們介紹一些scrapy內置的中間件,以便利用他們編寫自己的下載中間件。

7.2.4 CookiesMiddleware:

源文件位於:class scrapy.downloadermiddlewares.cookies.CookiesMiddleware

這個中間件可以處理需要cookies的網站,比如那些使用會話的網站。 它跟蹤由Web服務器發送的cookie,並將其發送給(從蜘蛛)后續請求,就像瀏覽器一樣。

以下設置(在setting.py中設置)可用於配置Cookie中間件:

  • COOKIES_ENABLED
  • COOKIES_DEBUG

通過使用request()函數中的meta參數,可以保持每個蜘蛛的多個cookie會話。 默認情況下,它使用一個cookie jar(session),但是你可以傳遞一個標識符來使用不同的標識符。

例如:

for i, url in enumerate(urls): yield scrapy.Request(url, meta={'cookiejar': i}, callback=self.parse_page)

 

請記住,cookiejar元鍵並不會與request函數綁定。 你需要繼續傳遞下去的請求。 例如:

def parse_page(self, response): # do some processing return scrapy.Request("http://www.example.com/otherpage", meta={'cookiejar': response.meta['cookiejar']}, callback=self.parse_other_page)

COOKIES_ENABLED:

默認值:True

是否啟用Cookie中間件。 如果禁用,則不會將cookie發送到Web服務器。

COOKIES_DEBUG:

默認:False

如果啟用,Scrapy會記錄在請求中發送的所有Cookie(即Cookie頭)以及在響應中收到的所有Cookie(即Set-Cookie頭)。

7.2.5 DefaultHeadersMiddleware

源文件位於:

class scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware

該中間件設置在DEFAULT_REQUEST_HEADERS設置中指定的所有默認請求標頭。

7.2.6 DownloadTimeoutMiddleware

源文件位於:class scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware

設置下載超時,這個中間件在setting.py中設置DOWNLOAD_TIMEOUT的值,或者設置spider屬性download_timeout 的值。

注:

也可以使用download_timeout Request.meta鍵設置每個請求的下載超時時間; 即使在禁用了DownloadTimeoutMiddleware的情況下也是如此。

7.2.7 HttpAuthMiddleware

源文件位於:class scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware

這個中間件使用基本訪問驗證(又稱HTTP驗證)驗證某些蜘蛛生成的所有請求,要啟用某些蜘蛛的HTTP身份驗證,要設置這些蜘蛛的http_user和http_pass屬性。

例如:

from scrapy.spiders import CrawlSpider class SomeIntranetSiteSpider(CrawlSpider): http_user = 'someuser' http_pass = 'somepass' name = 'intranet.example.com' # .. rest of the spider code omitted ...

7.2.8 HttpCacheMiddleware

源文件位於:class scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware

該中間件為所有的HTTP請求和響應提供低級緩存。 它必須與緩存存儲后端以及緩存策略結合使用。

Scrapy附帶三個HTTP緩存存儲后端:

  • Filesystem storage backend (default)
  • DBM storage backend
  • LevelDB storage backend

可以在setting.py中設置HTTPCACHE_STORAGE來更改HTTP緩存存儲后端。 或者你也可以實現你自己的存儲后端(這里就不一一介紹了,具體的內容可以查看官方文檔)。

Scrapy附帶兩個HTTP緩存策略:

  • RFC2616 policy

    此策略提供符合RFC2616的HTTP緩存,即HTTP緩存控制感知,旨在連續運行,以避免下載未修改的數據(以節省帶寬並加速爬網)。

    策略具體如下:

    不存儲嘗試沒有 no-store cache-control 指令的響應/請求

    如果設置了no-cache cache-control指令,即使是最新的響應,也不要從緩存提供響應

    根據max-age cache-control計算生存周期

    根據Expires響應頭中計算生存周期

    使用Last-Modified響應計算生存周期(Firefox使用的啟發式)

    根據age響應頭計算當前age值

    根據Date頭計算當前的age值

    根據Last-Modified響應頭重新驗證陳舊的響應

    基於ETag響應頭重新驗證陳舊的響應

    為每一個沒有Date頭的響應設置Date頭

    在requests中支持max-stale cache-control指令

    這使得蜘蛛可以配置完整的RFC2616緩存策略,但是避免在逐個請求的基礎上進行重新驗證,同時保持與HTTP規范的一致性。

    例:

      添加緩存控制:max-stale = 600請求標頭接受超過其過期時間不超過600秒的響應。

  • Dummy policy (default)

    此政策沒有任何HTTP緩存控制指令的意識。 每個請求及其相應的響應都被緩存。 當再次看到相同的請求時,響應被返回而不從Internet傳送任何東西。

  Dummy策略對於更快速地測試蜘蛛(無需每次都等待下載)以及在Internet連接不可用時嘗試離線蜘蛛非常有用。 我們的目標是能夠像以前一樣“重播”蜘蛛跑。

  為了使用這個政策,需要設置:

    HTTPCACHE_POLICY (位於scrapy.extensions.httpcache.DummyPolicy)

可以在setting.py中設置HTTPCACHE_POLICY更改HTTP緩存策略。 或者你也可以實施你自己的政策。

禁止緩存,可以將requests中的meta的dont_cache 的值設為True來實現。

7.2.9 HttpCompressionMiddleware

源文件位於:class scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware

該中間件允許從網站發送/接收壓縮(gzip,deflate)流量。

如果安裝了brotlipy,該中間件還支持解碼brotli-compressed響應。

使用這個中間件需要在setting.py中設置COMPRESSION_ENABLED Default: True

7.2.10 HttpProxyMiddleware

源文件位於:class scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware

該中間件通過設置Request對象meta中proxy的值來設置HTTP代理以用於請求。

像Python標准庫模塊urllib和urllib2一樣,它遵守以下環境變量:

  • http_proxy
  • https_proxy
  • no_proxy

您還可以將每個請求的meta.proxy設置為像http:// some_proxy_server:port或http:// username:password @ some_proxy_server:port這樣的值。 請記住,該值將優先於http_proxy / https_proxy環境變量,並且也會忽略no_proxy環境變量。

HttpProxyMiddleware設置:

HTTPPROXY_ENABLED = True HTTPPROXY_AUTH_ENCODING = 'latin-1'

在scrapy.settings.default_setting.py中為默認設置,可以在setting.py處做相應的修改,在上篇文章中有詳細的描述。

7.2.11 RedirectMiddleware

源文件位於:class scrapy.downloadermiddlewares.redirect.RedirectMiddleware

這個中間件根據響應狀態來處理請求的重定向。

請求經過的URL(被重定向)可以在redirect_urls Request.meta鍵中找到。

RedirectMiddleware可以通過以下設置進行配置(更多信息請參閱設置文檔,在上篇博文中有詳細的介紹):

  • REDIRECT_ENABLED
  • REDIRECT_MAX_TIMES

如果Request.meta將dont_redirect鍵設置為True,則該中間件將忽略該請求。

如果你想在你的蜘蛛中處理一些重定向狀態碼,你可以在handle_httpstatus_list spider屬性中指定這些。

例如,如果你想讓重定向中間件忽略301和302響應(並將它們傳遞給你的蜘蛛),你可以這樣做:

class MySpider(CrawlSpider): handle_httpstatus_list = [301, 302]

Request.meta的handle_httpstatus_list鍵也可以用來指定在每個請求的基礎上允許哪些響應碼。 如果想處理任何響應碼的請求,可以將meta key handle_httpstatus_all設置為True。

RedirectMiddleware的設置包括:

REDIRECT_ENABLED = True REDIRECT_MAX_TIMES = 20 # uses Firefox default setting REDIRECT_PRIORITY_ADJUST = +2

在scrapy.settings.default_setting.py中為默認設置,可以在setting.py處做相應的修改,在上篇文章中有詳細的描述。

7.2.12 MetaRefreshMiddleware

原文位於:class scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware

該中間件處理基於html標簽meta-refresh的重定向請求。

MetaRefreshMiddleware可以通過以下設置在setting.py中進行配置:

  • METAREFRESH_ENABLED
  • METAREFRESH_MAXDELAY

該中間件遵守在RedirectMiddleware中描述的requests.meta鍵,REDIRECT_MAX_TIMES設置,dont_redirect和redirect_urls。

MetaRefreshMiddleware的設置包括:

METAREFRESH_ENABLED = True METAREFRESH_MAXDELAY = 100

在scrapy.settings.default_setting.py中為默認設置,可以在setting.py處做相應的修改,在上篇文章中有詳細的描述。

7.2.13 RetryMiddleware

源文件位於:class scrapy.downloadermiddlewares.retry.RetryMiddleware

這個中間件用於重試可能由臨時問題(如連接超時或HTTP 500錯誤)導致的失敗請求。

一旦蜘蛛抓取所有常規(非失敗)頁面,抓取過程就收集失敗的頁面,並在最后重新安排。 一旦沒有更多的失敗頁面重試,這個中間件發送一個信號(retry_complete),所以其他擴展可以連接到該信號。

可以通過以下設置配置RetryMiddleware:

  • RETRY_ENABLED
  • RETRY_TIMES
  • RETRY_HTTP_CODES

如果Request.meta將dont_retry鍵設置為True,則該中間件將忽略該請求。

設置包括:

RETRY_ENABLED = True RETRY_TIMES = 2 # initial response + 2 retries = 3 requests RETRY_HTTP_CODES = [500, 502, 503, 504, 408] RETRY_PRIORITY_ADJUST = -1

在scrapy.settings.default_setting.py中為默認設置,可以在setting.py處做相應的修改,在上篇文章中有詳細的描述。

7.2.14 RobotsTxtMiddleware

源文件位於:class scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware

這個中間件使用robots.txt過濾請求。

為確保Scrapy尊重robots.txt,請確保中間件已啟用且ROBOTSTXT_OBEY設置已啟用。

如果Request.meta將dont_obey_robotstxt鍵設置為True,則即使啟用ROBOTSTXT_OBEY,該中間件也會忽略該請求。

7.2.15 DownloaderStats

源文件位於:

class scrapy.downloadermiddlewares.stats.DownloaderStats

存儲所有通過它的請求,響應和異常的統計信息的中間件。

要使用此中間件,您必須啟用DOWNLOADER_STATS設置。

7.2.16 UserAgentMiddleware

源文件位於:class scrapy.downloadermiddlewares.useragent.UserAgentMiddleware

允許蜘蛛覆蓋默認用戶代理的中間件。

為了使蜘蛛覆蓋默認的用戶代理,必須設置其user_agent屬性。

7.2.17 AjaxCrawlMiddleware

源文件位於:class scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware

這個中間件根據meta-fragment html標簽查找“AJAX可抓取”的特殊頁面,詳情請參見https://developers.google.com/webmasters/ajax-crawling/docs/getting-started

注:

Scrapy在沒有這個中間件的情況下可以找到像“http://example.com/!#foo=bar”這樣的URL的“AJAX可抓取”頁面。 但是當URL不包含“!#”時,AjaxCrawlMiddleware是必需的。 這通常是“索引”或“主”網頁的情況。

AjaxCrawlMiddleware 的設置:

AJAXCRAWL_ENABLED = False

在scrapy.settings.default_setting.py中為默認設置,可以在setting.py處做相應的修改,在上篇文章中有詳細的描述。

通常在進行廣泛抓取的時候才會使用到這個中間件。

注:

關於廣泛抓取:

Scrapy的默認設置已針對特定網站進行了優化。這些網站通常由一個單一的Scrapy蜘蛛來處理,雖然這不是必需的或者是必需的(例如,有一些通用的蜘蛛可以處理任何給定的網站)。

除了這種“重點抓取”之外,還有一種常見的抓取方式,覆蓋了大量(可能無限)的域名,並且只受時間或其他任意限制,而不是在域名被抓取到完成時停​​止,當沒有更多的要求執行。這些被稱為“廣泛爬行”,是搜索引擎使用的典型爬蟲。

這些是廣泛爬行中常見的一些常見屬性:

  •   抓取許多域(通常是無界的)而不是一組特定的站點
  •   不一定要抓取域名才能完成,因為這樣做不切實際(或不可能),而是按時間或爬網頁數來限制抓取
  •   在邏輯上更簡單(與具有許多提取規則的非常復雜的蜘蛛相反),因為數據經常在單獨的階段中被后處理
  •   同時抓取許多域,這使得他們可以通過不受任何特定站點約束(每個站點緩慢爬取以尊重禮貌,但許多站點並行抓取)來實現更快的爬網速度,

如上所述,Scrapy默認設置針對重點抓取進行了優化,而不是廣泛抓取。但是,由於其異步架構,Scrapy非常適合執行快速廣泛爬網。官方文檔總結了在使用Scrapy進行廣泛搜索時需要注意的一些事項,以及Scrapy設置的具體建議,以便實現高效的全面爬網。

8. Spider Middleware(蜘蛛中間件)

 蜘蛛中間件是Scrapy蜘蛛處理機制的鈎子框架,您可以插入自定義功能來處理發送給蜘蛛進行處理的response,和從蜘蛛生成的request和item。

使用蜘蛛中間件:

8.1 激活:

在setting.py中設置SPIDER_MIDDLEWARES的屬性為蜘蛛中間件的路徑。

例如:

SPIDER_MIDDLEWARES = { 'myproject.middlewares.CustomSpiderMiddleware': 543, }

SPIDER_MIDDLEWARES設置與Scrapy中定義的SPIDER_MIDDLEWARES_BASE設置(並不意味着被覆蓋)合並,然后按順序排序以獲得最終的啟用中間件排序列表:第一個中間件是靠近引擎的中間件,最后一個是一個靠近蜘蛛。換句話說,每個中間件的process_spider_input()方法將以增加的中間件的順序(100,200,300,...)被調用,並且每個中間件的process_spider_output()方法將按降序調用。

要決定分配給中間件的順序,請參閱SPIDER_MIDDLEWARES_BASE設置,並根據要插入中間件的位置選擇一個值。順序很重要,因為每個中間件都執行不同的操作,而您的中間件可能依賴於之前(或后續)正在使用的中間件。

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, }

如果要禁用內置中間件(在SPIDER_MIDDLEWARES_BASE中定義並且在默認情況下啟用的中間件),則必須在項目SPIDER_MIDDLEWARES設置中定義它,並將None指定為其值。例如,如果您要禁用OffsiteMiddleware:

SPIDER_MIDDLEWARES = { 'myproject.middlewares.CustomSpiderMiddleware': 543, 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None, }

最后,請記住,某些中間件可能需要通過特定的設置啟用。 有關更多信息,請參閱每個中間件文檔。

下面將介紹一些相關的中間件,以便我們編寫自己的中間件。

8.2 編寫自己的蜘蛛中間件:

蜘蛛中間的原函數位於:class scrapy.spidermiddlewares.SpiderMiddleware

每個蜘蛛中間件都至少有以下函數中的一個。

process_spider_input(responsespider)

這個方法被每一個通過蜘蛛中間件進入蜘蛛的response對象喚醒,並對這些響應進行處理。

process_spider_input()的返回值為None或引發一個異常。

如果它返回None,Scrapy將執行所有其他中間件處理這個響應,直到響應被傳遞給蜘蛛進行處理。

如果引發異常,Scrapy其他蜘蛛中間件的process_spider_input()將不會在被喚醒,此時,喚醒request errback。errback的輸出傳遞給process_spider_output(),或者在process_spider_exception()方法中引發異常。

Parameters:
  • response (Response object) – the response being processed
  • spider (Spider object) – the spider for which this response is intended

process_spider_output(responseresultspider):

這個方法被spider處理的結果喚醒,之后處理這些從spider發來的響應。

process_spider_output()必須返回Request,dict或Item的迭代對象。

Parameters:
  • response (Response object) – the response which generated this output from the spider
  • result (an iterable of Request, dict or Item objects) – the result returned by the spider
  • spider (Spider object) – the spider whose result is being processed

process_spider_exception(responseexceptionspider)

這個方法被一個蜘蛛或者一個process_spider_input()的異常喚醒。

process_spider_exception()應該返回None或一個Response,dict或Item的迭代對象。

如果它返回None,Scrapy將繼續處理這個異常,在下面的中間件組件中的process_spider_exception()方法,直到沒有中間件組件被遺留,異常到達引擎(它被記錄和丟棄的地方)。

如果它返回一個可迭代的process_spider_output()管道,並且不會調用其他process_spider_exception()。

Parameters:
  • response (Response object) – the response being processed when the exception was raised
  • exception (Exception object) – the exception raised
  • spider (Spider object) – the spider which raised the exception

process_start_requests(start_requestsspider)

 

這個方法是通過spider的start_request請求來調用的,除了沒有關聯response,並且只返回request(不是item)之外,它和process_spider_output()方法類似。

它接收一個迭代(在start_requests參數中),並且必須返回另一個可迭代的Request對象。

注:

process_start_requests()有什么用?

在spider中間件中實現這個方法時,你應該總是返回一個iterable(跟在input之后),而不是消耗所有的start_requests迭代器,因為它可能非常大(甚至是無界),這可能會導致內存溢出。 Scrapy引擎被設計為在有能力處理它們的時候提取啟動請求,所以當有其他一些停止蜘蛛的條件(比如時間限制或者item / page count)的時候,start_requests迭代器就不會是沒有止盡的了。

Parameters:
  • start_requests (an iterable of Request) – the start requests
  • spider (Spider object) – the spider to whom the start requests belong

8.3 一些內置的蜘蛛中間件:

8.3.1 DepthMiddleware

 源碼位於:class scrapy.spidermiddlewares.depth.DepthMiddleware

DepthMiddleware是一個Scrapy中間件,用於跟蹤站點內部每個請求的深度。 它可以用來限制最大的深度或類似的東西。

DepthMiddleware可以通過以下設置進行配置:

  • DEPTH_LIMIT - The maximum depth that will be allowed to crawl for any site. If zero, no limit will be imposed.
  • DEPTH_STATS - Whether to collect depth stats.
  • DEPTH_PRIORITY - Whether to prioritize the requests based on their depth.

默認設置位於scarpy.setting.default_setting.py,可以在setting.py中修改設置。

DEPTH_LIMIT = 0 DEPTH_STATS = True DEPTH_PRIORITY

8.3.2 HttpErrorMiddleware

源碼位於:class scrapy.spidermiddlewares.httperror.HttpErrorMiddleware

過濾掉不成功的(錯誤的)HTTP響應,這樣蜘蛛就不必處理它們,減小開銷,並使蜘蛛邏輯更加簡潔。

根據HTTP標准,成功的響應是那些狀態碼在200-300范圍內的響應。

如果您仍想處理該范圍之外的響應代碼,則可以使用handle_httpstatus_list spider屬性或HTTPERROR_ALLOWED_CODES(但是這個我在源碼中並沒有找到,可能是和版本有關系)設置來指定蜘蛛能夠處理的響應代碼。

例如,如果你想要你的蜘蛛來處理404響應,你可以這樣做:

class MySpider(CrawlSpider): handle_httpstatus_list = [404]

Request.meta的handle_httpstatus_list關鍵字也可以用來指定在每個請求的基礎上允許哪些響應代碼。 如果您想允許請求的任何響應代碼,您也可以將meta key handle_httpstatus_all設置為True。

但是請記住,除非你真的知道你在做什么,否則處理非200的回答通常是一個壞主意。

狀態碼詳細解析:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

8.3.3 OffsiteMiddleware

源碼位於:

class scrapy.spidermiddlewares.offsite.OffsiteMiddleware

過濾蜘蛛所涉及域之外的URL請求。

這個中間件過濾出每個請求的主機名不在蜘蛛的allowed_domains屬性中。allowed_domains 列表中任何域的所有子域也都是允許的。 例如。 規則www.example.org也將允許bob.www.example.org但不是www2.example.com和example.com。

當你的蜘蛛返回一個不屬於蜘蛛所涉及域名的請求時,這個中間件會記錄一條類似於這個的調試信息:

DEBUG: Filtered offsite request to 'www.othersite.com': <GET http://www.othersite.com/some/page.html>

為了避免在日志中填寫過多的噪音,只會為每個新過濾的域打印這些消息之一。 因此,例如,如果過濾了www.othersite.com的另一個請求,則不會打印日志消息。 但是,如果過濾了someothersite.com的請求,則會打印一條消息(但僅限於過濾的第一個請求)。

如果蜘蛛沒有定義allowed_domains屬性,或者屬性是空的,異地中間件將允許所有的請求。

如果請求具有設置的dont_filter屬性,則即使其域未在允許的域中列出,OffsiteMiddleware也將允許該請求。

8.3.4 RefererMiddleware

源碼位於:class scrapy.spidermiddlewares.referer.RefererMiddleware

根據生成它的Response的URL填充Request Referer頭。

RefererMiddleware設置:

REFERER_ENABLED = True REFERRER_POLICY = 'scrapy.spidermiddlewares.referer.DefaultReferrerPolicy'

默認設置位於scarpy.setting.default_setting.py,可以在setting.py中修改設置。

您還可以使用特殊的“referrer_policy” Request.meta鍵為每個請求設置Referrer策略,其值與REFERRER_POLICY設置相同。

REFERRER_POLICY的可接受值
要么是一個scrapy.spidermiddlewares.referer.ReferrerPolicy子類的路徑 - 一個自定義策略或一個內置的策略(參見下面的類),
或者W3C定義的標准字符串值之一,
或特殊的“scrapy-default”。

class scrapy.spidermiddlewares.referer.DefaultReferrerPolicy

“no-referrer-when-downgrade”的變體,按照no-referrer-when-downgrade策略添加refer頭,但是當父請求是file:// 或者s3:// scheme是,refer請求頭將不會被發送。這個策略可能會導致跨域訪問,如果要保證同源策略,那么應該選用“same-origin”策略。

class scrapy.spidermiddlewares.referer.NoReferrerPolicy

最簡單的策略是“NoReferrerPolicy”,它不引用任何引用信息以及從特定請求客戶端向任何源發出的請求。 refer標題將被完全省略。

class scrapy.spidermiddlewares.referer.NoReferrerWhenDowngradePolicy

使用“no-referrer-when-downgrade”策略發送refer頭部。

class scrapy.spidermiddlewares.referer.SameOriginPolicy

“同源”策略規定,當從特定請求客戶端發出同源請求時,將剝離完整URL作為引用者信息,另一方面,跨境請求將不包含引薦來源信息。 Referer HTTP標頭將不會被發送。

class scrapy.spidermiddlewares.referer.OriginPolicy

“OriginPolicy”策略規定,當從特定的請求客戶端發出同源請求和跨源請求時,只有請求客戶端源的ASCII序列被作為引用者信息發送。

class scrapy.spidermiddlewares.referer.StrictOriginPolicy

"StrictOriginPolicy”策略在發出請求時發送請求客戶端的來源的ASCII序列:

從受TLS保護的環境設置對象到可能可信的URL,以及
從非TLS保護的環境設置對象到任何來源。
另一方面,從受TLS保護的請求客戶端請求非潛在可信的URL將不包含引薦者信息。 Referer HTTP標頭將不會被發送。

class scrapy.spidermiddlewares.referer.OriginWhenCrossOriginPolicy

僅在發生跨域訪問時發送只包含 host 的 Referrer,同域下還是完整的。它與 Origin Only 的區別是多判斷了是否 Cross-origin。需要注意的是協議、域名和端口都一致,才會被瀏覽器認為是同域;

class scrapy.spidermiddlewares.referer.StrictOriginWhenCrossOriginPolicy

“strict-origin-when-cross-origin”策略規定,當從特定的請求客戶端發出同源請求時,剝離用作引用者的完整URL作為引用者信息發送,並且只有 請求客戶端進行跨域請求時的來源:

從受TLS保護的環境設置對象到可能可信的URL,以及
從非TLS保護的環境設置對象到任何來源。
另一方面,來自受TLS保護的客戶端請求不可信的URL將不包含引薦者信息。 Referer HTTP標頭將不會被發送。

class scrapy.spidermiddlewares.referer.UnsafeUrlPolicy

無論是否發生協議降級,無論是本站鏈接還是站外鏈接,統統都發送 Referrer 信息。正如其名,這是最寬松而最不安全的策略;

策略參考鏈接:

https://www.w3.org/TR/referrer-policy

https://imququ.com/post/referrer-policy.html

8.3.5 UrlLengthMiddleware

class scrapy.spidermiddlewares.urllength.UrlLengthMiddleware

過濾URL長度大於URLLENGTH_LIMIT的請求

UrlLengthMiddleware可以通過以下設置進行配置(更多信息請參閱上一篇博文):

URLLENGTH_LIMIT - 允許抓取的網址的最大網址長度。

9. Extensions

擴展框架提供了一種將您自己的自定義功能插入Scrapy的機制。

擴展只是在擴展初始化時在Scrapy啟動時實例化的常規類。

9.1 Extensions設置

擴展程序使用Scrapy setting.py來管理其設置,就像任何其他Scrapy代碼一樣。

擴展名習慣是以自己的名字為前綴設置,以避免與現有的(和將來的)擴展名相沖突。 例如,處理Google Sitemaps的假設性擴展將使用像GOOGLESITEMAP_ENABLED,GOOGLESITEMAP_DEPTH等設置。

9.2 導入並激活拓展功能

實例化:

擴展在啟動時通過實例化擴展類的單個實例來加載和激活。 因此,所有的擴展初始化代碼都必須在類構造函數(__init__方法)中執行。

激活:

在setting.py中添加EXTENSIONS的路徑,例如:

EXTENSIONS = { 'scrapy.extensions.corestats.CoreStats': 500, 'scrapy.extensions.telnet.TelnetConsole': 500, }
EXTENSIONS_BASE是默認的拓展:
{ 'scrapy.extensions.corestats.CoreStats': 0, 'scrapy.extensions.telnet.TelnetConsole': 0, 'scrapy.extensions.memusage.MemoryUsage': 0, 'scrapy.extensions.memdebug.MemoryDebugger': 0, 'scrapy.extensions.closespider.CloseSpider': 0, 'scrapy.extensions.feedexport.FeedExporter': 0, 'scrapy.extensions.logstats.LogStats': 0, 'scrapy.extensions.spiderstate.SpiderState': 0, 'scrapy.extensions.throttle.AutoThrottle': 0, }

不同的拓展通常是不相干的,所有,順序值都為0,如果要添加相互關聯的拓展,則需要更改順序值。

如果要禁用拓展,則在extensions中將相關的拓展的順序值設為:None。

9.3 編寫自己的拓展:

這里我們將實現一個簡單的擴展來說明上一節中描述的概念。 這個擴展將每次記錄一條消息:

  • 一只蜘蛛被打開
  • 一只蜘蛛被關閉
  • 特定數量的項目被刮掉

該extensions將通過MYEXT_ENABLED設置啟用,項目數將通過MYEXT_ITEMCOUNT設置指定。

這里是這種擴展的代碼:

import logging from scrapy import signals from scrapy.exceptions import NotConfigured logger = logging.getLogger(__name__) class SpiderOpenCloseLogging(object): def __init__(self, item_count): self.item_count = item_count self.items_scraped = 0 @classmethod def from_crawler(cls, crawler): # first check if the extension should be enabled and raise
        # NotConfigured otherwise
        if not crawler.settings.getbool('MYEXT_ENABLED'): raise NotConfigured # get the number of items from settings
        item_count = crawler.settings.getint('MYEXT_ITEMCOUNT', 1000) # instantiate the extension object
        ext = cls(item_count) # connect the extension object to signals
        crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened) crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed) crawler.signals.connect(ext.item_scraped, signal=signals.item_scraped) # return the extension object
        return ext def spider_opened(self, spider): logger.info("opened spider %s", spider.name) def spider_closed(self, spider): logger.info("closed spider %s", spider.name) def item_scraped(self, item, spider): self.items_scraped += 1
        if self.items_scraped % self.item_count == 0: logger.info("scraped %d items", self.items_scraped)

9.4 內置的拓展:

9.4.1 Log Stats extension

源碼位於:class scrapy.extensions.logstats.LogStats

記錄抓取的頁面和抓取的items等基本統計信息。

9.4.2 Core Stats extension

源碼位於:class scrapy.extensions.corestats.CoreStats

核心信息收集

 9.4.3 Memory usage extension

源碼位於:class scrapy.extensions.memusage.MemoryUsage

注:這個拓展在windows下是不能工作的。

監控在scrapy使用期間內核的使用情況。

相關的設置有:

MEMUSAGE_ENABLED = True MEMUSAGE_LIMIT_MB = 0 MEMUSAGE_NOTIFY_MAIL = [] MEMUSAGE_WARNING_MB = 0

9.4.4 Memory debugger extension

源碼位於:class scrapy.extensions.memdebug.MemoryDebugger

調試內存使用的擴展。 它收集有關以下信息:

要啟用此擴展,請打開MEMDEBUG_ENABLED設置。 信息將被存儲在stats中。

9.4.5 Close spider extension

源碼位於:class scrapy.extensions.closespider.CloseSpider

當滿足一些條件時自動關閉蜘蛛,對每個條件使用特定的關閉原因。

關閉蜘蛛的條件可以通過以下設置進行配置:

  • CLOSESPIDER_TIMEOUT
  • CLOSESPIDER_ITEMCOUNT
  • CLOSESPIDER_PAGECOUNT
  • CLOSESPIDER_ERRORCOUNT

默認是:

CLOSESPIDER_TIMEOUT = 0 CLOSESPIDER_PAGECOUNT = 0 CLOSESPIDER_ITEMCOUNT = 0 CLOSESPIDER_ERRORCOUNT = 0

9.4.5 StatsMailer extension

源碼位於:class scrapy.extensions.statsmailer.StatsMailer

這個簡單的擴展可以用來發送一個通知電子郵件,每當一個域名已經完成,包括Scrapy統計收集。 電子郵件將發送給STATSMAILER_RCPTS設置中指定的所有收件人。

9.4.6 Debugging extensions

 堆棧跟蹤轉儲擴展Stack trace dump extension

源碼位於:class scrapy.extensions.debug.StackTraceDump

9.4.7 Debugger extension

源碼位於:class scrapy.extensions.debug.Debugger

在收到SIGUSR2信號時,在正在運行的Scrapy進程中調用Python調試器。 調試器退出后,Scrapy進程繼續正常運行。

此擴展只適用於POSIX兼容的平台(即不是Windows)。

 10. 相關API:
在編寫中間件和拓展時通常會用到scrapy提供的API,例如在介紹拓展時,我們所介紹的那個例子,這里,我們將介紹一些scrapy所提供的中間件,以便我們可以自主的編寫中間件或者拓展。
10.1 Crawler API
源文件位於:scrapy.crawler.py

10.1.1 class scrapy.crawler.Crawler(spiderclssettings)

這個類必須實例化scrapy.spiders.Spider子類和scrapy.settings.Settings對象。通過from_crawler類方法傳遞給extension,訪問crawler對象的主要接口。

屬性包括:

self.extensions = ExtensionManager.from_crawler(self) self.settings.freeze() self.crawling = False self.spider = None self.engine = None self.signals = SignalManager(self) self.stats = load_object(self.settings['STATS_CLASS'])(self)

等等。

其中:

settings:

此抓取工具的設置管理器。

這被擴展和中間件用來訪問這個爬蟲的Scrapy設置。

有關Scrapy設置的介紹,請參閱上一篇博文。

有關API,請閱讀下文setting的接口。

signals:

這個爬蟲的信號管理器。

這是由擴展和中間件使用Scrapy功能。

有關信號的介紹,請參閱Signals

有關API,請參閱下文的SignalManager類。

stats:

此抓取工具的統計信息收集器。

這用於擴展和中間件來記錄其行為的統計信息,或訪問由其他擴展收集的統計信息。

有關統計信息收集的介紹,請參閱統計信息收集

有關API,請參閱下文StatsCollector類。

engine:

執行引擎,協調調度程序,下載程序和蜘蛛之間的核心爬行邏輯。

某些擴展可能需要訪問Scrapy引擎,以檢查或修改下載程序和調度程序的行為,盡管這是一種高級用法,並且此API尚不穩定。

spider:

蜘蛛目前正在爬行。 這是構建爬網程序時提供的spider類的一個實例,它是在crawl()方法中給出的參數之后創建的。

crawl(*args**kwargs):

通過使用給定的args和kwargs參數實例化其spider類,啟動爬網程序,同時將執行引擎設置為運動。

返回爬網完成時觸發的延遲。

10.1.2 class scrapy.crawler.CrawlerRunner(settings=None):

這是一個方便的助手類,可以跟蹤,管理和運行已經設置好的Twisted反應堆內的抓取程序。

CrawlerRunner對象必須用一個Settings對象來實例化。

除非編寫手動處理爬網過程的腳本,否則不應該需要該類(因為Scrapy負責相應使用它)。 有關示例,請參閱從腳本運行Scrapy

crawl(crawler_or_spidercls*args**kwargs):

使用提供的參數運行爬網程序。

它會調用給定的Crawler的crawl()方法,同時跟蹤它,以便稍后停止。

如果crawler_or_spidercls不是Crawler實例,則此方法將嘗試使用此參數創建一個使用當前參數的spider類。

返回爬網完成時觸發的延遲。

Parameters:
  • crawler_or_spidercls (Crawler instance, Spider subclass or string) – already created crawler, or a spider class or spider’s name inside the project to create it
  • args (list) – arguments to initialize the spider
  • kwargs (dict) – keyword arguments to initialize the spider

crawlers:

建立一個 從crawl() 啟動的crawlers類,並管理這個類。

create_crawler(crawler_or_spidercls):

返回一個 Crawler 對象

  • 如果crawler_or_spidercls是一個crawler,它將按原樣返回。
  • 如果crawler_or_spidercls是一個Spider子類,則為其構建一個新的Crawler。
  • 如果crawler_or_spidercls是一個字符串,則該函數在Scrapy項目(使用spider loader)中找到具有該名稱的spider,然后為其創建一個Crawler實例。

join():

返回所有爬蟲執行完成后的延遲。

stop():

同時停止所有正在進行的抓取工作。

當它們全部結束時,返回一個延遲

10.1.3 class scrapy.crawler.CrawlerProcess(settings=None):

基於上文提到的scrapy.crawler.CrawlerRunner類,

在一個進程中同時運行多個scrapy爬蟲的類。

這個類擴展了CrawlerRunner,增加了對啟動Twisted reactor和處理關閉信號的支持,比如鍵盤中斷命令Ctrl-C。 它還配置頂級日志記錄。

如果你沒有在應用程序中運行另一個Twisted reactor,這個工具應該比CrawlerRunner更好。

CrawlerProcess對象必須用一個Settings對象實例化。

除非編寫手動處理爬網過程的腳本,否則不應該需要該類(因為Scrapy負責相應使用它)。 有關示例,請參閱從腳本運行Scrapy。

函數基本與CrawlerRunner()類相同,但增加了start(stop_after_crawl=True)函數,、

start(stop_after_crawl=True):

此方法啟動Twisted reactor,將其池大小調整為REACTOR_THREADPOOL_MAXSIZE,並根據DNSCACHE_ENABLED和DNSCACHE_SIZE安裝DNS緩存。

如果stop_after_crawl為True,那么使用join()將在所有爬蟲完成后停止反應堆。

參數:stop_after_crawl(boolean) - 當所有的抓取程序完成時,停止或禁止反應堆。

10.2 Settings API

10.2.1 scrapy.settings.SETTINGS_PRIORITIES

源碼位於:scrapy.setting.__init__,py

默認值為:

SETTINGS_PRIORITIES = { 'default': 0, 'command': 10, 'project': 20, 'spider': 30, 'cmdline': 40, }

設置Scrapy中使用的默認設置優先級的鍵名和優先級的字典。

每個item定義一個設置入口點,給它一個用於識別的代碼名稱和一個整數優先級。優先值越大,在程序執行時優先級越高。

 scrapy.settings.get_settings_priority(priority):

源碼位於:scrapy.__init__py

在SETTINGS_PRIORITIES字典中查找給定的字符串優先級並返回其數字值,或者直接返回給定的數字優先級。

class scrapy.settings.Settings(values=Nonepriority='project'):

源碼位於:scrapy.__init__py

BaseSettings的子類。

此對象存儲Scrapy設置,用於配置內部組件,並可用於任何進一步的自定義。

它是一個直接的子類,支持BaseSettings的所有方法,另外,在實例化之后,實例化對象在scrapy中內置的設置將被填充到這個插件中(extension或middleware)。

class scrapy.settings.BaseSettings(values=Nonepriority='project'):

源碼位於:scrapy.__init__py

這個類的實例像字典一樣,但是存儲了它們的(鍵,值)對的優先級,並且可以被凍結(即被標記為不可變)。

在實例化的時候可以通過attributes設置屬性,如果優先級是字符串的話,那么將在SETTINGS_PRIORITIES中查找優先級名稱。 否則,應該提供一個特定的整數。

創建對象后,可以使用set()方法加載或更新新設置,並且可以使用字典的方括號表示法或實例的get()方法及其值轉換變體來訪問。 當請求存儲的key時,將檢索具有最高優先級的值。

copy()方法:

進行當前設置的深層復制。

此方法返回Settings類的新實例,並使用相同的值和優先級填充。

對新對象的修改不會反映在原始設置上。

copy_to_dict():

復制當前設置並轉換為字典。

這個方法返回一個新的字典,其中填入了與當前設置相同的值和優先級。

對返回的字典的修改不會反映在原始設置上。

此方法可用於在Scrapy shell中打印設置。

freeze():

禁用對當前設置的進一步更改。

調用此方法后,設置的當前狀態將變為不可變。 嘗試通過set()方法及其變體更改值將不可能,並將被警告。

frozencopy():、

copy()返回對象的freeze()方法的別稱(copy后的設置不能被改變)。

get(namedefault=None):

獲取設置值,不影響其原始類型。

Parameters:

  • name (string) – the setting name
  • default (any) – the value to return if no setting is found

getbool(namedefault=False):

獲取一個布爾值的設置值。

1,'1',True'和'True'返回True,0,'0',False,'False'和None返回False。

例如,使用此方法時,通過設置為“0”的環境變量填充的設置將返回False。

Parameters:

  • name (string) – the setting name
  • default (any) – the value to return if no setting is found

getdict(namedefault=None):

獲取設置值作為字典。 如果設置原始類型是一個字典,它的副本將被返回。 如果它是一個字符串,它將被評估為一個JSON字典。 如果它是一個BaseSettings實例本身,它將被轉換為一個字典,包含它所有的當前設置值,就像get()所返回的那樣,但是會丟失關於優先級和可變性的所有信息。

Parameters:

  • name (string) – the setting name
  • default (any) – the value to return if no setting is found

getfloat(namedefault=0.0):

獲取setting的值,以float的形式表示。

Parameters:
  • name (string) – the setting name
  • default (any) – the value to return if no setting is found

getint(namedefault=0):

以一個整數的形式獲取setting的值。

Parameters:
  • name (string) – the setting name
  • default (any) – the value to return if no setting is found

getlist(namedefault=None):

獲取設置值作為列表。 如果設置原始類型是一個列表,它的副本將被返回。 如果它是一個字符串,它將被“,”拆分。

例如,使用此方法時,通過設置為“one,two”的環境變量填充的設置將返回列表['one','two']。

Parameters:

  • name (string) – the setting name
  • default (any) – the value to return if no setting is found

getpriority(name):

返回name的當前數字優先級值,如果給定name不存在,則返回None。

Parameters:name (string) – the setting name

getwithbase(name):

獲取類似字典的設置和_BASE對應的組合。

Parameters: name (string) – name of the dictionary-like setting

 

maxpriority():

返回所有設置中出現的最高優先級的數值,如果沒有存儲設置,則返回來自SETTINGS_PRIORITIES的默認數值。

set(namevaluepriority='project'):

存儲具有給定優先級的鍵/值屬性。

在配置Crawler對象之前(通過configure()方法)調用set()填充設置,否則它們不會有任何影響。

Parameters:
  • name (string) – the setting name
  • value (any) – the value to associate with the setting
  • priority (string or int) – the priority of the setting. Should be a key ofSETTINGS_PRIORITIES or an integer

 

 

 

setmodule(modulepriority='project'):

以一個模塊的方式存儲設置。

這是一個幫助函數,它為每個具有優先級的設置的模塊聲明一個大寫的全局變量,供set()f方法調用。

Parameters:
  • module (module object or string) – the module or the path of the module
  • priority (string or int) – the priority of the settings. Should be a key of SETTINGS_PRIORITIES or an integer

update(valuespriority='project'):

存儲具有給定優先級的鍵/值對。

這是一個幫助函數,它為每個具有提供的優先級的值項調用set()。

如果values是一個字符串,則假定它是JSON編碼的,並且先用json.loads()解析成字典。 如果它是一個BaseSettings實例,則將使用每個按鍵優先級並忽略優先級參數。 這允許用單個命令插入/更新具有不同優先級的設置。

Parameters:
  • values (dict or string or BaseSettings) – the settings names and values
  • priority (string or int) – the priority of the settings. Should be a key of SETTINGS_PRIORITIES or an integer

10.3 SpiderLoader API

 class scrapy.loader.SpiderLoader

 源碼位於:scrapy.loader.__init__.py

這個類負責檢索和處理整個項目中定義的蜘蛛類。

可以通過在SPIDER_LOADER_CLASS項目設置中指定它們的路徑來使用自定義蜘蛛加載器。 他們必須完全實現scrapy.interfaces.ISpiderLoader接口來保證無誤的執行。

from_settings(settings):

Scrapy使用這個類方法來創建類的一個實例。 這個方法由當前的項目的設置調用,它將SPIDER_MODULES設置的蜘蛛遞歸的調用。

Parameters:settings (Settings instance) – project settings

 

load(spider_name):

獲取給定名稱的蜘蛛類。 它會查看加載的名為spider_name的蜘蛛類的蜘蛛,如果找不到,將引發一個KeyError。

Parameters:spider_name (str) – spider class name

list():

獲取項目中可用蜘蛛的名稱。

find_by_request(request):

列出可以處理給定請求的蜘蛛的名字。 將嘗試匹配請求的網址與蜘蛛的域名。

Parameters:request (Request instance) – queried request

 

10.4 Signals API

Scrapy廣泛使用信號來通知特定事件發生的時間。 您可以捕捉Scrapy項目中的一些信號(例如,使用擴展)來執行其他任務或擴展。

class scrapy.signalmanager.SignalManager(sender=_Anonymous)

connect(receiversignal**kwargs):

將接收器功能連接到信號。

該信號可以是任何對象,Scrapy帶有一些預定義的信號,記錄在signals

Parameters:

  • receiver (callable) – the function to be connected
  • signal (object) – the signal to connect to

disconnect(receiversignal**kwargs):

從信號中斷開接收器功能。 這與connect()方法有相反的作用,參數是相同的。

disconnect_all(signal**kwargs):

斷開所以的接收器

Parameters: signal (object) – the signal to disconnect from

 

send_catch_log(signal**kwargs):

發送一個信號,捕捉異常並記錄下來。

關鍵字參數傳遞給信號處理程序(通過connect()方法連接)。

send_catch_log_deferred(signal**kwargs):

像send_catch_log(),但支持從信號處理程序返回延遲。

返回所有信號處理程序延遲后被觸發的延遲。 發送一個信號,捕捉異常並記錄下來。

關鍵字參數傳遞給信號處理程序(通過connect()方法連接)。

10.5 Stats Collector API

 scrapy.statscollectors模塊下有幾個Stats Collector,它們都實現StatsCollector類定義的Stats Collector API(它們都是繼承的)。

class scrapy.statscollectors.StatsCollector:

get_value(key,default = None)
返回給定統計鍵的值,如果不存在,則返回默認值。

get_stats()
從當前正在運行的蜘蛛獲取所有統計作為字典。

set_value(key,value)
為給定的統計信息鍵設置給定的值。

set_stats(stats
用stats參數中傳遞的字典覆蓋當前的統計信息。

inc_value(key,count = 1,start = 0)
假定給定的起始值(未設置時),按給定的計數遞增給定統計密鑰的值。

max_value(key,value)
只有在同一個鍵的當前值小於值的情況下,才能為給定鍵設置給定值。如果給定鍵沒有當前值,則始終設置該值。

min_value(key,value)
只有當同一個鍵的當前值大於值時,才為給定的鍵設定給定的值。如果給定鍵沒有當前值,則始終設置該值。

clear_stats()
清除所有統計信息。

以下方法不是統計信息收集API的一部分,而是在實現自定義統計信息收集器時使用:

open_spider(spider)
打開給定的蜘蛛的統計收集。

close_spider(spider)
關閉給定的蜘蛛。在此之后,不能訪問或收集更具體的統計數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM