问题描述
我在数据库中有一个条目列表,每个条目对应于一些抓取任务。只完成一次,我是否希望蜘蛛继续到下一个。这是一些伪代码,给出了我想做什么的想法,尽管它并不是我想要的,因为它使用while循环创建了大量待处理的条目积压。
def start_requests(self):
while True:
rec = GetDocumentAndMarkAsProcessing()
if rec == None:
break;
script = getScript(rec)
yield SplashRequest(...,callback=self.parse,endpoint="execute",args={
'lua_source': script
}
)
def parse(self,response):
... store results in database ...
仅当下一个条目收到前一个条目的上一个SplashRequest的响应时,如何才能使下一个条目变得抓斗?
我不确定简单的回调函数是否足以解决问题,或者我是否需要更复杂的东西。
解决方法
我需要做的就是在parse函数中显式调用另一个yield的请求,并将parse作为回调本身。所以最后我有这样的东西:
def start_requests(self):
rec = GetDocumentAndMarkAsProcessing()
script = getScript(rec)
yield SplashRequest(...,callback=self.parse,endpoint="execute",args={
'lua_source': script
}
)
def parse(self,response):
... store results in database ...
rec = GetDocumentAndMarkAsProcessing()
script = getScript(rec)
yield SplashRequest(...,args={
'lua_source': script
}
)
,
我相信您可以通过将settings.py中的CONCURRENT_REQUESTS设置为1来实现。这样就可以使抓取工具一次只发送一个请求,尽管我承认我不确定第二个请求的计时如何工作-是在回调完成执行时还是在检索响应时发送。 >