2017-08-07 9 views
0
  • xxx:リクエストがクロールされましたが、プログラムはまだ実行されていますが、実行中ではなくプログラムを自動的に停止する方法はありますか?scrapy-redisプログラムが自動的に閉じない

  • 実行されているコード:私は、サイトをクロールする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のは、自動的にシャットダウンまだURLを依頼する必要がありますが、持っていません。 URLはありません。常にscraped 0 items (at 0 items/min)
+0

あなたの質問はどういう意味ですか? – Nabin

+0

スタックオーバーフローが発生します。このような質問を述べると、私たちはあなたを助けることができません。 –

+0

私はscrapy-redisを使用してサイトをクロールしますが、scrapy-redisは自動的にシャットダウンしませんが、依然としてurlを要求する必要がありますが、URLはありません。だから、いつも '' '0アイテム(0アイテム/分)で' '' –

答えて

0

scrapy-redisは、常に新しいURLがredisキューにプッシュされるのを待ちます。キューが空の場合、スパイダーはの状態でアイドル状態になり、新しいURLを待ちます。それがキューが空になると、私はスパイダーを閉じたのです。

スパイダーがアイドルである場合(何もしない場合)、赤いキューにまだ何かが残っているかどうかチェックします。そうでなければ、私は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のキューにプッシュする複数のURLのため、常にオープン待ちとされているので、それはしますが、あなたはそれを閉じたい場合は、ここでは、パイプラインでそれを行うことができます:

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 

私はRedisのキュー内のキーの合計を取得することがopen_spiderでどのように動作するかのパイプラインを説明しますとprocess_itemにそれがredis_len変数とするとき、それは最後の項目が近い信号を送るゼロに達するをデクリメント。

+0

を使いました。それを試してみます。 Thk! –

関連する問題