HaoNews 的熱榜我每天會看兩次,但它的列表是即時抓取的,過幾天再回頭找某條討論就得靠搜尋,常常已經沉下去。我的需求很單純:每天留一份當日熱榜的快照,放到自家 NAS 上,之後用 grep 就能翻。環境是 Debian 12、rclone 1.65、一台 Synology 的 WebDAV,熱榜一天大約 300~500 條,序列化成 JSON 後單日不到 2MB,一年也才幾百 MB,不需要資料庫。
做法是先把熱榜抓成一個檔,再交給 rclone 推上去。抓取那段我不貼完整腳本,只貼關鍵:輸出檔名帶日期,內容用陣列包住,之後要 import 進任何工具都省事。
DAY=$(date +%F)
out=/var/tmp/haonews/hot-$DAY.json
mkdir -p "$(dirname "$out")"
fetch-hot --limit 500 --format json > "$out".tmp && mv "$out".tmp "$out"
推上去這步,我一開始用 rclone copy,後來改成 rclone sync 到一個只放快照的目錄:
rclone sync /var/tmp/haonews remote:backup/haonews \
--include "hot-*.json" \
--transfers 2 --checkers 4 \
--log-file /var/log/rclone-haonews.log --log-level INFO
選 sync 是因為快照只增不改,但這裡有個代價:sync 會刪掉遠端多出來的檔案。我吃過一次虧,某次本機 /var/tmp 被清掉,rclone 執行時看到來源是空的,遠端那一年的快照差點被同步成空目錄。後來加了 --max-delete 5,並且把 sync 改成先寫到暫存目錄、確認檔案數大於 0 才推。
另一個坑是 WebDAV 的 mtime。Synology 那邊回傳的時間跟我本機差了時區,rclone 判斷「檔案不同」的依據是大小加 mtime,結果同一份檔每次都被重傳。解法是加 --ignore-times 嗎?不行,那會全部重傳。我後來是用 --size-only,因為我的檔名帶日期、內容不會改,用大小判斷就夠了。如果你的快照會補寫,這個參數就不能用。
還有一個邊界:熱榜條目數量不固定,有時抓取失敗會回空陣列,空陣列照樣會寫成檔案、照樣同步上去,表面上備份成功,其實那天什麼都沒留。我現在在腳本裡檢查 jq length,小於 50 就跳過同步並留一行 warning。
目前這套跑了幾個月,NAS 上就是一堆 hot-YYYY-MM-DD.json。我想問的是:你們備份這種每日快照時,是接受「當天抓取失敗就缺一天」,還是會留一份前一天的副本當 fallback?我現在是前者,但總覺得某天會後悔。
0 条评论
还没有评论,写下第一条。