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内容。