したがって、私はCrawlSpiderを使用して、次の Scrapy Docs の例を理解しようとしています。
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class MySpider(CrawlSpider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com']
rules = (
# Extract links matching 'category.php' (but not matching 'subsection.php')
# and follow links from them (since no callback means follow=True by default).
Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),
# Extract links matching 'item.php' and parse them with the spider's method parse_item
Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),
)
def parse_item(self, response):
self.logger.info('Hi, this is an item page! %s', response.url)
item = scrapy.Item()
item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)')
item['name'] = response.xpath('//td[@id="item_name"]/text()').extract()
item['description'] = response.xpath('//td[@id="item_description"]/text()').extract()
return item
次に、その説明を示します。
このスパイダーは、example.comのホームページのクロールを開始し、カテゴリリンクとアイテムリンクを収集し、parse_itemメソッドで後者を解析します。各アイテムの応答について、XPathを使用してHTMLから一部のデータが抽出され、アイテムがそのデータで埋められます。
2番目のルールでは、item.php
からリンクを抽出し、parse_item
メソッドを使用して情報を抽出することを理解しています。しかし、最初のルールの目的は正確には何ですか?リンクを「収集」するとだけ言っています。それはどういう意味ですか、そして彼らがそこからデータを抽出していないのであればなぜそれが役立つのですか?
CrawlSpiderは、たとえば投稿を検索するフォーラムをクロールする場合や、製品ページを検索する場合に分類されたオンラインストアをクロールする場合に非常に役立ちます。
アイデアは、「どういうわけか」、抽出したい製品/アイテム情報に対応するリンクを検索して、各カテゴリに移動する必要があるということです。これらの製品リンクは、その例の2番目のルールで指定されているものです(URLにitem.php
が含まれているものを示しています)。
では、スパイダーはどのようにしてitem.php
を含むリンクを見つけるまでリンクにアクセスし続ける必要がありますか?それが最初のルールです。 category.php
を含むがsubsection.php
を含まないすべてのリンクにアクセスするように指示しています。つまり、これらのリンクから「アイテム」を正確に抽出するわけではありませんが、実際のアイテムを見つけるためのスパイダーのパスを定義します。
そのため、ルール内にcallback
メソッドが含まれていないことがわかります。これは、リンク先の応答が直接続くため、処理するリンク応答を返さないためです。