在scrapy中,对crawler.engine.crawl()的调用是否绕过节流机制?

在scrapy中,对crawler.engine.crawl()的调用是否绕过节流机制?,scrapy,Scrapy,为了提供一些背景知识,我正在编写一个spider,它在RabbitMQ主题上侦听spider的新URL。当它从队列中提取URL时,会通过调用crawler.engine.crawlrequest将其添加到爬网队列中。我注意到,如果我为同一个域将200个URL放到队列中,我有时会超时,但是如果我通过start_url属性添加200个URL,则不会发生这种情况 所以我想知道,当通过crawler.engine.crawl添加URL时,每个域的并发请求、延迟等的正常限制机制是否适用 下面是一个小代码示

为了提供一些背景知识,我正在编写一个spider,它在RabbitMQ主题上侦听spider的新URL。当它从队列中提取URL时,会通过调用crawler.engine.crawlrequest将其添加到爬网队列中。我注意到,如果我为同一个域将200个URL放到队列中,我有时会超时,但是如果我通过start_url属性添加200个URL,则不会发生这种情况

所以我想知道,当通过crawler.engine.crawl添加URL时,每个域的并发请求、延迟等的正常限制机制是否适用

下面是一个小代码示例:

    @defer.inlineCallbacks
    def read(self, queue_object):
        # pull a url from the RabbitMQ topic
        ch,method,properties,body = yield queue_object.get()
        if body:
            req = Request(url=body)
            log.msg('Scheduling ' + body + ' for crawl')
            self.crawler.engine.crawl(req, spider=self)
        yield ch.basic_ack(delivery_tag=method.delivery_tag)
它不会绕过下载程序或下载程序。它们直接绕过SpiderMiddleware进入调度程序


在我看来,你应该使用一个使用进程启动请求来覆盖你的爬行器。启动请求。

谢谢,我实际上没有绕过启动请求。我有一个单独的task.LoopingCall,它基本上轮询兔子队列并调用crawler.engine.crawl