【问题标题】:Access Instance of scrapy pipeline classscrapy管道类的访问实例
【发布时间】:2017-12-03 06:34:03
【问题描述】:

我想访问变量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")

请注意,我意识到我可以使用yield item 访问process_item,但该功能正在做其他事情,我希望通过checkUrlExist 中的self.cursor 访问连接并能够调用实例随意从我的蜘蛛那里上课! 谢谢。

【问题讨论】:

  • objectName.cursor?
  • objectName 我不知道,当蜘蛛自动启动时会调用管道类,我想将一个实例挂钩到该类的实例! :)
  • 也许你应该考虑getattrstackoverflow.com/questions/4075190/…

标签: python-3.x scrapy scrapy-spider scrapy-pipeline


【解决方案1】:

您可以在此处通过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 访问/p>

【讨论】:

  • 我有 60 只蜘蛛,在这种情况下,它们都有自己的 postgreSQL 连接,我只有有限的 RAM,因此这对我没有用处。
【解决方案2】:

我意识到我在这里聚会有点晚了,但如果有人正在寻找这个问题的正确答案,任何管道或中间件(或就此而言,下载器等)实例都可以通过控制其他一切的爬虫对象。可以通过在初始化时使用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 问题的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    相关资源
    最近更新 更多