3

パイプラインをロードするがアイテムを渡さない Scrapy プロジェクトがあります。どんな助けでも大歓迎です。

スパイダーの簡素化されたバージョン:

#imports
class MySpider(CrawlSpider):
  #RULES AND STUFF 

  def parse_item(self, response):
    '''Takes HTML response and turns it into an item ready for database.  I hope.
    '''
    #A LOT OF CODE
    return item

この時点で、アイテムを印刷すると予想される結果が生成され、settings.pyは十分に単純です。

ITEM_PIPELINES = [
  'mySpider.pipelines.MySpiderPipeline',
  'mySpider.pipelines.PipeCleaner',
  'mySpider.pipelines.DBWriter',
]

パイプラインは正しいようです(インポートなし):

class MySpiderPipeline(object):
  def process_item(self, item, spider):
    print 'PIPELINE: got ', item['name']
    return item

class DBWriter(object):
  """Writes each item to a DB.  I hope.
  """
  def __init__(self):
    self.dbpool = adbapi.ConnectionPool('MySQLdb'
                                        , host=settings['HOST']
                                        , port=int(settings['PORT'])
                                        , user=settings['USER']
                                        , passwd=settings['PASS']
                                        , db=settings['BASE']
                                        , cursorclass=MySQLdb.cursors.DictCursor
                                        , charset='utf8'
                                        , use_unicode=True
                                        )
    print('init DBWriter')

  def process_item(self, item, spider):
    print 'DBWriter process_item'
    query = self.dbpool.runInteraction(self._insert, item)
    query.addErrback(self.handle_error)
    return item

  def _insert(self, tx, item):
    print 'DBWriter _insert'
    # A LOT OF UNRELATED CODE HERE
    return item

class PipeCleaner(object):
  def __init__(self):
    print 'Cleaning these pipes.'

  def process_item(self, item, spider):
    print item['name'], ' is cleeeeaaaaannn!!'
    return item

スパイダーを実行すると、起動時に次の出力が得られます。

Cleaning these pipes.
init DBWriter
2012-10-23 15:30:04-0400 [scrapy] DEBUG: Enabled item pipelines: MySpiderPipeline, PipeCleaner, DBWriter

クローラーの開始時に画面に出力するinit句とは異なり、process_item メソッドは何も出力 (または処理) しません。非常に簡単なことを忘れてしまったのです。

4

2 に答える 2

1

「遅刻はしないよりはまし」

#imports
class MySpider(CrawlSpider):
  #RULES AND STUFF 

  def parse_item(self, response):
    '''Takes HTML response and turns it into an item ready for database.  I hope.
    '''
    #A LOT OF CODE
    yield item       <------- yield instead of return

于 2019-02-03T00:15:52.200 に答える
1
2012-10-23 15:30:04-0400 [scrapy] DEBUG: Enabled item pipelines: MySpiderPipeline, PipeCleaner, DBWriter

この行は、パイプラインが初期化中であり、問​​題がないことを示しています。

問題はあなたのクローラークラスです、

class MySpider(CrawlSpider):
  #RULES AND STUFF 

  def parse_item(self, response):
    '''Takes HTML response and turns it into an item ready for database.  I hope.
    '''
    #A LOT OF CODE
    # before returning item , print it 
    return item

MySpiderからアイテムを返す前に、アイテムを印刷する必要があると思います。

于 2012-10-24T06:59:12.363 に答える