YayJun
LOADING
輿情要 24 小時關注 → 非同步爬取、去重、資料彙整。
我的角色|協作開發:非同步爬蟲、反偵測策略、去重機制與多管道通知整合。
THE PROBLEM / 問題與情境
24 小時
輿情不分時段發生,人工盯場效率不佳,半夜的討論常常隔天才看到。
重複
同一則內容會被轉載、轉貼,全部推播只會洗版,重要的反而被覆蓋。
查不回
看過即遺忘,事後想追某個議題什麼時候開始發酵,沒有紀錄可查。
THE SOLUTION / 解決方案
01 排程
非同步輪詢
多來源併發抓取,單一來源異常不拖累查詢。
02 反偵測
降低被擋機率
隨機 UA、間隔抖動與失敗退避,避免被判定為機器人。
03 關鍵
指紋去重
對正規化後的內文取指紋,重複內容只推一次。
04 推播
分級通知
依關鍵字優先級處理不同管道推播,同時寫入記錄可回查。
ARCHITECTURE / 系統架構
來源層
抓取層
去重層・收斂關鍵
Redis 去重
內容指紋比對・時窗內判重
轉載改標題視為同一則
判定與輸出
INTERACTIVE DEMO / 互動演示
可互動啟動監控
排程觸發,讀取本輪要掃的來源與關鍵字
抓取貼文
asyncio 併發抓取,帶反偵測與逾時控制
Redis 去重
內文正規化後取指紋,時窗內比對是否已見過
命中關鍵字
對去重後的內容比對關鍵字與優先級規則
推播
依優先級送往對應管道,並寫入歷史
監控任務 / 合成資料
本輪掃描結果
待機中從左邊選一個監控任務,五個步驟會依序點亮,最後產出推播卡片。
被判重複的一筆
來源 B ・ 09:12 轉載貼文
與來源 A 的 09:04 貼文正規化後指紋相同(僅差開頭 emoji 與轉載前綴)
推播卡片預覽
被判重複的一筆
來源 C ・ 21:33 截圖轉貼
內文與來源 A 的 21:31 貼文相同,貼文 ID 不同但指紋命中時窗內既有紀錄
推播卡片預覽
被判重複的一筆
來源 A ・ 15:48 重新編輯後的同一則
同一貼文 ID 的編輯版本,內容指紋未變,視為同一則不重複推播
推播卡片預覽
本頁為去識別化整理,不含前雇主原始碼或資料;來源名稱、貼文內容與數量皆為前端合成資料。
TECHNOLOGY & DESIGN DECISIONS / 技術選型與設計決策
ALTERNATIVE CONSIDERED
為何用內容指紋去重,而不是比對貼文 ID?
貼文 ID 只能擋掉「同一則被抓了兩次」,但實際造成洗版的是同一段內容以轉載、改標題等形式出現在不同來源。改為對正規化後的內文取指紋,代價是要維護正規化規則,但相對於通知洗版導致值班人員直接忽略,這個取捨是划算的。
CHALLENGES & RESULTS / 挑戰與成果
挑戰 01
長時間運行被判定為機器人
以隨機 UA、間隔抖動與失敗退避降低特徵;單一來源被擋時隔離該來源,其餘照常運作。
挑戰 02
轉載造成的重複通知
改用正規化內文指紋搭配時窗比對,轉載轉貼視為同一則,只推播一次。
全天候
排程不間斷運行,半夜的討論也不會漏掉。
不洗版
去重後只推該推的,通知才有人看。
可回查
全部寫入 Elasticsearch,事後能追議題發酵時間。