在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 擴展(Extensions)
Benchmarking
命令行工具(Command line tools)
下載器中間件(Downloader Middleware)
信號(Signals)
Telnet 終端(Telnet Console)
初窺 Scrapy
數(shù)據(jù)收集(Stats Collection)
Scrapyd
通用爬蟲(Broad Crawls)
Item Loaders
試驗階段特性
Scrapy 入門教程
自動限速(AutoThrottle)擴展
Settings
Scrapy 終端(Scrapy shell)
下載項目圖片
DjangoItem
調(diào)試(Debugging)Spiders
選擇器(Selectors)
Feed exports
Spiders Contracts
借助 Firefox 來爬取
Logging
Spiders
Ubuntu 軟件包
實踐經(jīng)驗(Common Practices)
安裝指南
Item Exporters
擴展(Extensions)
Items
Spider 中間件(Middleware)
異常(Exceptions)
例子
發(fā)送 email
架構(gòu)概覽
常見問題(FAQ)
Jobs:暫停,恢復(fù)爬蟲
核心 API
使用 Firebug 進行爬取
Item Pipeline
Link Extractors
Web Service
調(diào)試內(nèi)存溢出

擴展(Extensions)

擴展框架提供一個機制,使得你能將自定義功能綁定到 Scrapy。

擴展只是正常的類,它們在 Scrapy 啟動時被實例化、初始化。

擴展設(shè)置(Extension settings)

擴展使用 Scrapy settings 管理它們的設(shè)置,這跟其他 Scrapy 代碼一樣。

通常擴展需要給它們的設(shè)置加上前綴,以避免跟已有(或?qū)?的擴展沖突。 比如,一個擴展處理 Google Sitemaps,則可以使用類似 GOOGLESITEMAP_ENABLED、GOOGLESITEMAP_DEPTH 等設(shè)置。

加載和激活擴展

擴展在擴展類被實例化時加載和激活。 因此,所有擴展的實例化代碼必須在類的構(gòu)造函數(shù)(__init__)中執(zhí)行。

要使得擴展可用,需要把它添加到 Scrapy 的 EXTENSIONS 配置中。在 EXTENSIONS 中,每個擴展都使用一個字符串表示,即擴展類的全 Python 路徑。比如:

EXTENSIONS = {
    'scrapy.contrib.corestats.CoreStats': 500,
    'scrapy.telnet.TelnetConsole': 500,
}

如你所見,EXTENSIONS 配置是一個 dict,key 是擴展類的路徑,value 是順序,它定義擴展加載的順序。擴展順序不像中間件的順序那么重要,而且擴展之間一般沒有關(guān)聯(lián)。擴展加載的順序并不重要,因為它們并不相互依賴。

如果你需要添加擴展而且它依賴別的擴展,你就可以使用該特性了。

這也是為什么 Scrapy 的配置項 EXTENSIONS_BASE(它包括了所有內(nèi)置且開啟的擴展)定義所有擴展的順序都相同(500)。

可用的(Available)、開啟的(enabled)和禁用的(disabled)的擴展

并不是所有可用的擴展都會被開啟。一些擴展經(jīng)常依賴一些特別的配置。 比如,HTTP Cache 擴展是可用的但默認是禁用的,除非 HTTPCACHE_ENABLED 配置項設(shè)置了。

禁用擴展(Disabling an extension)

為了禁用一個默認開啟的擴展(比如,包含在 EXTENSIONS_BASE 中的擴展),需要將其順序(order)設(shè)置為 None。比如:

EXTENSIONS = {
    'scrapy.contrib.corestats.CoreStats': None,
}

實現(xiàn)你的擴展

實現(xiàn)你的擴展很簡單。每個擴展是一個單一的 Python class,它不需要實現(xiàn)任何特殊的方法。

Scrapy 擴展(包括 middlewares 和 pipelines)的主要入口是 from_crawler 類方法,它接收一個 Crawler 類的實例,該實例是控制 Scrapy crawler 的主要對象。如果擴展需要,你可以通過這個對象訪問 settings,signals,stats,控制爬蟲的行為。

通常來說,擴展關(guān)聯(lián)到 signals 并執(zhí)行它們觸發(fā)的任務(wù)。

最后,如果 from_crawler 方法拋出 NotConfigured 異常,擴展會被禁用。否則,擴展會被開啟。

擴展例子(Sample extension)

這里我們將實現(xiàn)一個簡單的擴展來演示上面描述到的概念。 該擴展會在以下事件時記錄一條日志:

  • spider 被打開
  • spider 被關(guān)閉
  • 爬取了特定數(shù)量的條目(items)

該擴展通過 MYEXT_ENABLED 配置項開啟,items 的數(shù)量通過 MYEXT_ITEMCOUNT 配置項設(shè)置。

以下是擴展的代碼:

from scrapy import signals
from scrapy.exceptions import NotConfigured

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):
        spider.log("opened spider %s" % spider.name)

    def spider_closed(self, spider):
        spider.log("closed spider %s" % spider.name)

    def item_scraped(self, item, spider):
        self.items_scraped += 1

        if self.items_scraped % self.item_count == 0:
            spider.log("scraped %d items" % self.items_scraped)

內(nèi)置擴展介紹

通用擴展

記錄統(tǒng)計擴展(Log Stats extension)

class scrapy.contrib.logstats.LogStats

記錄基本的統(tǒng)計信息,比如爬取的頁面和條目(items)。

核心統(tǒng)計擴展(Core Stats extension)

class scrapy.contrib.corestats.CoreStats

如果統(tǒng)計收集器(stats collection)啟用了,該擴展開啟核心統(tǒng)計收集(參考數(shù)據(jù)收集(Stats Collection))。

