2017-08-07 59 views
0
  • scrapy-redis框架,redis存儲xxx:請求已被抓取完畢,但程序仍在運行,如何自動停止程序,而不是一直在運行?scrapy-redis程序沒有自動關閉

  • 運行代碼:

2017-08-07 09:17:06 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2017-08-07 09:18:06 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

  • 我用scrapy-Redis的抓取網站,scrapy,Redis的不會自動關閉,還是要問的URL,但沒有網址。因此,它總是會scraped 0 items (at 0 items/min)
+0

您的問題甚至意味着什麼? – Nabin

+0

迎合堆棧溢出。如果您陳述這樣的問題,我們無法幫助您。 –

+0

我使用scrapy-redis來抓取網站,scrapy-redis不會自動關閉,還需要詢問url,但是沒有url。所以它總是會'''scraped 0項(0項/分鐘)''' –

回答

0

scrapy-redis會一直等在Redis的隊列中推新網址。當隊列爲空時,蜘蛛進入空閒狀態並等待新的URL。這就是我一旦隊列空了就關閉我的蜘蛛。

當蜘蛛在空閒(當它什麼都不做時),我檢查是否還有東西留在redis隊列中。如果沒有,我用close_spider關閉蜘蛛。以下代碼位於spider類中:

@classmethod 
def from_crawler(cls, crawler, *args, **kwargs): 
    from_crawler = super(SerpSpider, cls).from_crawler 
    spider = from_crawler(crawler, *args, **kwargs) 
    crawler.signals.connect(spider.idle, signal=scrapy.signals.spider_idle) 
    return spider 


def idle(self): 
    if self.q.llen(self.redis_key) <= 0: 
     self.crawler.engine.close_spider(self, reason='finished') 
+0

非常有用的信息。 Thk! –

0

scrapy-redis被製成常開等待更多的網址,在Redis的隊列中推,但如果你想關閉它,你可以用一條管道將做到這一點,在這裏:

class TestPipeline(object): 

def __init__(self, crawler): 
    self.crawler = crawler 
    self.redis_db = None 
    self.redis_len = 0 

@classmethod 
def from_crawler(cls, crawler): 
    return cls(crawler) 

def open_spider(self, spider):   
    self.redis_len = len(spider.server.keys('your_redis_key')) 

def process_item(self, item, spider): 
    self.redis_len -= 1 
    if self.redis_len <= 0: 
     self.crawler.engine.close_spider(spider, 'No more items in redis queue') 

    return item 

我將解釋它在open_spider如何工作的管道得到總鑰匙在Redis的隊列和process_item它遞減redis_len變量,當它達到零中的最後一項發送關閉信號。

+0

有用。我會嘗試它。 Thk! –