scrapy如何使用规则?

时间:2014-08-17 07:48:53

标签: python scrapy response

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

如果我有一条规则,我在亚利桑那州图森市的蛋糕列表的黄页中爬行,那么如何产生一个URL请求激活规则 - 具体来说它是如何激活restrict_xpath属性的?

感谢。

1 个答案:

答案 0 :(得分:14)

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

因此,每当您想要触发URL的规则时,您只需要生成scrapy.Request(url, self.parse),并且Scrapy引擎将向该URL发送请求并将规则应用于响应。

链接的提取(可能使用或不使用restrict_xpaths)由为该规则注册的LinkExtractor对象完成。它基本上搜索整个页面中的所有<a><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

引擎开始向start_urls中的网址发送请求,并执行默认回调(CrawlSpider中的parse()方法)以获取响应。

对于每个响应,parse()方法将在其上执行链接提取器以从页面获取链接。也就是说,它为每个响应对象调用LinkExtractor.extract_links(response)来获取URL,然后生成scrapy.Request(url, <rule_callback>)个对象。

示例代码是蜘蛛的骨架,它按照产品类别和子类别的链接抓取电子商务网站,以获取每个产品页面的链接。

对于在此蜘蛛中专门注册的规则,它会使用parse()方法作为回调对“类别”和“子类别”列表中的链接进行爬网(这将触发为这些调用的爬网规则)页面),以及匹配正则表达式product.php?id=\d+和回调parse_product_page()的链接 - 这将最终刮掉产品数据。

正如你所看到的,非常强大的东西。 =)

了解更多: