scrapy 管道的访问实例 class

Access Instance of scrapy pipeline class

我想访问变量 self.cursor 以使用活动的 postgreSQL 连接,但我不知道如何访问管道的 scrapy 实例 class。

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")

请注意,我知道我可以使用 yield item 访问 process_item,但该函数正在做其他事情,我想通过 self.cursor 中的 [=] 访问连接16=] 并且能够从我的蜘蛛中随意调用 class 的实例! 谢谢。

您可以通过在此处执行 spider.variable_name 来访问所有蜘蛛 class 变量。

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

你的管道在这里

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

我建议你在你的 Spider class 中创建一个连接,就像我在我的示例中声明的 any_variable 一样,这将可以在你的 Spider 中使用 self.any_variable 和你的管道访问, 可以通过 spider.any_variable

访问

我意识到我来晚了一点,但如果有人正在寻找这个问题的正确答案,可以访问任何管道或中间件(或就此而言,下载器等)实例通过控制其他一切的爬虫 object。您可以通过使用 from_crawler 类方法在初始化时设置 .crawler 属性来访问爬虫中的爬虫。

在 scrapy shell 中进行一些挖掘,您应该能够找到当前抓取中使用的任何 object 的实例,例如

  1. 蜘蛛中间件crawler.engine.scraper.spidermw.middlewares
  2. 下载器中间件crawler.engine.downloader.middleware.middlewares
  3. Item pipelinescrawler.engine.scraper.itemproc.middlewares(这么认为。这只是基于对scrapy的初步探索shell)

请注意,我并不是提倡人们应该这样做来从蜘蛛访问数据库连接 object。只是任何 Scrapy object 实例都可以通过爬虫 object 访问,这是根据标题对 OP 问题的回答。