-
Notifications
You must be signed in to change notification settings - Fork 31
爬蟲開發守則
ddio edited this page Aug 4, 2018
·
4 revisions
即便是同一隻爬蟲,也會因為目標網站結構更新、資料集欄位更動,或是其他的原因,而需要重新執行。但由於租屋資料並不會永久保留在目標網站上,留下可供重複執行的各階段材料,便是爬蟲本身需要作的事情。
在目前的設計中, HouseSpider
針對單一物件,提供了三層的歷史紀錄:
-
rental.models.HouseEtc.detail_raw
- 說明:單一物件網頁的原始 HTML ,完整保留所有內容,若需要處理之前從來沒結構化的內容時,可從這邊著手
- 工具:可用
crawler/tools/rerun_detail_raw.py
,直接讀取detail_raw
來重新產生後續的所有衍生資料 - 限制:基於儲存空間考量,
rental.models.HouseEtc
只保留每筆物件最後一次的資料,所以重新執行時,只會更新rental.models.House
,不會更新rental.models.HouseTS
-
rental.models.HouseEtc.detail_dict
- 說明:從
detail_raw
整理出的結構化資料,若要處理個別租屋網站對共用欄位的轉換問題,可從這邊著手 - 工具:可用
crawler/tools/rerun_detail_dict.py
,直接讀取detail_dict
來重新產生後續的所有衍生資料 - 限制:基於儲存空間考量,
rental.models.HouseEtc
只保留每筆物件最後一次的資料,所以重新執行時,只會更新rental.models.House
,不會更新rental.models.HouseTS
- 說明:從
-
rental.models.HouseTS
- 說明:將每日爬蟲更新的歷史紀錄儲存在共用欄位中,可用來回朔資料變更狀況
- 工具:NA
- 限制:由於已經轉成共用欄位,如果產生資料時的爬蟲是有問題的,那相關的問題就會被保留下來
由於資料集欄位包含一些橫跨多筆紀錄才能計算的衍生欄位,爬蟲必須滿足可重入,才能確保資料不會因為內部或外部的異常狀況,產生問題。
舉例來說, #14 #15 #16 裡提到的 deal_status
deal_time
n_day_deal
,因為沒有確保此特性,會因為目標網站發生預料之外的狀態轉換,或是內部更新新增欄位時,出現問題。針對這裡的爬蟲,爬蟲至少需要作到:
- 資料改變的前提,不應該建立在「前一次」的物件是什麼狀態
- 若欄位和「物件的歷史變更」有關,那應該使用更能信賴的紀錄,而不是「前一次」物件的狀態
- 單一物件的修改,必須在同一個 transaction 完成