拡張機能¶
拡張フレームワークは、独自のカスタム機能をScrapyに挿入するメカニズムを提供します。
拡張機能は、拡張機能が初期化されるときに、Scrapyの起動時にインスタンス化される単なる通常のクラスです。
拡張機能の設定¶
拡張機能は Scrapy設定 を使用して、他のScrapyコードと同様に設定を管理します。
既存の(および将来の)拡張機能との衝突を避けるために、拡張機能が独自の名前を設定の前に付けるのが慣例です。たとえば、 Google Sitemaps を処理する仮想拡張機能では、 GOOGLESITEMAP_ENABLED
や GOOGLESITEMAP_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.corestats.
CoreStats
¶
統計コレクションが有効になっている場合、コア統計のコレクションを有効にします( 統計をとる 参照)。
Telnetコンソール拡張機能¶
-
class
scrapy.extensions.telnet.
TelnetConsole
¶
現在実行中のScrapyプロセス内のPythonインタープリターに入るためのTelnetコンソールを提供します。これはデバッグに非常に役立ちます。
telnetコンソールは TELNETCONSOLE_ENABLED
設定を有効にする必要があり、サーバーは TELNETCONSOLE_PORT
で指定されたポートでリッスンします。
メモリ使用量の拡張機能¶
-
class
scrapy.extensions.memusage.
MemoryUsage
¶
注釈
この拡張機能はWindowsでは機能しません。
スパイダーを実行するScrapyプロセスが使用するメモリを監視し、そして:
特定の値を超えたときに通知メールを送信します
特定の値を超えたときにスパイダーを閉じます
MEMUSAGE_WARNING_MB
が特定の警告値に達し、かつ、 MEMUSAGE_LIMIT_MB
が最大値に達すると通知メールがトリガーされ、スパイダーが閉じられてScrapyプロセスが終了(terminate)します。
この拡張機能は MEMUSAGE_ENABLED
設定によって有効になり、以下設定で構成(configure)できます:
メモリ・デバッガー拡張機能¶
-
class
scrapy.extensions.memdebug.
MemoryDebugger
¶
メモリ使用量をデバッグするための拡張機能。 以下に関する情報を収集します:
Pythonガベージコレクターによって収集されないオブジェクト
生存しているべきではないオブジェクト。詳細は trackref を使用したメモリ・リークのデバッグ 参照。
この拡張機能を有効にするには、 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 シグナルを受信したときに、実行中のプロセスに関する情報をダンプします。ダンプされる情報は次のとおりです:
エンジンの状態(
scrapy.utils.engine.get_engine_status()
を使用)生存中の参照( trackref を使用したメモリ・リークのデバッグ を参照 )
全てのスレッドのスタックトレース
スタック・トレースとエンジン・ステータスがダンプされた後、Scrapyプロセスは正常に実行を続けます。
SIGQUIT および SIGUSR2 シグナルはWindowsでは利用できないため、この拡張機能はPOSIX準拠のプラットフォーム(つまり、Windowsではない)でのみ機能します。
Scrapyに SIGQUIT シグナルを送信するには、少なくとも2つの方法があります:
Scrapyプロセスの実行中にCtrl-を押す(Linuxのみ?)
以下のコマンドを実行(
<pid>
がScrapyプロセスのプロセスIDであるとして):kill -QUIT <pid>
デバッガー拡張機能¶
-
class
scrapy.extensions.debug.
Debugger
¶
SIGUSR2 シグナルを受信すると、実行中のScrapyプロセス内で Python debugger を呼び出します。 デバッガーが終了した後、Scrapyプロセスは正常に実行を続けます。
詳細は Debugging in Python 参照。
この拡張機能はPOSIX準拠のプラットフォームでのみ機能します(つまり、Windowsでは機能しません)。