2017-04-14 43 views
2

我对CrawlSpider中规则的评估顺序有疑问。如果我有下面的代码:在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' 
     ) 
    ) 

在这种情况下:

  • 发动机将在start_url列表发送一个请求'http://someurlhere.com'和调用默认parse回调时,它得到了响应。
  • 然后在解析方法中,根据从上述步骤得到的响应,它将根据我们提供给FIRST LinkExtractor的xpath从该响应中提取链接。

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

另外当第二个LinkExtractor将被称为?第一个LinkExtractor得到评估,然后只有第二个LinkExtractor运行?

回答

1

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

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

现在来你的问题。

现在我的问题是,从第一 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对象独立应用正则表达式或字符串匹配。如果他们找到了匹配的网址,他们会继续进行回调或跟进。

+0

因此,在获得“http:// someurlhere.com”响应之后,所有与“LinkExtractors”xpaths匹配的链接都将从该响应中提取出来并放入调度程序中。然后,在调度程序将这些提取的链接传递给Downloader后,这些抽取的链接中的每一个的正确回调都会得到响应,并将其传递回引擎并最终传递给蜘蛛继续? – CapturedTree

+1

是的,正确提取的链接将调用解析数据的回调方法,蜘蛛会一直持续到链接耗尽。 – Rahul

+0

另一个快速问题。如果我将第一个'LinkExtractor'后续参数指定为'True',那么当我们取回来自http:// someurlhere.com'的响应时,当它与来自该响应的链接与第一个'LinkExtractor'匹配时会立即跟随到提取的链接是否正确?那么它是如何得到它应该从第二个'LinkExtractor'中提取的链接? – CapturedTree