拡張機能

拡張フレームワークは、独自のカスタム機能をScrapyに挿入するメカニズムを提供します。

拡張機能は、拡張機能が初期化されるときに、Scrapyの起動時にインスタンス化される単なる通常のクラスです。

拡張機能の設定

拡張機能は Scrapy設定 を使用して、他のScrapyコードと同様に設定を管理します。

既存の(および将来の)拡張機能との衝突を避けるために、拡張機能が独自の名前を設定の前に付けるのが慣例です。たとえば、 Google Sitemaps を処理する仮想拡張機能では、 GOOGLESITEMAP_ENABLEDGOOGLESITEMAP_DEPTH などの設定を使用します。

拡張機能の読み込みとアクティブ化

拡張機能は、拡張機能クラスの単一インスタンスをインスタンス化することにより、起動時にロードおよびアクティブ化されます。したがって、すべての拡張機能初期化コードはクラス・コンストラクター( __init__ メソッド)で実行する必要があります。

拡張機能を使用可能にするには、Scrapy設定の EXTENSIONS 設定に追加します。 EXTENSIONS では、各拡張機能は文字列(拡張機能のクラス名への完全なPythonパス)で表されます。例えば以下のようにします:

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

ご覧のとおり、 EXTENSIONS 設定はキーが拡張パスであり、その値が拡張機能 読み込み 順序値を定義する辞書です。 EXTENSIONS 設定は、Scrapyで定義された EXTENSIONS_BASE 設定とマージされ(但し、オーバーライドされることはありません)、有効な拡張機能の最終ソート・リストを取得するために順序値でソートされます。

通常、拡張機能は相互に依存しないため、ほとんどの場合、読み込み順序は無関係です。 これが EXTENSIONS_BASE 設定がすべての拡張機能を同じ順序値( 0 )で定義する理由です。ただし、すでに読み込まれているされている他の拡張機能に依存する拡張機能を追加する必要がある場合、この機能を利用できます。

利用可能な、デフォルトで有効およびデフォルトで無効な拡張機能

利用可能なすべての拡張機能が有効になるわけではありません。それらのいくつかは通常、特定の設定に依存しています。たとえば、HTTPキャッシュ拡張機能はデフォルトで使用可能ですが、 HTTPCACHE_ENABLED 設定が設定されていない限り無効になっています。

拡張機能を無効にする

デフォルトで有効になっている拡張機能(つまり、 EXTENSIONS_BASE 設定に含まれている拡張機能)を無効にするには、その順序値を None に設定する必要があります。 例えば以下のようにします:

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

あなた自身の拡張機能を書く

各拡張機能はPythonクラスです。 Scrapy拡張機能の主なエントリ・ポイント(これにはミドルウェアとパイプラインも含まれます)は、 Crawler インスタンスを受け取る from_crawler クラスメソッドです。Crawlerオブジェクトを使用して、設定、信号、統計にアクセスしたり、クロール動作を制御したりできます。

通常、拡張機能は シグナル に接続し、それらによってトリガーされるタスクを実行します。

最後に、 from_crawler メソッドが NotConfigured 例外を発生させた場合、拡張機能は無効になります。 それ以外の場合、拡張機能は有効になります。

拡張機能例

ここでは、前のセクションで説明した概念を説明するために、簡単な拡張機能を実装します。この拡張機能は毎回メッセージを記録します:

  • スパイダーがオープンされます

  • スパイダーがクローズされます

  • 指定の数のアイテムがスクレイプされます

拡張機能は 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)

組み込み拡張機能リファレンス

汎用拡張機能

ログ統計拡張機能

class scrapy.extensions.logstats.LogStats

クロールされたページやスクレイプされたアイテムなどの基本的な統計情報を記録します。

コア統計拡張機能

class scrapy.extensions.corestats.CoreStats

統計コレクションが有効になっている場合、コア統計のコレクションを有効にします( 統計をとる 参照)。

Telnetコンソール拡張機能

class scrapy.extensions.telnet.TelnetConsole

現在実行中のScrapyプロセス内のPythonインタープリターに入るためのTelnetコンソールを提供します。これはデバッグに非常に役立ちます。

telnetコンソールは TELNETCONSOLE_ENABLED 設定を有効にする必要があり、サーバーは TELNETCONSOLE_PORT で指定されたポートでリッスンします。

メモリ使用量の拡張機能

class scrapy.extensions.memusage.MemoryUsage

注釈

この拡張機能はWindowsでは機能しません。

スパイダーを実行するScrapyプロセスが使用するメモリを監視し、そして:

  1. 特定の値を超えたときに通知メールを送信します

  2. 特定の値を超えたときにスパイダーを閉じます

