如何在scrapy中实现自定义信号?我的项目实现了评分系统。根据项目的分数,该项目被接受还是被拒绝。我希望能够发信号ITEM_ACCEPTED和ITEM_REJECTED来收集有关爬网的统计信息。

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

关于如何发送该信号的任何澄清也将是有帮助的。

任何建议表示赞赏!

编辑:
我在草率的文档上发现了这一点:

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

最佳答案

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

manager = SignalManager(self)

您可以使用它来获取实际的信号管理器:
manager = self.crawler.signals

它工作了for me

关于python - 自定义信号草率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25169897/

10-12 21:48
查看更多