Scrapy之“rule”用法2019-03-06

class scrapy.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)

在用crawl创建的crawlerspider中,rule是个很重要的内容。这个模板提供了一个包含变量rules的parse()方法,以方便我们完成链接列表的提取。
其基本结构是:

rules = (
    rule(LinkExtractor(allow =('')),callback = ‘parse_1’),
    rule(LinkExtractor(allow =('')),callback = ‘parse_2’),
)

虫子运动的路线是,从start_urls的地址开始发出Request请求,获得HTML或XML,然后用parce函数解析,取得其中符合LinkExtractor要求的链接,往复循环,直到提取全部链接。callback如果指定了解析方式,则用callback指定的函数解析。
rules是rule对象的列表,虫子将按顺序调用每一个rule,而rule则规定了特定的行为方式。
scrapy文档给了一个例子:

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 = (
        # 提取匹配 'category.php' (但不匹配 'subsection.php') 的链接并跟进链接(没有callback意味着follow默认为True)
        Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),

        # 提取匹配 'item.php' 的链接并使用spider的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

用这个方法,可以方便地实现多级页面的爬取。在上例中,第一个rule提取分类页上的链接并跟进,而第二个rule则提取了详细页的链接,送到parse_item进行解析。在parse_item中,析出了id, name,descripthion内容。

你可能感兴趣的:(Scrapy之“rule”用法2019-03-06)