【问题标题】:Custom Signals Scrapy自定义信号 Scrapy
【发布时间】:2014-09-29 22:48:03
【问题描述】:

如何在 scrapy 中实现自定义信号?我的项目实施了评分系统。根据项目的分数,它要么被接受,要么被拒绝。我希望能够向 ITEM_ACCEPTED 和 ITEM_REJECTED 发出信号以收集有关抓取的统计信息。

我正在查看源代码,https://github.com/scrapy/scrapy/blob/master/scrapy/signals.py - 但我不清楚这里发生了什么。

任何有关如何发送此信号的说明也会有所帮助。

感谢任何建议!

编辑: 我在scrapy docs上找到了这个:

http://doc.scrapy.org/en/latest/topics/api.html#module-scrapy.signalmanager

我的一只蜘蛛:

from Scrapers.extensions import signals #my custom signals

def parse(self, response):
    manager = SignalManager(self)
    manager.send_catch_log(signals.ITEM_ACCEPTED)
    manager.send_catch_log(signals.ITEM_REJECTED)

我的扩展:

from Scrapers.extensions import signals as custom

@classmethod
def from_crawler(cls, crawler):
    o = cls(crawler.stats)
    crawler.signals.connect(o.spider_closed, signal=signals.spider_closed)
    crawler.signals.connect(o.spider_error, signal=signals.spider_error)
    crawler.signals.connect(o.item_scraped, signal=signals.item_scraped)
    crawler.signals.connect(o.item_accepted, signal=custom.ITEM_ACCEPTED)
    crawler.signals.connect(o.item_rejected, signal=custom.ITEM_REJECTED)
    return o

def item_accepted(self):
    print "it worked -- accepted"

def item_rejected(self):
    print "it worked -- rejected"

信号

ITEM_ACCEPTED = object()
ITEM_REJECTED = object()

【问题讨论】:

  • @rockheartsm4l 你能解决这个问题吗?

标签: python python-2.7 signals scrapy


【解决方案1】:

您正在实例化一个新的信号管理器,而不是使用 Crawler 的,因此替换此行:

manager = SignalManager(self)

您可以使用它来获取实际的信号管理器:

manager = self.crawler.signals

成功了for me

【讨论】:

  • 一年前我需要这个的时候你在哪里?!?!感谢您的回答:D
  • :我回答是为了知识,你还在用 Scrapy 工作吗?
  • 去年夏天我在实习时使用了scrapy,实际上我昨天刚刚在同一家公司开始了全职工作!所以这些信息可能很快就会再次与我相关!
【解决方案2】:

好吧,scrapy 带有一个 API,可让您访问各种统计信息:http://doc.scrapy.org/en/latest/topics/stats.html

类 scrapy.statscol.StatsCollector

get_stats()

从当前运行的蜘蛛中获取所有统计信息作为字典。

编辑: 要接受或拒绝项目,只需使用验证管道,然后使用 DropItem:http://doc.scrapy.org/en/latest/topics/exceptions.html#dropitem

【讨论】:

  • 是的,我已经在使用这些功能了。我的问题是我不想基于 item_scraped 或 item_dropped。无论他们被接受还是拒绝,我都会保留该项目。唯一的区别是它们被坚持到哪里。所以,scrapy 的信号并不适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 2017-02-24
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多