MEMUSAGE_WARNING_MB が特定の警告値に達し、かつ、 MEMUSAGE_LIMIT_MB が最大値に達すると通知メールがトリガーされ、スパイダーが閉じられてScrapyプロセスが終了(terminate)します。

この拡張機能は MEMUSAGE_ENABLED 設定によって有効になり、以下設定で構成(configure)できます:

メモリ・デバッガー拡張機能

class scrapy.extensions.memdebug.MemoryDebugger

メモリ使用量をデバッグするための拡張機能。 以下に関する情報を収集します:

この拡張機能を有効にするには、 MEMDEBUG_ENABLED 設定をオンにします。情報は統計に保存されます。

スパイダー拡張機能を閉じる

class scrapy.extensions.closespider.CloseSpider

各条件に特定の終了理由を使用して、いくつかの条件が満たされたときにスパイダーを自動的に閉じます。

スパイダーを閉じるための条件は、以下の設定で構成(configure)できます:

CLOSESPIDER_TIMEOUT

デフォルト: 0

秒数を指定する整数。 スパイダーがその秒数を超えて開いたままの場合、理由を closespider_timeout として自動的に閉じられます。ゼロ(または設定されていない)の場合、スパイダーはタイムアウトによって閉じられません。

CLOSESPIDER_ITEMCOUNT

デフォルト: 0

アイテムの数を指定する整数。 スパイダーがその量より多くスクレイピングし、それらのアイテムがアイテム・パイプラインによって渡される場合、スパイダーは理由 closespider_itemcount によって閉じられます。現在ダウンローダー・キューにあるリクエスト( CONCURRENT_REQUESTS リクエストまで )は引き続き処理されます。ゼロ(または未設定)の場合、スパイダーは渡されたアイテムの数によって制限され超えた分をクローズさせられる事はありません。

CLOSESPIDER_PAGECOUNT

バージョン 0.11 で追加.

デフォルト: 0

クロールするレスポンスの最大数を指定する整数。 スパイダーがそれ以上クロールした場合、スパイダーは理由 `` closespider_pagecount`` によって閉じられます。ゼロ(または未設定)の場合、クロールされたレスポンスの数に応じてスパイダーが閉じられることはありません。

CLOSESPIDER_ERRORCOUNT

バージョン 0.11 で追加.

デフォルト: 0

スパイダーを閉じる前に受け取るエラーの最大数を指定する整数。 スパイダーがその数を超えるエラーを生成した場合、 closespider_errorcount の理由で閉じられます。ゼロ(または設定されていない)の場合、スパイダーはエラーの数に応じて閉じられることはありせん。

StatsMailer拡張機能

class scrapy.extensions.statsmailer.StatsMailer

この単純な拡張機能を使用して、収集されたScrapy統計など、ドメインがスクレイピングを完了するたびに通知メールを送信できます。 メールは、 STATSMAILER_RCPTS 設定で指定されたすべての受信者に送信されます。

拡張機能のデバッグ

拡張機能のスタックトレースをダンプする

class scrapy.extensions.debug.StackTraceDump

SIGQUIT または SIGUSR2 シグナルを受信したときに、実行中のプロセスに関する情報をダンプします。ダンプされる情報は次のとおりです:

  1. エンジンの状態( scrapy.utils.engine.get_engine_status() を使用)

  2. 生存中の参照( trackref を使用したメモリ・リークのデバッグ を参照 )

  3. 全てのスレッドのスタックトレース

スタック・トレースとエンジン・ステータスがダンプされた後、Scrapyプロセスは正常に実行を続けます。

SIGQUIT および SIGUSR2 シグナルはWindowsでは利用できないため、この拡張機能はPOSIX準拠のプラットフォーム(つまり、Windowsではない)でのみ機能します。

Scrapyに SIGQUIT シグナルを送信するには、少なくとも2つの方法があります:

  1. Scrapyプロセスの実行中にCtrl-を押す(Linuxのみ?)

  2. 以下のコマンドを実行( <pid> がScrapyプロセスのプロセスIDであるとして):

    kill -QUIT <pid>
    

デバッガー拡張機能

class scrapy.extensions.debug.Debugger

SIGUSR2 シグナルを受信すると、実行中のScrapyプロセス内で Python debugger を呼び出します。 デバッガーが終了した後、Scrapyプロセスは正常に実行を続けます。

詳細は Debugging in Python 参照。

この拡張機能はPOSIX準拠のプラットフォームでのみ機能します(つまり、Windowsでは機能しません)。