1

我想访问该变量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通过 using访问,但该函数正在做其他事情,我希望通过inyield item访问连接并能够随意从我的蜘蛛调用类的实例!谢谢你。self.cursorcheckUrlExist

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

我建议您在 Spider 类中创建一个连接,就像我any_variable在示例中声明的那样,可以在您的 Spider 中使用self.any_variable和在您的管道中访问它,它可以通过以下方式访问spider.any_variable

于 2017-12-03T10:53:39.877 回答
1

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

在scrapy shell中进行一些挖掘,您应该能够找到当前爬网中使用的任何对象的实例,例如。

  1. 蜘蛛中间件crawler.engine.scraper.spidermw.middlewares
  2. 下载器中间件crawler.engine.downloader.middleware.middlewares
  3. 项目管道crawler.engine.scraper.itemproc.middlewares(这样想。这只是基于对scrapy shell的初步探索)

请注意,我并不是主张应该这样做以从蜘蛛访问数据库连接对象。只是可以通过爬虫对象访问任何 Scrapy 对象实例,该对象是根据标题对 OP 问题的答案。

于 2020-03-16T12:21:27.573 回答