我有一个关于在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
回调。现在我的问题是从FIRST LinkExtractor
规则中提取的链接,是否只是在调度程序中安排而不是立即执行?因此,在调度从第一个LinkExtractor
中提取的所有链接之后,它将为所有这些链接调用first_callback
方法,并将响应传递给first_callback
?
第二个LinkExtractor
何时被召唤?是否会对第一个LinkExtractor
进行评估,然后只运行第二个LinkExtractor
?
答案 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
对象独立应用正则表达式或字符串匹配。如果他们找到匹配的网址,则会继续进行回调或跟进。