網站載入中

YayJun

LOADING

↖
CASE 05 / 社群輿情自動化爬蟲
CASE 05協作開發

社群輿情
自動化爬蟲

輿情要 24 小時關注 → 非同步爬取、去重、資料彙整。

asyncioRedis 去重即時推播

我的角色|協作開發:非同步爬蟲、反偵測策略、去重機制與多管道通知整合。

01 / 問題與情境

等到有人回報時,討論通常已擴散好幾個小時。

24小時

輿情不分時段發生,人工盯場效率不佳,半夜的討論常常隔天才看到。

重複

同一則內容會被轉載、轉貼,全部推播只會洗版,重要的反而被覆蓋。

查不回

看過即遺忘,事後想追某個議題時,沒有紀錄可查。

02 / 解決方案

全抓進來不難,難的是只推需要的那幾則。

01 排程

非同步輪詢

多來源併發抓取,單一來源異常不拖累查詢。

02 反偵測

降低被擋機率

隨機 UA、間隔抖動與失敗退避,避免被判定為機器人。

03 關鍵

指紋去重

對正規化後的內文取指紋,重複內容只推一次。

04 推播

分級通知

依關鍵字優先級處理不同管道推播,同時寫入記錄可回查。

03 / 系統架構

一輪掃描怎麼從幾十筆,收斂成幾則通知。

1/4 來源層

社群平台 A
社群平台 B
網站 C

2/4 抓取層

背景排程來源清單・定時掃描
asyncio 爬蟲池併發控制・反偵測

3/4 去重層・收斂關鍵

正規化
指紋
時窗

Redis 去重

內容指紋比對・時窗內判重
轉載改標題視為同一則

4/4 判定與輸出

關鍵字與優先級決定推不推・推哪個管道
Elasticsearch/全文全部寫入・可回查
Telegram/即時推播只推命中的

※Desktop 版可展示 Data Flow 🖥️

04 / 互動演示

動手桌機可操作

互動區:讓監控跑起來,看哪一則被擋下、哪一則被推播。

1

啟動監控

排程觸發,讀取本輪要掃的來源與關鍵字

2

抓取貼文

asyncio 併發抓取,帶反偵測與逾時控制

3

Redis 去重

內文正規化後取指紋,時窗比對是否已見過

4

命中關鍵字

對去重後的內容比對關鍵字與優先級規則

5

推播

依優先級推播,並寫入歷史

啟動監控後,會隨機產生社群貼文,右邊同步給出結論。

※Desktop 版可操作這段演示 🖥️

本頁為去識別化模擬,不含專案原始碼或資料;正規化、指紋與時窗判重都在瀏覽器端執行,貼文內容皆為合成。

05 / 技術選型與設計決策

每個技術都對應一個要解的問題。

ALTERNATIVE CONSIDERED

為何用內容指紋去重,而不是比對貼文 ID?

貼文 ID 只能擋掉「同一則被抓了兩次」,但實際造成洗版的是同一段內容以轉載、改標題等形式出現在不同來源。改為對正規化後的內文取指紋,代價是要維護正規化規則,但相對於通知洗版導致值班人員直接忽略,這個取捨是划算的。

06 / 挑戰與成果

抓得到只是起點,抓得久才是難的。

挑戰 01

長時間運行被判定為機器人

以隨機 UA、間隔抖動與失敗退避降低特徵;單一來源被擋時隔離該來源,其餘照常運作。

挑戰 02

轉載造成的重複通知

改用正規化內文指紋搭配時窗比對,轉載轉貼視為同一則,只推播一次。

全天候

排程不間斷運行,半夜的討論也不會漏掉。

不洗版

去重後只推播需要的,通知才有重點。

可回查

全部寫入 Elasticsearch,事後能追議題發酵時間。