以哪种顺序在CrawlSpider中评估规则?

时间:2017-04-14 18:20:46

标签: python web-scraping scrapy

我有一个关于在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='first_callback'
        ),
        Rule(
            LinkExtractor(allow='/product.php?id=\d+'),
            callback='second_callback'
        )
    )

在这种情况下:

  • 引擎会在'http://someurlhere.com'列表中发送start_url请求,并在收到回复时调用默认的parse回调。
  • 然后在parse方法中,从上面的步骤得到的响应中,它将根据我们提供给FIRST LinkExtractor的xpath从该响应中提取链接。

现在我的问题是从FIRST LinkExtractor规则中提取的链接,是否只是在调度程序中安排而不是立即执行?因此,在调度从第一个LinkExtractor中提取的所有链接之后,它将为所有这些链接调用first_callback方法,并将响应传递给first_callback

第二个LinkExtractor何时被召唤?是否会对第一个LinkExtractor进行评估,然后只运行第二个LinkExtractor

1 个答案:

答案 0 :(得分:1)

如果我们通过official documentation。这个过程很简单。

首先,解析您的起始网址,然后通过提供的规则提取每个后续​​抓取的网页链接。

现在回答你的问题。

  

现在我的问题是从FIRST中提取的链接   LinkExtractor规则,它们只是在调度程序中安排而不是   紧接着呢?所以在它安排了所有链接之后   从第一个LinkExtractor中提取然后它将调用   first_callback方法,用于传递响应的所有链接   那个first_callback?

如果回调为None,则默认为True,否则默认为False。这意味着在您的情况下,将没有后续行动。它从起始URL响应中提取的任何链接都是您在调度程序中将拥有的内容,并且在解析所有这些后,您的爬行将结束。

如果你想遵循,请违反规定。找出您的内容在哪里以及资源在哪里。

# Extract links matching 'products' (but not matching 'shampoo')
# and follow links from them (since no callback means follow=True by default).
Rule(LinkExtractor(allow=('products', ), deny=('shampoo', ))),

# Extract links matching 'item' and parse them with the spider's method parse_item
Rule(LinkExtractor(allow=('item', )), callback='parse_item'),

现在回答你的第二个问题:

  

同时第二个LinkExtractor何时被调用?是吗?   第一个LinkExtractor得到评估,然后只有第二个   LinkExtractor运行?

一个不依赖于其他人。 LinkExtractor对象独立应用正则表达式或字符串匹配。如果他们找到匹配的网址,则会继续进行回调或跟进。