如何监控Scrapy蜘蛛的健康状况

时间:2019-08-12 10:57:22

标签: python web-scraping scrapy web-crawler monitoring

我有一个Scrapy项目,可以解析大约30多个列表站点,并且我试图找到一种方法来解决如果更新任何站点的底层Web结构时如何维护和监视刮板的一致性。

我已经尝试了两种方法来实现这一目标:

  1. 我有一套规则DropItem,如果不存在一些核心字段(产品标题,价格以及其他始终存在的其他几个字段)。这有所帮助,但是假设如果这3/4个字段都可以,那么结构的其余部分也可以。对于上下文,我无法使所有其他必填字段成为必需字段(例如coloursize等)

  2. 我通过在每个本地蜘蛛的一组本地保存的HTML正文上运行抓取工具来发挥最大的作用。这对整体代码质量有好处,但不能解决确定蜘蛛可能由于DOM更改而损坏的问题。

我想按照以下方式做一些事情;

  • 可能计算每次爬网填充字段的频率的平均值。如果平均有size次出现30%,则返回90%1%的作业可能会发出警报。但是,我可以想到许多情况,这可能会触发许多错误的肯定结果,甚至不会触发某件事并且仍然被破坏
  • 另一个想法是,我曾经拥有一种以某种方式监视HTML结构的服务,该服务可以在抓取作业之前运行,如果检测到更改,则暂停。在我看来,这似乎是最灵活的选择,但我不知道如何实现。

TL; DR

如何监视HTML页面结构的更改,从而避免运行会导致数据损坏的Scrapy作业?

还有哪些其他选项可以检测刮削作业是否已损坏,启发式或其他方式? DropItem已被尽可能使用。

4 个答案:

答案 0 :(得分:2)

我亲自用Prometheus监视我的蜘蛛群。 Prometheus是用于从Web服务收集指标的数字数据的监视解决方案。即您的服务必须在HTTP端点上公开指标,然后Prometheus将从那里收集指标。

这对于开箱即用的Scrapy无效,因为会在一段时间后完成可抓取的蜘蛛。对我来说,它奏效了,因为我为自己开发了a Python project that schedules scrapy spiders。但是,其他方法也是可能的:

  • 如果您的蜘蛛运行了几分钟,Prometheus仍然建议直接在流程中公开指标,该指标将在一段时间后停止(并每分钟用Prometheus提取一次)
  • Prometheus也有一个所谓的 Push Gateway 。您的蜘蛛可以将其指标发送到此Push Gateway,Prometheus将从那里收集它。警告:据我所知,Push Gateway上的指标永远不会过期,即您需要一些概念来检查数据的新鲜度或确保数据的新鲜度无关紧要(例如,通过使用始终增加的计数器,这很常见)在Prometheus用例中)

在大多数情况下,我建议使用 Push Gateway 方法,因为它可以与标准的scrapy spider一起使用,而无需付出更多努力。

我个人将这两个指标传递给普罗米修斯:

  1. 蜘蛛计划的次数
  2. 成功产生的物品数量。

我目前无法使用Prometheus监视蜘蛛内部发生的事情,因为我在进程外运行了蜘蛛,但是可以在现有的Python进程内部运行scrapy(使用Push Gateway方法,您将直接从蜘蛛程序,因此您可以从抓取程序中访问所有数据。

屏幕截图

这是我的活动监视器的屏幕截图。 “每日项目数”图表中的每一行都是一只蜘蛛,而我当前的触发器是“低于1”。即如果蜘蛛完全失败,我会收到一封电子邮件。由于某些蜘蛛可能有几天没有数据,因此我有另一个触发器“每周项目数”。

如果您有更详细的数据,当然可以使用更完善的过滤器。

Scrapy Monitoring with Prometheus

答案 1 :(得分:1)

选中Spidermon

  

Spidermon是Scrapy蜘蛛的扩展。套餐提供   用于数据验证,统计信息监视和通知的有用工具   消息。这样,您将监视任务留给了Spidermon,   检查报告/通知。

答案 2 :(得分:1)

我编写了一个测试框架,用于测试爬虫与称为scrapy-test的实时数据和缓存数据。该框架专注于测试解析和爬网范围。

您可以定义字段的测试:

foreach ( Counter c in counters) 
{
    Console.WriteLine("Name is: {0} Value is: {1}", Name, Value);
}

以及统计信息:

from scrapytest.tests import Match, Equal, Type, MoreThan, Map, Len, Required
from myspider.items import PostItem

class TestPost(ItemSpec):
    # defining item that is being covered
    item_cls = PostItem

    # defining field tests
    title_test = Match('.{5,}')
    points_test = Type(int), MoreThan(0)
    author_test = Type(str), Match('.{3}')

    # every item should have title - 100% 
    title_cov = 100

因此,class TestStats(StatsSpec): # stat pattern: test functions validate = { 'log_count/ERROR$': LessThan(1), 'item_scraped_count': MoreThan(1), 'finish_reason': Match('finished'), } 的一般工作流程是每天/每半小时运行一次测试,以维持蜘蛛健康。

答案 3 :(得分:1)

比方说,大小是输出csv中的第三个字段,您可以使用以下代码查看最后10个字段中有多少个丢失:

  

tail output.csv |切-f3 -d,| grep -v [0-9] | wc -l <​​/ p>

然后,您可以在图表上找到可视化的内容或在满足条件时发出警报。 I think this project looks interesting