Telnet console 擴展

class scrapy.telnet.TelnetConsole

提供一個 telnet 控制臺,用于進入當前執(zhí)行的 Scrapy 進程的 Python 解析器,這對代碼調(diào)試非常有幫助。

telnet 控制臺通過 TELNETCONSOLE_ENABLED 配置項開啟,服務(wù)器會監(jiān)聽 TELNETCONSOLE_PORT 指定的端口。

內(nèi)存使用擴展(Memory usage extension)

class scrapy.contrib.memusage.MemoryUsage

注解

This extension does not work in Windows.

監(jiān)控 Scrapy 進程內(nèi)存使用量,并且:

  1. 如果使用內(nèi)存量超過某個指定值,發(fā)送提醒郵件
  2. 如果超過某個指定值,關(guān)閉 spider

當內(nèi)存用量達到 MEMUSAGE_WARNING_MB 指定的值,發(fā)送提醒郵件。當內(nèi)存用量達到 MEMUSAGE_LIMIT_MB 指定的值,發(fā)送提醒郵件,同時關(guān)閉 spider,Scrapy 進程退出。

該擴展通過 MEMUSAGE_ENABLED 配置項開啟,可以使用以下選項:

  • MEMUSAGE_LIMIT_MB
  • MEMUSAGE_WARNING_MB
  • MEMUSAGE_NOTIFY_MAIL
  • MEMUSAGE_REPORT

內(nèi)存調(diào)試擴展(Memory debugger extension)

class scrapy.contrib.memdebug.MemoryDebugger

該擴展用于調(diào)試內(nèi)存使用量,它收集以下信息:

開啟該擴展,需打開 MEMDEBUG_ENABLED 配置項。 信息將會存儲在統(tǒng)計信息(stats)中。

關(guān)閉 spider 擴展

class scrapy.contrib.closespider.CloseSpider

當某些狀況發(fā)生,spider 會自動關(guān)閉。每種情況使用指定的關(guān)閉原因。

關(guān)閉 spider 的情況可以通過下面的設(shè)置項配置:

  • CLOSESPIDER_TIMEOUT
  • CLOSESPIDER_ITEMCOUNT
  • CLOSESPIDER_PAGECOUNT
  • CLOSESPIDER_ERRORCOUNT

CLOSESPIDER_TIMEOUT

默認值: 0

一個整數(shù)值,單位為秒。如果一個 spider 在指定的秒數(shù)后仍在運行, 它將以 closespider_timeout 的原因被自動關(guān)閉。如果值設(shè)置為 0(或者沒有設(shè)置),spiders 不會因為超時而關(guān)閉。

CLOSESPIDER_ITEMCOUNT

缺省值: 0

一個整數(shù)值,指定條目的個數(shù)。如果 spider 爬取條目數(shù)超過了指定的數(shù),并且這些條目通過 item pipeline 傳遞,spider 將會以 closespider_itemcount 的原因被自動關(guān)閉。

CLOSESPIDER_PAGECOUNT

新版功能。

缺省值: 0

一個整數(shù)值,指定最大的抓取響應(yīng)(reponses)數(shù)。 如果 spider 抓取數(shù)超過指定的值,則會以 closespider_pagecount 的原因自動關(guān)閉。 如果設(shè)置為 0(或者未設(shè)置),spiders 不會因為抓取的響應(yīng)數(shù)而關(guān)閉。

CLOSESPIDER_ERRORCOUNT

新版功能。

缺省值: 0

一個整數(shù)值,指定 spider 可以接受的最大錯誤數(shù)。 如果 spider 生成多于該數(shù)目的錯誤,它將以 closespider_errorcount 的原因關(guān)閉。 如果設(shè)置為 0(或者未設(shè)置),spiders 不會因為發(fā)生錯誤過多而關(guān)閉。

StatsMailer extension

class scrapy.contrib.statsmailer.StatsMailer

這個簡單的擴展可用來在一個域名爬取完畢時發(fā)送提醒郵件, 包含 Scrapy 收集的統(tǒng)計信息。 郵件會發(fā)送個通過 STATSMAILER_RCPTS 指定的所有接收人。

Debugging extensions

Stack trace dump extension

class scrapy.contrib.debug.StackTraceDump

當收到 SIGQUITSIGUSR2 信號,spider 進程的信息將會被存儲下來。存儲的信息包括:

  1. engine 狀態(tài)(使用 scrapy.utils.engin.get_engine_status())
  2. 所有存活的引用(live references)(參考使用 trackref 調(diào)試內(nèi)存泄露)
  3. 所有線程的堆棧信息

當堆棧信息和 engine 狀態(tài)存儲后,Scrapy 進程繼續(xù)正常運行。

該擴展只在 POSIX 兼容的平臺上可運行(比如不能在 Windows 運行), 因為 SIGQUIT 和 SIGUSR2 信號在 Windows 上不可用。

至少有兩種方式可以向 Scrapy 發(fā)送 SIGQUIT 信號:

在 Scrapy 進程運行時通過按 Ctrl-(僅 Linux 可行?) 運行該命令(<pid>是 Scrapy 運行的進程):

kill -QUIT <pid>

調(diào)試擴展(Debugger extension)

class scrapy.contrib.debug.Debugger

當收到 SIGUSR2 信號,將會在 Scrapy 進程中調(diào)用 Python debugger。debugger 退出后,Scrapy 進程繼續(xù)正常運行。

更多信息參考 Debugging in Python。

該擴展只在 POSIX 兼容平臺上工作(比如不能再 Windows 上運行)。

上一篇:Logging下一篇:下載項目圖片