簡體   English   中英

如果屏幕刮擦在導軌上的紅寶石中失敗,如何正常失敗並獲得通知

[英]How to fail gracefully and get notified if screen scraping fails in ruby on rails

我正在一個Rails 3項目中工作,該項目主要依靠屏幕抓取來收集數據,主要使用Nokogiri進行 我正在匯總基本上所有相同的數據,但是我從許多不同的來源中獲取數據,隨着時間的流逝,我將越來越多地添加它們。 但是,我非常清楚地知道,屏幕抓取可能非常不可靠。

因此,我對其他人如何處理驗證數據並在出現故障時得到通知的問題感興趣。

我目前的計划如下。

  1. 我將對大多數領域的模型進行驗證。 如果他們失敗了,我將不會將不良數據輸入我的系統。 盡管以有意義的方式記錄此故障仍然是一個問題。

  2. 我在考慮某種計數器,在某個特定來源發生了多次故障之后,我以某種方式將其關閉。 不確定如何跟蹤。 我猜唯一的方法是在我的Source模型上有一個字段來對其進行計數並可以重置。

  3. 伐木是800磅的大猩猩,我不確定該如何處理。 我可以對日志進行標准寫入,但是如果出現故障,我想存儲整個html,以便我找出來。 另外,我需要以某種方式通知自己,以便解決這些問題。 我想到可能只是為此創建一個模型並將其存儲在數據庫中。 如果執行此操作,則可能必須將html存儲在s3上。 我在heroku上運行它,因此影響了我的工作能力。

  4. 設置程序開始並救援每個領域的塊。 我試圖找出一種以更好的紅寶石方式編碼的代碼,所以我只是沒有它們的頁面,但是盡管我確實有一些字段只是直接出現在doc.css_at(“#whatever”)那里,需要各種格式或計算的數字,所以我認為嘗試挽救它是有道理的,這樣我就可以記錄出現了什么問題。 另一個選擇是讓異常冒泡並在嘗試創建模型時捕獲它。

無論如何,我確定我什至沒有考慮所有問題,所以這就是為什么我試圖弄清楚其他人如何處理此問題。

我們的團隊做了類似的事情,所以這里有一些想法:

  • 我們使用非常高級別的開始/救援事務來確保我們不會進入怪異的半加載狀態:
 begin ActiveRecord::Base.transaction do ...try to load a data source... end rescue ...error handling... end 
  • 在發生某些錯誤時給您自己發送電子郵件/尋呼。 我們使用exception_notifier,但是如果您坐在Heroku上,Exceptional插件似乎也是一個不錯的選擇。 我也聽說有人在跳跳成功了

  • 捕獲狀態對於解決問題非常重要。 GMail對我們來說非常有效。 我們的裝載機實際上分為兩個階段:

    1. 捕獲數據並將其發送到我們的Gmail帳戶
    2. 登錄gmail,下載最新數據並進行解析

第二階段是復雜的階段,如果失敗,開發人員可以簡單地登錄gmail帳戶並輕松檢查失敗的消息。 這個過程有一些限制(每個電子郵件和每個郵箱的存儲限制,兩階段管道等),我們開始這樣做是因為我們沒有其他選擇,但是事實證明,它具有驚人的彈性和便利性。 記住電子郵件是一種廉價/簡便的存儲非關鍵狀態的方法。 我們並不是開始考慮使用這種方式,現在真的很高興我們這樣做。 登錄到GMail比瀏覽日志文件更好。

  • 建立儀表板UI。 我們有一個簡單的儀表板,每天都有一個源網格, 看起來像這樣 根據當天該源的加載是否成功,每個框的顏色為紅色或綠色。 您可以更進一步,並在此UI上設置監視器(mon.itor.us或等效監視器),該監視器將在達到某些錯誤閾值時發出警報。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM