scrapy如何使用规则?

23 投票
1 回答
13539 浏览
提问于 2025-04-18 17:33

我刚开始使用Scrapy,想了解一下在CrawlSpider中是怎么使用规则的。

比如说,我有一个规则,是在黄页上爬取亚利桑那州图森市的杯子蛋糕商家列表。那么,当我发出一个网址请求时,怎么才能激活这个规则呢?特别是,怎么才能激活restrict_xpath这个属性呢?

谢谢。

1 个回答

27

CrawlSpider 的规则属性用来指定如何从网页中提取链接,以及对这些链接应该调用哪些回调函数。这些操作是通过该类中默认的 parse() 方法来处理的——你可以在这里查看源代码。

所以,每当你想要对一个网址应用规则时,只需要使用 scrapy.Request(url, self.parse) 来发送请求,Scrapy 引擎就会向这个网址发送请求,并对响应应用规则。

链接的提取(可能会使用 restrict_xpaths)是由为该规则注册的 LinkExtractor 对象来完成的。它基本上会在整个页面中搜索所有的 <a><area> 元素,或者如果设置了 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) 来获取网址,然后生成 scrapy.Request(url, <rule_callback>) 对象。

这个示例代码是一个爬虫的框架,它会爬取一个电商网站,跟踪产品类别和子类别的链接,以获取每个产品页面的链接。

对于这个爬虫中特别注册的规则,它会使用 parse() 方法作为回调,爬取“类别”和“子类别”列表中的链接(这会触发爬取规则被调用),同时对匹配正则表达式 product.php?id=\d+ 的链接使用回调 parse_product_page()——最终会抓取产品数据。

如你所见,这些功能非常强大。=)

了解更多:

撰写回答