仅当当前任务已收到服务器的响应时,如何才将scrapy Spider赋予新任务

问题描述

我在数据库中有一个条目列表,每个条目对应于一些抓取任务。只完成一次,我是否希望蜘蛛继续到下一个。这是一些伪代码,给出了我想做什么的想法,尽管它并不是我想要的,因为它使用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来实现。这样就可以使抓取工具一次只发送一个请求,尽管我承认我不确定第二个请求的计时如何工作-是在回调完成执行时还是在检索响应时发送。 >