自定义信号 Scrapy

5 投票
2 回答
2598 浏览
提问于 2025-04-18 16:18

在Scrapy中,如何实现一个自定义信号呢?我的项目里有一个评分系统。根据物品的分数,它要么被接受,要么被拒绝。我想能够发送ITEM_ACCEPTED和ITEM_REJECTED的信号,以便收集爬虫的统计数据。

我查看了源代码,https://github.com/scrapy/scrapy/blob/master/scrapy/signals.py,但我对这里的内容不是很明白。

如果能解释一下如何发送这个信号,那就太好了。

任何建议都非常感谢!

编辑:我在Scrapy文档中找到了这个:

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

好吧,scrapy 提供了一个接口,可以让你获取各种统计信息: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

4

你在创建一个新的信号管理器,而不是使用爬虫自带的那个,所以要把这一行替换掉:

manager = SignalManager(self)

你可以用这个来获取实际的信号管理器:

manager = self.crawler.signals

这个方法对我有效,你也可以试试

撰写回答