小编典典

了解CrawlSpider中如何使用规则

scrapy

我是使用Scrapy的新手,我想了解CrawlSpider中如何使用规则。

如果我有一条规则要在列表中进行爬网,那么产生URL请求如何激活该规则-特别是它如何激活strict_xpath属性?


阅读 590

收藏
2020-04-09

共1个答案

小编典典

rules属性CrawlSpider指定如何从页面提取链接以及应为这些链接调用哪些回调。它们由parse()该类中实现的默认方法处理。

因此,每当你要触发URL规则时,只需要产生一个scrapy.Request(url, self.parse),Scrapy引擎就会向该URL发送一个请求并将规则应用于响应。

链接的提取(可能使用或可能不使用restrict_xpaths)是通过为该规则注册的LinkExtractor对象完成的。如果设置了属性,它基本上会搜索整个页面中的所有<a>s<area>s元素,或者仅搜索应用restrict_xpaths表达式后获得的元素。

例:
例如,假设你有一个CrawlSpider,如下所示:

from scrapy.contrib.spiders.crawl import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor

class MySpider(CrawlSpider):
    start_urls = ['http://someurlhere.com']
    rules = (
        Rule(
            LinkExtractor(restrict_xpaths=[
                "//ul[@class='menu-categories']",
                "//ul[@class='menu-subcategories']"]),
            callback='parse'
        ),
        Rule(
            LinkExtractor(allow='/product.php?id=\d+'),
            callback='parse_product_page'
        ),
    )

    def parse_product_page(self, response):
        # yield product item here

引擎开始将请求发送到url中,start_urls并执行默认的回调(parse()CrawlSpider中的方法)以响应它们。

对于每个响应,parse()方法将在其上执行链接提取程序,以从页面获取链接。即,它LinkExtractor.extract_links(response)为每个响应对象调用以获得URL,然后产生scrapy.Request(url, <rule_callback>)对象。

该示例代码是spider的框架,该spider在产品类别和子类别的链接之后爬网电子商务网站,以获取每个产品页面的链接。

对于专门在此spider中注册的规则,它将使用parse()回调方法对“类别”和“子类别”列表内的链接进行爬网(这将触发针对这些页面的抓取规则),以及与product.php?id=\d+带有回调的正则表达式parse_product_page()-最终将抓取产品数据。

2020-04-09