web-dev-qa-db-ja.com

Scrapy-CrawlSpiderとLinkExtractorを理解する

したがって、私は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メソッドを使用して情報を抽出することを理解しています。しかし、最初のルールの目的は正確には何ですか?リンクを「収集」するとだけ言っています。それはどういう意味ですか、そして彼らがそこからデータを抽出していないのであればなぜそれが役立つのですか?

8
ocean800

CrawlSpiderは、たとえば投稿を検索するフォーラムをクロールする場合や、製品ページを検索する場合に分類されたオンラインストアをクロールする場合に非常に役立ちます。

アイデアは、「どういうわけか」、抽出したい製品/アイテム情報に対応するリンクを検索して、各カテゴリに移動する必要があるということです。これらの製品リンクは、その例の2番目のルールで指定されているものです(URLにitem.phpが含まれているものを示しています)。

では、スパイダーはどのようにしてitem.phpを含むリンクを見つけるまでリンクにアクセスし続ける必要がありますか?それが最初のルールです。 category.phpを含むがsubsection.phpを含まないすべてのリンクにアクセスするように指示しています。つまり、これらのリンクから「アイテム」を正確に抽出するわけではありませんが、実際のアイテムを見つけるためのスパイダーのパスを定義します。

そのため、ルール内にcallbackメソッドが含まれていないことがわかります。これは、リンク先の応答が直接続くため、処理するリンク応答を返さないためです。

14
eLRuLL