リンク抽出器(extractor)¶
リンク抽出器(link extractor)は、最終的に追跡されるWebページ( scrapy.http.Response
オブジェクト)からリンクを抽出することを唯一の目的とするオブジェクトです。
Scrapyには scrapy.linkextractors.LinkExtractor
がありますが、シンプルなインターフェースを実装することで、ニーズに合わせて独自のカスタム・リンク抽出器を作成できます。
すべてのリンク抽出器が持つ唯一のパブリック・メソッドは extract_links
で、これは Response
オブジェクトを受け取り、 scrapy.link.Link
オブジェクトのリストを返します。リンク抽出器は一度インスタンス化され、それらの extract_links
メソッドが異なるレスポンスで数回呼び出されて、追跡するリンクを抽出します。
リンク抽出器は、(Scrapyに用意されている) CrawlSpider
クラスで一連のルールを介して使用されますが、 CrawlSpider
サブクラスを作成しなくても、スパイダーでも使用できます。
組み込みリンク抽出器リファレンス¶
Scrapyに同梱されているリンク抽出器クラスは、 scrapy.linkextractors
モジュールで提供されます。
デフォルトのリンク抽出器は LinkExtractor
で、これは LxmlLinkExtractor
と同じです:
from scrapy.linkextractors import LinkExtractor
以前のScrapyバージョンには他のリンク抽出器クラスがありましたが、現在は廃止されています。
LxmlLinkExtractor¶
-
class
scrapy.linkextractors.lxmlhtml.
LxmlLinkExtractor
(allow=(), deny=(), allow_domains=(), deny_domains=(), deny_extensions=None, restrict_xpaths=(), restrict_css=(), tags=('a', 'area'), attrs=('href', ), canonicalize=False, unique=True, process_value=None, strip=True)¶ LxmlLinkExtractorは、便利なフィルタリングオプションを備えた、おすすめのリンク抽出器です。lxmlの堅牢なHTMLParserを使用して実装されています。
- パラメータ
allow (a regular expression (or list of)) -- (絶対)URLが抽出されるために一致する必要がある単一の正規表現(または正規表現のリスト)。指定しない場合(または空の場合)は、すべてのリンクに一致します。
deny (a regular expression (or list of)) -- (絶対)URLが除外される(抽出されない)ために一致する必要がある単一の正規表現(または正規表現のリスト)。
allow
パラメータよりも優先されます。指定されていない(または空の)場合、リンクは除外されません。allow_domains (str or list) -- リンクを抽出するために考慮されるドメインを含む単一の値または文字列のリスト
deny_domains (str or list) -- リンクを抽出するために 考慮されない ドメインを含む単一の値または文字列のリスト
deny_extensions (list) -- リンクを抽出するときに無視される拡張子を含む単一の値または文字列のリスト。 指定しない場合、 scrapy.linkextractors パッケージで定義された
IGNORED_EXTENSIONS
リストがデフォルトになります。restrict_xpaths (str or list) -- これは、リンクを抽出するレスポンス内の領域を定義するXPath(またはXPathのリスト)です。指定すると、それらのXPathによって選択されたテキストのみがリンクをスキャンされます。以下の例を参照してください。
restrict_css (str or list) -- リンクを抽出するレスポンス内の領域を定義するCSSセレクター(またはセレクターのリスト)。
restrict_xpaths
と同じ動作をします。restrict_text (a regular expression (or list of)) -- リンクのテキストが抽出されるために一致する必要がある単一の正規表現(または正規表現のリスト)。指定しない場合(または空の場合)は、すべてのリンクに一致します。正規表現のリストが指定されている場合、リンクが少なくとも1つと一致するとリンクが抽出されます。
tags (str or list) -- リンクを抽出するときに考慮するタグまたはタグのリスト。 デフォルトは
('a', 'area')
です。attrs (list) -- 抽出するリンクを探すときに考慮する必要がある属性または属性のリスト(
tags
パラメータで指定されたタグのみ)。デフォルトは('href',)
canonicalize (boolean) -- 抽出された各URLを正規化します(w3lib.url.canonicalize_urlを使用)。 デフォルトは
False
です。canonicalize_urlは重複チェックを目的としていることに注意してください。サーバー側で表示されるURLを変更できるため、正規化されたURLと生のURLを使用したリクエストのレスポンスが異なる場合があります。LinkExtractorを使用してリンクをたどっている場合、デフォルトのcanonicalize=False
のままにしておいた方がより堅牢です。unique (boolean) -- 抽出されたリンクに重複フィルタリングを適用するかどうか。
process_value (callable) --
タグから抽出された各値とスキャンされた属性を受け取り、値を変更して新しい値を返すか、リンクを完全に無視するために
None
を返すことができる関数。 指定しない場合、process_value
のデフォルトはlambda x: x
になります。たとえば、このコードからリンクを抽出するには:
<a href="javascript:goToPage('../other/page.html'); return false">Link text</a>
あなたは
process_value
で次の関数を使用できます:def process_value(value): m = re.search("javascript:goToPage\('(.*?)'", value) if m: return m.group(1)
strip (boolean) -- 抽出された属性から空白を削除するかどうか。HTML5標準によれば、先頭と末尾の空白は、
<a>
や<area>
のhref
属性や他の多くの要素、<img>
や<iframe>
のsrc
属性、などから削除する必要があります。そのためLinkExtractorはデフォルトでスペース文字を削除します。オフにするにはstrip=False
を設定します(たとえば、先頭または末尾の空白を許可する要素または属性からURLを抽出する場合)。