我对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
运行?
因此,在获得“http:// someurlhere.com”响应之后,所有与“LinkExtractors”xpaths匹配的链接都将从该响应中提取出来并放入调度程序中。然后,在调度程序将这些提取的链接传递给Downloader后,这些抽取的链接中的每一个的正确回调都会得到响应,并将其传递回引擎并最终传递给蜘蛛继续? – CapturedTree
是的,正确提取的链接将调用解析数据的回调方法,蜘蛛会一直持续到链接耗尽。 – Rahul
另一个快速问题。如果我将第一个'LinkExtractor'后续参数指定为'True',那么当我们取回来自http:// someurlhere.com'的响应时,当它与来自该响应的链接与第一个'LinkExtractor'匹配时会立即跟随到提取的链接是否正确?那么它是如何得到它应该从第二个'LinkExtractor'中提取的链接? – CapturedTree