Skip to content

爬蟲開發守則

ddio edited this page Aug 4, 2018 · 4 revisions

留下歷史紀錄,讓爬蟲可以重複執行

即便是同一隻爬蟲,也會因為目標網站結構更新、資料集欄位更動,或是其他的原因,而需要重新執行。但由於租屋資料並不會永久保留在目標網站上,留下可供重複執行的各階段材料,便是爬蟲本身需要作的事情。

在目前的設計中, HouseSpider 針對單一物件,提供了三層的歷史紀錄:

  1. rental.models.HouseEtc.detail_raw
    • 說明:單一物件網頁的原始 HTML ,完整保留所有內容,若需要處理之前從來沒結構化的內容時,可從這邊著手
    • 工具:可用 crawler/tools/rerun_detail_raw.py ,直接讀取 detail_raw 來重新產生後續的所有衍生資料
    • 限制:基於儲存空間考量,rental.models.HouseEtc 只保留每筆物件最後一次的資料,所以重新執行時,只會更新 rental.models.House ,不會更新 rental.models.HouseTS
  2. rental.models.HouseEtc.detail_dict
    • 說明:從 detail_raw 整理出的結構化資料,若要處理個別租屋網站對共用欄位的轉換問題,可從這邊著手
    • 工具:可用 crawler/tools/rerun_detail_dict.py ,直接讀取 detail_dict 來重新產生後續的所有衍生資料
    • 限制:基於儲存空間考量,rental.models.HouseEtc 只保留每筆物件最後一次的資料,所以重新執行時,只會更新 rental.models.House ,不會更新 rental.models.HouseTS
  3. rental.models.HouseTS
    • 說明:將每日爬蟲更新的歷史紀錄儲存在共用欄位中,可用來回朔資料變更狀況
    • 工具:NA
    • 限制:由於已經轉成共用欄位,如果產生資料時的爬蟲是有問題的,那相關的問題就會被保留下來

爬蟲必須可重入(reentrant)

由於資料集欄位包含一些橫跨多筆紀錄才能計算的衍生欄位,爬蟲必須滿足可重入,才能確保資料不會因為內部或外部的異常狀況,產生問題。

舉例來說, #14 #15 #16 裡提到的 deal_status deal_time n_day_deal ,因為沒有確保此特性,會因為目標網站發生預料之外的狀態轉換,或是內部更新新增欄位時,出現問題。針對這裡的爬蟲,爬蟲至少需要作到:

  1. 資料改變的前提,不應該建立在「前一次」的物件是什麼狀態
  2. 若欄位和「物件的歷史變更」有關,那應該使用更能信賴的紀錄,而不是「前一次」物件的狀態
  3. 單一物件的修改,必須在同一個 transaction 完成
Clone this wiki locally