crawlテンプレートとは?
通常のWebサイトをクロールするためのspiderのテンプレートになります。ルールを定義してリンクを辿っていきます。デフォルトのbasicテンプレートに比べてリンクをたどりやすくなっています。
Basicテンプレートとの違い
Basicテンプレートでも同じようにクロールすることは可能です。ただ、Basicテンプレートと違いクロールするためのルールを記述するだけで自動的にクロールを実現することができるので、細かい挙動の指定は不要になるというメリットがあります。
基本的には例えば、同じページから複数の詳細ページへ遷移するというようなページ遷移が多いスクレイピングの場合はBasicテンプレートよりもcrawlテンプレートの方が優れていると言えるでしょう。
spiderの作成
1 |
scrapy genspider -t crawl spider名 URL(https://なしの) |
生成されたSpider
以下のソースコードがspiderフォルダに生成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class XXXSpider(CrawlSpider): name = "xxx" allowed_domains = ["www.xxx.co.jp"] start_urls = ["https://www.xxx.co.jp/f/dsd-101001037028005-06-"] rules = (Rule(LinkExtractor(allow=r"Items/"), callback="parse_item", follow=True),) def parse_item(self, response): item = {} #item["domain_id"] = response.xpath('//input[@id="sid"]/@value').get() #item["name"] = response.xpath('//div[@id="name"]').get() #item["description"] = response.xpath('//div[@id="description"]').get() return item |
rules属性
basicテンプレートと主に異なっている点になります。tupleで定義されているので後で変更することはできません。Ruleオブジェクトを保持しています。tupleなので以下のように複数のRuleオブジェクトを保持することも可能です。複数指定した場合は上から順番にルールを実行します。
1 2 3 4 |
rules = ( Rule(LinkExtractor(...)), Rule(LinkExtractor(...)) ) |
Ruleオブジェクト
指定したサイトにおいてどのようにリンクを辿っていくかを指定するものです。例えば、一覧画面の中の詳細画面のXPathを指定してあげれば全ての詳細ページのレスポンスを返してくれます。
LinkExtractor(allow=r"Items/")
クロールされた各ぺーじからリンクを抽出する方法を定義します。
リンクを辿るかどうかをallowかdenyで指定します。rは正規表現でこの場合は「Items/」というリンクを辿っていくという指定になります。URLの指定方法は他にもいろいろあります。
allow=r"Items/" | URLを正規表現で指定します。 |
restrict_xpaths=('xpath') | URLをXPathで指定します。 |
restrict_css='cssセレクタ' | URLをCSSセレクタで指定します。 |
callback="parse_item"
コールバックメソッドで、リクエストが返ってきたらレスポンスとして実行します。この場合はparse_itemメソッドを実行します。(なお、注意点としてはメソッドにはparseというメソッド名は利用しないようにしましょう。crawlテンプレート内で暗黙で利用されるメソッド名のためです。)
follow=True
rulesで定義したリンク先のさらにリンク先を辿るかどうか指定するboolean型です。trueならリンクを辿る指定になります。
ページネーションをたどりつつ各詳細ページのレスポンスを取得するサンプル
1 2 3 4 5 6 7 8 9 10 11 |
rules = (Rule(LinkExtractor(restrict_xpaths='一覧画面の詳細リンクのXPath'), callback="parse_item", follow=False), Rule(LinkExtractor(restrict_xpaths='ページネーション次へのリンクのXPath, ) def parse_item(self, response): logging.info(response.url) yield { '詳細情報1': response.xpath('詳細情報1のxpath').get(), '詳細情報2': response.xpath('詳細情報2のxpath').get(), } |
- 一覧画面の1ページ目の詳細画面のリンクを全て読み込む(20件あれば20件全て読み込む)
- 次へボタンリンクをクリック
という処理の流れになります。
この記事へのコメントはありません。