1

アクティブなpostgreSQL接続を利用するために変数にアクセスしたいのですself.cursorが、パイプラインクラスのscrapyのインスタンスにアクセスする方法がわかりません。

class ScrapenewsPipeline(object):

  def open_spider(self, spider):
      self.connection = psycopg2.connect(
        host= os.environ['HOST_NAME'],
        user=os.environ['USERNAME'],
        database=os.environ['DATABASE_NAME'],
        password=os.environ['PASSWORD'])
      self.cursor = self.connection.cursor()
      self.connection.set_session(autocommit=True)


  def close_spider(self, spider):
      self.cursor.close()
      self.connection.close() 


  def process_item(self, item, spider):
      print ("Some Magic Happens Here")


  def checkUrlExist(self, item):
      print("I want to call this function from my spider to access the 
    self.cursor variable")

process_itemを使用してアクセスできることに注意してください。ただし、yield itemその関数は他のことを行っており、in経由self.cursorで接続にアクセスcheckUrlExistし、スパイダーからクラスのインスタンスを自由に呼び出すことができます! ありがとうございました。

4

2 に答える 2

3

ここで実行することで、すべてのスパイダー クラス変数にアクセスできますspider.variable_name

class MySpider(scrapy.Spider):
        name = "myspider"
        any_variable = "any_value"

ここにあなたのパイプライン

class MyPipeline(object):
    def process_item(self, item, spider):
        spider.any_variable

any_variable私の例で宣言したように、Spider クラスで接続を作成することをお勧めします。これは、Spider を使用してアクセスできself.any_variable、パイプラインでは、経由でアクセスできます。spider.any_variable

于 2017-12-03T10:53:39.877 に答える
1

私はここでのパーティーに少し遅れていることを認識していますが、誰かがこの質問に対する正しい答えを探している場合、パイプラインまたはミドルウェア (さらに言えば、ダウンローダーなど) のインスタンスには、クローラー オブジェクトを介してアクセスできます。他のすべてを制御します。初期化時にクラスメソッドを使用して属性from_crawlerを設定することにより、スパイダーでクローラーにアクセスできます。.crawler

スクレイピー シェルを掘り下げると、現在のクロールで使用されているオブジェクトのインスタンスを見つけることができるはずです。

  1. スパイダーミドルウェアcrawler.engine.scraper.spidermw.middlewares
  2. ダウンローダ ミドルウェアcrawler.engine.downloader.middleware.middlewares
  3. アイテム パイプラインcrawler.engine.scraper.itemproc.middlewares(そう考えてください。これは、scrapy シェルでの初歩的な調査に基づいています)

スパイダーからデータベース接続オブジェクトにアクセスするためにこれを行うべきだと主張しているわけではないことに注意してください。タイトルに従ってOPの質問に対する答えであるクローラーオブジェクトを介してScrapyオブジェクトインスタンスにアクセスできるということだけです。

于 2020-03-16T12:21:27.573 に答える