自定义信号Scrapy

时间:2014-08-06 20:47:08

标签: python python-2.7 signals scrapy

如何在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()

2 个答案:

答案 0 :(得分:2)

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

manager = SignalManager(self)

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

manager = self.crawler.signals

它有效for me

答案 1 :(得分:0)

嗯,scrapy带有一个API,可让您访问各种统计数据:http://doc.scrapy.org/en/latest/topics/stats.html

  

class scrapy.statscol.StatsCollector

     

get_stats()

     

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

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