使用已定义的d捕获scrapy spider运行状态

2024-06-16 10:25:24 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我有一个名为task的定制装饰器,它捕获函数的状态。e、 g

@task(task_name='tutorial',
      alert_name='tutorial')
def start():
    raw_data = download_data()
    data = parse(raw_data)
    push_to_db(data)

if if __name__ == "__main__":
    start()

因此,在这里,任务装饰器监视启动功能的状态,如果失败,则使用警报名称将错误消息发送到中央监控系统,否则,如果成功,则发送成功消息

现在我想将这个装饰器添加到scrapy Spider中,以捕获状态。但我不知道该怎么做,因为在使用此命令启动spider时,spider入口点并不未知:

$scrapy crawl tutorial

我在spider py文件中尝试了CrawlerRunner。事情是这样的:

@task(task_name='tutorial',
      alert_name='tutorial')
def start():
    runner = CrawlerRunner()
    runner.crawls(TutorialSpider)

if __name__ == "__main__":
    start()

这有两个问题:

  1. 即使TutorialSpider失败,任务仍然会收到一条成功消息。似乎task只能捕获runner.crawls的状态,这将爬行器错误与装饰器隔离开来
  2. 从我的角度来看,CrawlerRunner并不是专门为这个而设计的。它应该用于同时启动多个spider。我觉得用这种方式有点不对劲

总之,我有两个问题:

  1. 我应该将此任务装饰器放置在何处,以便它捕获刮擦蜘蛛的状态
  2. 在使用scrapy genspider命令生成新的爬行器时,是否有一个中心位置可以默认为所有爬行器添加此装饰器?将来我会有100多只蜘蛛。为每一个添加decorator会很麻烦,也很难维护。理想情况下,我需要做的就是在启动爬行器时提供任务名称警报名称作为参数

非常感谢您花时间阅读此问题并提供帮助


Tags: name名称消息taskdataif状态装饰