【问题标题】:How to monitor health of Scrapy spiders如何监控 Scrapy 蜘蛛的健康状况
【发布时间】:2019-08-12 10:57:22
【问题描述】:

我有一个 Scrapy 项目,可以解析大约 30 多个列表站点,并且我正在尝试找出一种方法,如果更新任何站点的底层 Web 结构,如何维护和监控爬虫的一致性。

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

  1. 我有一套规则DropItem 如果一些核心字段不存在(产品标题、价格和其他一些总是存在的)。这在一定程度上有所帮助,但它假设如果那些 3/4 字段都可以,那么结构的其余部分也可以。对于上下文,我不能将所有其他字段都设为必填字段,因为它们本质上是可选的(即coloursize 等)

  2. 我通过在一组本地保存的 HTML 正文上为每个蜘蛛运行刮板来工作。这有利于整体代码质量,但不能解决确定蜘蛛可能因 DOM 更改而损坏的问题。

有几件事情是我想做的;

  • 可能计算每次爬网填充字段的平均频率。如果size 的时间平均为30%,则返回90%1% 的作业可能会引发警报。但是我可以想到很多情况,这会触发一些误报,甚至不会触发任何事情并且仍然会被破坏
  • 我的另一个想法是有一个以某种方式监控 HTML 结构的服务,它可以在抓取作业之前运行,如果检测到更改则暂停。对我来说,这似乎是最具弹性的选择,但我不知道如何实现这一目标。

TL;DR

如何监控 HTML 页面结构的变化,以避免运行导致数据损坏的 Scrapy 作业?

还有哪些其他选项可以检测抓取作业可能已损坏、启发式或其他方式? DropItem 已尽可能使用。

【问题讨论】:

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


    【解决方案1】:

    查看Spidermon

    Spidermon 是 Scrapy 蜘蛛的扩展。该软件包提供 用于数据验证、统计监控和通知的有用工具 消息。这样你就可以把监控任务留给 Spidermon 检查报告/通知。

    【讨论】:

    • 谢谢,这听起来可以帮助进行抓取后的监控
    【解决方案2】:

    我个人使用Prometheus 监控我的蜘蛛舰队。 Prometheus 是一种从 Web 服务收集指标的数字数据监控解决方案。 IE。您的服务必须在 HTTP 端点上公开指标,Prometheus 将从那里收集它们。

    这不适用于开箱即用的 Scrapy,因为 scrapy 蜘蛛会在一段时间后完成。对我来说它很有效,因为我为自己开发了a Python project that schedules scrapy spiders。不过也可以使用其他方法:

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

    在大多数情况下,我会推荐 Push Gateway 方法,因为它可以与标准的 scrapy 蜘蛛一起使用而无需进一步努力。

    我个人将这两个指标传递给 Prometheus:

    1. 蜘蛛计划的次数
    2. 成功生成的项目数。

    我目前无法使用 Prometheus 监控蜘蛛内部发生的事情,因为我在进程外运行我的蜘蛛,但在现有 Python 进程中运行 scrapy 是可能的(使用推送网关方法,您将直接从蜘蛛进程,所以你可以访问你的scrapy进程中的所有数据)。

    截图

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

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

    【讨论】:

    • 我也强烈推荐 prometheus - 您可以将所有 scrapystats 推送到一个管道中,然后随意使用您的图表 - 超级容易与 scrapy 集成。
    【解决方案3】:

    我编写了一个测试框架,用于测试爬虫与实时和缓存数据的对比,名为 scrapy-test。该框架专注于测试解析和爬取覆盖率。

    您可以为字段定义测试:

    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'),
        }
    

    因此,scrapy-test 的一般工作流程是每天/每半小时运行一次测试,以了解蜘蛛的健康状况。

    【讨论】:

    • 嘿,这太棒了,谢谢!本周将开始尝试。
    【解决方案4】:

    假设 size 是输出 csv 中的第三个字段,您可以看到最后 10 个字段中有多少缺少:

    尾输出.csv |切-f3 -d, | grep -v [0-9] | wc -l

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      相关资源
      最近更新 更多