代码之家  ›  专栏  ›  技术社区  ›  hadees

如果RubyonRails中的屏幕抓取失败,如何优雅地失败并得到通知

  •  1
  • hadees  · 技术社区  · 14 年前

    我正在开发一个Rails3项目,它主要依靠屏幕抓取来收集数据 Nokogiri . 我把基本上所有相同的数据聚合在一起,但我从许多不同的数据源中获取数据,随着时间的推移,我将添加越来越多的数据。然而,我敏锐地意识到屏幕抓取是出了名的不可靠。

    因此,我对其他人如何处理验证数据的问题很感兴趣,如果数据失败,也会收到通知。

    我目前的计划如下。

    1. 我将对大多数字段的模型进行验证。如果他们失败了,我就不会把坏数据输入我的系统。尽管以有意义的方式记录此故障仍然是一个问题。

    2. 我在想一种计数器,在某个特定来源的如此多失败之后,我不知怎么地关掉了它。不知道如何跟踪。我想唯一的方法是在我的源模型上有一个字段对其进行计数并可以重置。

    3. 伐木是800磅重的大猩猩,我不知道该怎么处理。我可以只写标准的日志,但如果有什么失败,我想存储整个HTML,以便我能找到它。另外,我需要以某种方式通知自己,这样我才能解决问题。我想也许只是为所有这些创建一个模型并将其存储在数据库中。如果我这样做,我可能需要将HTML存储在S3或其他东西上。我在Heroku上运行这个程序,以影响我的工作。

    4. 开始设置并在每个场地周围救援。我试着用一种更好的Ruby方式编写代码,这样我就没有它们的页面了,但是尽管我确实有一些字段是直接向上的doc.css_a t(“whatever”),但是有相当多的数字需要不同的格式或计算,所以我认为尝试挽救它是有意义的,这样我就可以记录出错的内容。另一种选择是让异常冒泡起来,并在我尝试创建模型时捕获它。

    不管怎么说,我肯定我什么都没想,但这就是为什么我想知道其他人是如何处理这个问题的。

    1 回复  |  直到 14 年前
        1
  •  1
  •   avaynshtok    14 年前

    我们的团队做了类似的事情,所以这里有一些想法:

    • 我们使用一个非常高级别的begin/rescue事务来确保我们不会进入奇怪的半加载状态:
    begin
      ActiveRecord::Base.transaction do
        ...try to load a data source...
      end
    rescue
      ...error handling...
    end
    
    • 当出现某些错误时,请发送电子邮件/发送网页。我们使用 exception_notifier 但是如果你坐在Heroku上,这个特别的插件看起来也是一个不错的选择。我也听说有人在/ hoptoad

    • 捕获状态对于解决问题非常重要。对我们来说非常有效的是Gmail。我们的装载机实际上有两个阶段:

      1. 获取数据并发送到我们的gmail帐户
      2. 登录gmail,下载最新数据并进行解析

    第二个阶段是复杂的阶段,如果失败了,开发人员可以简单地登录到gmail帐户并轻松地检查失败的消息。这个过程有一些限制(每个电子邮件和每个邮箱的存储限制、两阶段管道等),我们开始这样做是因为我们没有其他选择,但事实证明它具有惊人的弹性和方便性。记住电子邮件是存储非关键状态的一种廉价/简单的方法。我们并没有开始考虑用这种方法,现在真的很高兴我们这样做了。登录gmail比挖掘日志文件感觉更好。

    • 构建仪表板用户界面。我们有一个简单的仪表盘,每天都有一个网格源, looks like this . 根据当天该源的加载是否成功,每个框的颜色为红色或绿色。您可以更进一步,在此用户界面(mon.itor.us或等效界面)上设置一个监视器,当满足某个错误阈值时,该监视器会发出警报。