Доступ к экземпляру класса scrapy pipe

Я хочу получить доступ к переменной self.cursor, чтобы использовать активное соединение postgreSQL, но я не могу понять, как получить доступ к экземпляру 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, но эта функция выполняет другие действия, и я хочу получить доступ к соединению через self.cursor в checkUrlExist и иметь возможность вызывать экземпляр класса из моих пауков по желанию! Спасибо.


person atb00ker    schedule 03.12.2017    source источник
comment
имя объекта мне неизвестно, класс конвейеров вызывается, когда паук запускается автоматически, я хочу подключить экземпляр к этому экземпляру класса! :)   -  person atb00ker    schedule 04.12.2017
comment
Возможно, вам следует рассмотреть getattr stackoverflow.com/questions/4075190/   -  person RottenCandy    schedule 04.12.2017


Ответы (2)


Вы можете получить доступ ко всем переменным вашего класса паука, выполнив 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

Я предлагаю вам создать соединение в вашем классе Spider так же, как я объявил any_variable в своем примере, которое будет доступно в вашем Spider с помощью self.any_variable, а в ваших пайплайнах оно будет доступно через spider.any_variable

person Umair Ayub    schedule 03.12.2017
comment
У меня есть 60 пауков, в этом случае все они имеют свои собственные подключения к postgreSQL, у меня есть только ограниченная оперативная память, из-за которой это не окажется для меня полезным. - person atb00ker; 04.12.2017

Я понимаю, что немного опоздал на вечеринку, но на случай, если кто-то ищет правильный ответ на этот вопрос, любой экземпляр конвейера или промежуточного программного обеспечения (или, если уж на то пошло, загрузчик и т. д.) может быть доступен через объект сканера, который управляет всем остальным. Вы можете получить доступ к сканеру в пауке, используя метод класса from_crawler для установки атрибута .crawler во время инициализации.

Покопавшись в оболочке scrapy, вы сможете найти экземпляр любого объекта, используемого в текущем обходе, например.

  1. ПО промежуточного слоя Spider crawler.engine.scraper.spidermw.middlewares
  2. ПО промежуточного слоя загрузчика crawler.engine.downloader.middleware.middlewares
  3. Конвейеры предметов crawler.engine.scraper.itemproc.middlewares (думаю, что да. Это просто основано на рудиментарном исследовании в оболочке scrapy)

Обратите внимание, что я не призываю делать это для доступа к объекту подключения к базе данных из паука. Просто к любому экземпляру объекта Scrapy можно получить доступ через объект сканера, который является ответом на вопрос OP в соответствии с заголовком.

person krypto07    schedule 16.03.2020