2017-07-17 12 views
2

私はredisリストからURLを取るスパイダーを持っています。クローズするURLがない場合、クローズスパイダー

URLが見つからないときにクモをきれいに閉じたいと思います。私はCloseSpider例外を実装しようとしたが、私がCloseSpider例外も募集が、私はまだ、以下のエラーが取得していたとしても

def start_requests(self): 
    while True: 
     item = json.loads(self.__pop_queue()) 
     if not item: 
      raise CloseSpider("Closing spider because no more urls to crawl") 
     try: 
      yield scrapy.http.Request(item['product_url'], meta={'item': item}) 
     except ValueError: 
      continue 

それがこの点に到達していないようです。また

[email protected]:/scrapper# scrapy crawl general -a country=my -a log=file 
2017-07-17 12:05:13 [scrapy.core.engine] ERROR: Error while obtaining start requests 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/site-packages/scrapy/core/engine.py", line 127, in _next_request 
    request = next(slot.start_requests) 
    File "/scrapper/scrapper/spiders/GeneralSpider.py", line 20, in start_requests 
    item = json.loads(self.__pop_queue()) 
    File "/usr/local/lib/python2.7/json/__init__.py", line 339, in loads 
    return _default_decoder.decode(s) 
    File "/usr/local/lib/python2.7/json/decoder.py", line 364, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
TypeError: expected string or buffer 

を私は同じ関数でTypeErrorを捕まえようとしましたが、うまくいきません。

あなたはjson.loads()にそれを与える(またはそれを呼び出すときTypeErrorをキャプチャ)する前にself.__pop_queue()あれば返す何かをチェックする必要があり、この

おかげ

答えて

4

を処理するために、任意の推奨方法はあり、のようなもの:

def start_requests(self): 
    while True: 
     item = self.__pop_queue() 
     if not item: 
      raise CloseSpider("Closing spider because no more urls to crawl") 
     try: 
      item = json.loads(item) 
      yield scrapy.http.Request(item['product_url'], meta={'item': item}) 
     except (ValueError, TypeError): # just in case the 'item' is not a string or buffer 
      continue 
+0

ニースの方法は、それを行うには、感謝 –

+0

@BLANQUERAdrienは - あなた自身の質問を上昇し、コード/エラーを投稿し、我々は何が起こっているかがわかりますが、これはあります彼のジェネレータ機能を正常に終了させて​​OP問題に合わせて調整しました。 – zwer

+0

@zwerこれは期待どおりに動作しています。私はまだ混乱しています。どの時点で、我々はクモの例外を捕まえることができます。私は、標準とは何かをフレームワークという観点から考えていますか?ありがとう –

1

私は同じ問題を抱えていて、ちょっとしたトリックを見つけました。スパイダーがアイドル(何もしていないとき)にあるときは、まだ赤いキューに何かが残っているかどうかチェックします。そうでない場合は、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

これは有益な仲間です。 Haventはまだ信号を使用していました。ありがとう –

関連する問題