2014-10-31 24 views
0

爲了給出一些背景知識,我正在寫一個蜘蛛,在RabbitMQ主題上偵聽新的網址以供蜘蛛使用。當它從隊列中拉出一個URL時,它會通過調用crawler.engine.crawl(request)將它添加到爬行隊列中。我注意到,如果我將200個URL放到隊列中(全部用於同一個域),我有時會超時,但是如果我通過start_urls屬性添加200個URL,則不會發生這種情況。在scrapy中調用crawler.engine.crawl()是否繞過了限制機制?

所以我想知道是否正常的節流機制(每個域的併發請求,延遲等)適用於通過crawler.engine.crawl()添加網址時?

這裏是一個小的代碼示例:

@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) 

回答

0

它不繞過DownloaderMiddlewaresDownloader。他們直接轉到Scheduler,直接繞過SpiderMiddlewares

Source

IMO應使用process_start_requests來覆蓋你的spider.start_requests使用SpiderMiddleware

+0

謝謝,我實際上並沒有繞過start_requests我有一個單獨的task.LoopingCall()基本上輪詢兔子隊列並調用crawler.engine.crawl() – 2014-10-31 15:16:16