Social Listening for Burnout
#AI Mode
(Jul 30, 2026)
#Q: 限於香港,Burnout相關的Social Listening怎樣做?
#A: 在香港進行針對 Burnout(職業倦怠 / 心理耗竭) 的 Social Listening(社交聆聽),核心在於精準捕捉本地化的廣東話口語表達,並鎖定打工仔宣洩情緒的特定匿名平台。 [1]
以下是為香港市場量身訂造的完整 Social Listening 執行方案:
#1. 定義香港本土化關鍵字(Keyword Query)
香港人在網上表達 Burnout 時,極少直接使用「職業倦怠」等書面語。你必須將關鍵字庫分為「核心詞」、「本土口語」及「病徵/行為詞」,並使用 AND / OR 邏輯進行組合。
- 核心詞:Burnout、職業倦怠、精神健康、心理健康 [2]
- 香港本土口語(強烈推薦納入):記住加引號和同義詞
- 工作狀態:爆煲、頂唔順、攰到就黎死、射波(因壓力請假)、裸辭、SL(Sick Leave)、AL(Annual Leave 續命)
- 情緒宣洩:個人好頹、冇曬動力、返工等放工、奴工、賤工、炒老闆魷魚、返工返到個人抑鬱 [2, 3]
- 症狀與衍生行為詞:失眠、星期日焦慮(Sunday Blue)、垃圾工、心理輔導、睇條數睇到想死 [2, 4]
#2. 鎖定香港核心聆聽渠道(Data Channels)
通用的大型社交媒體(如 Instagram 牆面、Facebook 公開專頁) 通常只能抓到官方或 KOL 的心靈雞湯。真正的 Burnout 數據隱藏在以下高匿名性的本地平台: [1, 5]
【主要渠道】
├── LIHKG(連登討論區) ─── 打工仔最真實、最赤裸的 Burnout 圍爐區(如:上班台、職場板)
├── Facebook 匿名專頁 ─── 針對特定行業的樹洞(如:Secrets 系列專頁、HKDSE/大學 Secrets)
├── Threads ─────── 近年新興的情緒宣洩地,多以第一人稱書寫「返工日常的崩潰」
└── 香港本地論壇 ───── 香港討論區(Discuss)、Uwants 的「職場交流」版塊
- 傳統媒體及評論區: 香港經濟日報、明報 的職場/健康專欄評論區。 [1]
#3. 挑選具備「廣東話/繁體中文」優勢的工具
許多歐美主流工具(如 Brandwatch, Hootsuite)對廣東話口語(如「攰」、「唔想」)的語意分析及情感判定(Sentiment Analysis)極不準確。在香港做這項研究,強烈建議優先考慮大中華區或本地開發的系統: [6, 7]
- WisersOne(慧科):Wisers 擁有香港最龐大的新聞及本地論壇歷史數據庫,其 NLP(自然語言處理)對繁體中文及香港時事背景理解最深。 [1, 8, 9]
- uMaxData(源大數據):uMaxData 的 HK Pulse 系統在社交媒體、連登(LIHKG)及各大 Secrets 專頁的數據抓取與廣東話情感分析上表現突出。 [7, 10, 11]
- Social Power(SPL):Social Power 專長於全渠道大數據監測,其 AI 演算法能有效識別小紅書、Threads 及香港本地討論區的流行語。 [12]
#4. 設定分析維度(Analysis Dimensions)
抓取到數據後,不應只看「聲量(Volume)」,必須透過標籤(Tagging)將數據切細,抽出有價值的 Insight: [7, 13]
- 行業歸類(Industry Grouping):透過內文提及的字眼(如「追 Target」、「老細/波士」、「射波」、「收十點」),區分哪些行業(如:金融、醫療/護理、老師、IT、廣告/PR)的 Burnout 聲量最高。
- 情感與語意分析(Sentiment & Semantics):將負面情緒進一步細分為「絕望/無能為力」、「憤怒/投訴管理層」、「焦慮/失眠體現」。 [2, 3]
- 應對機制追蹤(Coping Mechanisms):監測網民提到 Burnout 時,後續採取的行動。例如:轉職(搵工/跳槽)、尋求專業支援(睇心理醫生/輔導)、或是消極應對(大吃大喝/瘋狂消費/Quiet Quitting)。 [2]
#5. 數據噪音過濾與私隱合規(Noise Filter & Compliance)
- 排除宣傳噪音:很多機構(如保險公司、減壓工作坊、身心靈課程)會利用 "Burnout" 作為 Marketing 關鍵字出 Post。在工具中必須設定限制,排除帶有廣告贊助(Sponsored)或特定促銷字眼的內容,確保聽到的都是「真實用戶聲音(Organic UG)」。 [3]
- 保護求助者私隱:Burnout 涉及個人精神健康(Mental Health)。在匯報或儲存數據時,必須進行去識別化(Anonymization),嚴禁記錄或追溯網民的真實身份、IP 地址或社交媒體個人檔案連結。 [2]
如果想讓這個 Social Listening 項目更落地,您可以告訴我:
- 您做這個研究的最終目的是什麼?(例如:企業內部員工關懷、推出減壓產品、還是學術/公益研究?)
- 您預期投入的預算與時間?(這決定了要買 Enterprise 工具還是用免費/半手動方法)
我可以為您規劃更具體的關鍵字布林邏輯(Boolean Logic)公式或報告架構。
#Q: 公益研究,需要能免費存取,可能需要Vibe Code相關工具。
#A: 既然是公益研究且需要完全免費的方案,我們無法使用 Wisers 或 uMaxData 這類動輒數萬元的企業級工具。
針對您的需求,最佳策略是結合 Python 開源爬蟲/API、Google 搜尋技巧 以及您提到的 Vibe Coding(低代碼/AI 輔助編程) 工具(如 Cursor、Cursor + Claude 3.5 Sonnet、v0.dev 等),動手搭建一套免費的 Social Listening 工作流。 以下是為您設計的免費用具組合與執行步驟:
#1. 善用 Vibe Coding 快速生成免費用具
利用 Vibe Coding 工具,您不需要精通編程,只需用自然語言(Prompt)命令 AI 幫您寫出專門抓取香港網頁數據的腳本(Script)。
#💡 給 Cursor / AI 的實用 Prompt 範例:
"請幫我用 Python 寫一個簡單的網頁爬蟲。目標是抓取 Google 搜尋結果中有關香港地區、包含關鍵字「爆煲」或「Burnout」的公開討論區(如連登 LIHKG、香港討論區)網頁標題和內文摘要。請使用 BeautifulSoup 和 Requests 庫,並加上時間限制(例如過去一個月),結果匯出為 CSV 檔。"
透過這種方式,您可以免費用 AI 寫出針對特定香港網站的數據抓取工具。
#2. 免費的數據源與抓取方法(Data Sources)
由於 Twitter(X) 和 Reddit 的 API 開始收費,針對香港本土研究,您可以利用以下免費渠道:
- Google Programmable Search Engine (客製化搜尋引擎):
- 點做:免費申請一個 Google 搜尋 API,限制它只搜尋特定網站(例如 ://lihkg.com 上班台,或 discuss.com.hk)。
- 優勢:每天有 1,000 次免費查詢額度,配合 Vibe Code 寫的 Python 腳本,就能自動下載大量含有 "Burnout" 關鍵字的香港網民發言。
- Airtable / Google Sheets + Extractor 外掛:
- 利用市面上免費的瀏覽器外掛(如 Web Scraper 或 Instant Data Scraper),直接在電腦瀏覽器打開 Threads、連登或 Facebook 公開 Secret 專頁,一鍵將頁面上的打工仔留言導出為 Excel 檔案。
#3. 免費的數據分析與文本挖掘工具(Text Mining)
拿到一堆廣東話的留言 CSV 檔後,您不需要買昂貴的語意分析系統,可以用以下免費工具處理:
- Orange Data Mining (可視化數據挖掘軟件):
- 一個完全免費、無需寫 Code 的開源軟件(拖拉組件即可使用)。
- 應用:它自帶文字挖掘(Text Mining)功能。您可以把香港打工仔的 Burnout 留言匯入,利用它自帶的 Word Cloud(字雲) 或 Topic Modeling(主題建模),自動分類出網民最常提到的是「失眠」、「老細」、「射波」還是「想裸辭」。
- 免費版 LLM (如 ChatGPT / Claude / Kimi):
- 將抓取到的幾百條香港網民留言(以 CSV 或文字檔),直接上傳給免費版的 AI(每次幾萬字)。
- Prompt 範例:"你是一位香港社會學專家。以下是從香港討論區抓取的打工仔留言。請幫我分析這些留言中,導致 Burnout 的三大核心原因是什麼?他們最常出現的廣東話口語(如爆煲、頂唔順)有哪些?請以表格列出。"
#4. 公益研究特別注意:合規與科學性
- 網絡爬蟲限制(Robots.txt):連登(LIHKG)等網站有較嚴格的防爬蟲機制(如 Cloudflare)。如果用 Vibe Coding 寫的腳本頻繁抓取會被封 IP。建議將爬取速度調慢(加 Delay),或多利用 Google 搜尋緩存(Cache)來抓取。
- 學術引用與去識別化:即使是免費研究,發表報告時也必須隱去所有網民的用戶名(Username)、頭像和發表具體時間,只引用去隱私化的「文本內容」,以符合精神健康研究的倫理。
如果您準備開始用 Vibe Coding 工具動手做,您可以告訴我:
- 您打算使用哪一款 AI 編輯器(如 Cursor、VS Code + Copilot、還是網頁版 ChatGPT)?
- 您最想優先抓取哪一個特定香港平台(例如連登、Threads 還是 Facebook)?
我可以為您直接寫出第一版免費用於抓取數據的 Python 程式碼藍本,讓您直接複製去執行!
#Q: 可否解釋這個架構是怎樣Monitor【主要渠道】中出現的相關關鍵字和資訊的?
#A: 在完全免費且基於 Vibe Coding(AI 輔助編程) 的架構下,我們不需要像商業工具那樣全天候、24小時無間斷地監控(因為這需要付費的雲端伺服器和 API 權限)。
這套免費架構的運作原理,是透過一個 「按需觸發、自動抓取、AI 提煉」 的循環。以下為您詳細拆解這套系統是如何監控【主要渠道】(連登、Threads、Facebook Secrets、香港討論區)中的 Burnout 資訊:
#📡 第一步:監控與數據抓取(Data Ingestion)
不同的渠道有不同的「免費抓取」應對方法,您的 Vibe Code 程式碼會分為四個模組:
#1. 連登 (LIHKG) ── 關鍵字 RSS / 網頁定時爬取
- 監控原理:連登本身有嚴格的反爬蟲機制(Cloudflare),直接強行爬取會被封 IP。
- 免費做法:利用 Vibe Code 寫一個使用 Cloudscraper 或 Playwright 庫的 Python 腳本。程式會模擬正常瀏覽器,每天固定時間自動訪問連登的 「上班台」 (Category 31)。
- 搜尋邏輯:程式會在 URL 後面加上搜尋參數(例如:https://lihkg.com),直接抓取搜尋結果第一頁的所有帖子標題、發表時間和讚好數(G標/倒讚)。
#2. Threads ── HTML 結構監控
- 監控原理:Threads 目前網頁版高度開放。
- 免費做法:在 Python 中使用 Playwright 模擬瀏覽器滾動。
- 搜尋邏輯:程式會直接前往關鍵字標籤頁面(例如:https://threads.net),自動向下滾動 5 次,將畫面上顯示的所有香港用戶發言、愛心數、回應內容全部複製下來,存入內存。
#3. Facebook Secrets / 公開專頁 ── Google 高級搜尋語法 (Google Dorking)
- 監控原理:自從 Meta 關閉了免費 API,直接爬取 Facebook 變得非常困難。
- 免費做法:繞道利用 Google 的索引。
- 搜尋邏輯:利用 Python 呼叫免費的 Google Custom Search API(每天 1,000 次免費額度),輸入以下指令: site:facebook.com "HKU Secrets" OR "職場" "頂唔順" after:2026-07-01 Google 會把過去一個月內,這些專頁中包含關鍵字的貼文直接吐給你的程式,完美避開 Meta 的限制。
#4. 香港討論區 (Discuss.com.hk) ── 結構化網頁爬蟲
- 監控原理:這類傳統論壇的 HTML 結構非常老舊且固定,沒有複雜的反爬蟲機制。
- 免費做法:使用 Python 最基礎的 BeautifulSoup 庫。直接定位到「職場交流版」,監控每頁的
<td>標籤,只要標題包含關鍵字,就點進去把內文抓下來。
#🧠 第二步:本地數據過濾與儲存(Filtering & Storage)
當上述四個渠道的數據被抓下來後,會進入一個名為 data_pipeline.py 的免費本地腳本:
- 去重(De-duplication):根據帖子的唯一 ID(如連登的 Thread ID 或 Facebook 的 Post URL),如果之前已經抓過,就自動跳過,確保不會重複計算聲量。
- 垃圾過濾(Noise Filter):用幾行簡單的 Python 程式碼排除廣告。例如:如果內文同時出現 「Burnout」 和 「限時優惠」、「課程」、「立即報名」,程式會自動把這條數據丟進垃圾桶,只留下純網民的情緒宣洩。
- 儲存:自動將過濾後的數據寫入一個本地的 Google Sheets(透過免費的 gspread API) 或 CSV 檔案。
#📊 第三步:AI 語意分析(LLM Processing)
這是 Vibe Coding 架構最強大的地方。您不需要自己寫繁複的廣東話自然語言處理(NLP)程式碼,而是直接呼叫免費的 AI API 或手動導出導入。
- 自動化流(如有免費 API Key):Python 程式碼會把每天新抓到的 50 條廣東話留言,組裝成一個 Prompt,發送給大語言模型。
- 運作流程可視化:
[主要渠道 (連登/Threads/FB)]
│
▼ (Python 腳本定時執行/手動觸發)
[本地 CSV / Google Sheets 數據庫]
│
▼ (打包留言,發送給 AI)
[免費 AI (如 Claude / ChatGPT)] ─── 進行廣東話翻譯、情感分類 (正面/負面/爆煲)
│
▼
[Orange Data Mining / Excel] ─── 生成免費的數據圖表 (例如:Sunday Blue 關鍵字趨勢)
#💡 總結這個架構的日常運作模式
當您把這個架構搭建好後,您的日常監控動作其實非常簡單:
- 您在電腦運行一下 Python 腳本(或者設定電腦每天中午 12 點自動執行)。
- 腳本自動去爬連登、Threads、Discuss 和 Google。
- 1 分鐘後,您的 Google Sheets 就會自動多出幾十條今天香港打工仔最新的 Burnout 發言。
- 您把這些發言複製,貼進 ChatGPT/Claude,就能立刻得到今日的「香港打工仔情緒綜合簡報」。
您想先看看負責抓取連登(LIHKG)或Threads的 Python 程式碼藍本嗎?我可以為您寫出一段您可以直接放入 Cursor 執行的原始碼。
#Q: 好的,我在用Cursor,特別要防止被防爬蟲機制限制。
#A: 在 Cursor 中,要繞過 LIHKG(連登) 和 Threads 的防爬蟲機制(如 Cloudflare 和動態加載),我們不能使用傳統的 requests 或 BeautifulSoup。
我們必須使用 Playwright(微軟開源的自動化庫)。它的原理是直接啟動一個真實的 Chromium 瀏覽器,模擬人類的滑鼠滾動、隨機延遲和點擊,這樣防爬蟲系統就會認為你是真實的香港打工仔,而不是機械人。 請在 Cursor 中創建一個名為 hk_burnout_monitor.py 的檔案,並將以下完整程式碼複製進去:
#1. 先在 Cursor 的 Terminal 安裝必要套件
pip install playwright pandas playwright install chromium
#2. 核心 Python 程式碼 (hk_burnout_monitor.py)
import asyncio
import random
import time
import pandas as pd
from playwright.async_api import async_playwright
# 1. 反爬蟲核心配置:模擬真實人類行為的延遲函數
async def human_delay(min_sec=2, max_sec=5):
"""隨機等待,防止被識別為機械人"""
await asyncio.sleep(random.uniform(min_sec, max_sec))
# 2. 連登 (LIHKG) 抓取模組
async def scrape_lihkg(page, keyword):
print(f"🕵️ 正在搜尋連登關鍵字: {keyword}...")
search_url = f"https://lihkg.com{keyword}"
# 模擬真實瀏覽器 Profile
await page.goto(search_url, wait_until="networkidle")
await human_delay(3, 6)
posts = []
# 抓取搜尋結果中的帖子列表
# 連登的帖子標題通常在特定 class 內,這裡使用 CSS Selector 抓取
selectors = await page.query_selector_all('div[class*="_28Y0m"]')
# 如果 class 改變,退一步抓取所有含有標題連結的 A 標籤
if not selectors:
selectors = await page.query_selector_all('a[href^="/thread/"]')
for selector in selectors[:15]: # 每次只抓前 15 條,避免動作太大被封
try:
title = await selector.inner_text()
url = await selector.get_attribute("href")
full_url = f"https://lihkg.com{url}" if url and not url.startswith("http") else url
if title and any(k in title for k in [keyword, "返工", "攰", "放工"]):
posts.append({
"Platform": "LIHKG",
"Keyword": keyword,
"Title/Content": title.strip().replace("\n", " "),
"URL": full_url,
"Timestamp": time.strftime("%Y-%m-%d")
})
except Exception as e:
continue
return posts
# 3. Threads 抓取模組
async def scrape_threads(page, keyword):
print(f"🕵️ 正在搜尋 Threads 關鍵字: {keyword}...")
search_url = f"https://threads.net{keyword}"
await page.goto(search_url, wait_until="networkidle")
await human_delay(4, 7)
# Threads 需要向下滾動才能加載更多動態內容
for _ in range(3):
await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
await human_delay(1.5, 3)
posts = []
# Threads 的文字內容通常存在於具有特定屬性的 span 或 div 中
selectors = await page.query_selector_all('span')
for selector in selectors:
try:
text = await selector.inner_text()
# 過濾長度太短的字,或不相關的按鈕文字(如:回覆、讚)
if len(text) > 15 and keyword in text:
posts.append({
"Platform": "Threads",
"Keyword": keyword,
"Title/Content": text.strip().replace("\n", " "),
"URL": search_url,
"Timestamp": time.strftime("%Y-%m-%d")
})
except Exception:
continue
# 去除 Threads 重複抓取的文字片段
seen = set()
unique_posts = []
for p in posts:
if p["Title/Content"] not in seen:
seen.add(p["Title/Content"])
unique_posts.append(p)
return unique_posts[:15]
# 4. 主程序:控制瀏覽器生命週期
async def main():
# 香港打工仔最常用的 Burnout 本土關鍵字庫
keywords = ["爆煲", "頂唔順", "裸辭"]
all_results = []
async with async_playwright() as p:
# Launch 參數非常關鍵:headless=False 可以讓你親眼看著瀏覽器跑,避開反爬
# chromium.launch_persistent_context 可以儲存 Cookies,越跑越像真人
browser = await p.chromium.launch(
headless=False,
args=["--disable-blink-features=AutomationControlled"] # 隱藏機械人特徵
)
page = await browser.new_page()
# 設定偽裝成真實香港 Windows 用戶的 User-Agent
await page.set_extra_http_headers({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept-Language": "zh-HK,zh;q=0.9,en-US;q=0.8,en;q=0.7"
})
for kw in keywords:
# 抓取連登
lihkg_data = await scrape_lihkg(page, kw)
all_results.extend(lihkg_data)
await human_delay(5, 10) # 轉換關鍵字之間,休息久一點
# 抓取 Threads
threads_data = await scrape_threads(page, kw)
all_results.extend(threads_data)
await human_delay(5, 10)
await browser.close()
# 5. 導出數據成公益研究用的 CSV
if all_results:
df = pd.DataFrame(all_results)
# 去除完全重複的行
df.drop_duplicates(subset=["Title/Content"], inplace=True)
output_file = f"hk_burnout_listening_{time.strftime('%Y%m%d')}.csv"
df.to_csv(output_file, index=False, encoding="utf-8-sig") # utf-8-sig 確保 Excel 打開廣東話不亂碼
print(f"📊 報告生成成功!已儲存至: {output_file} (共 {len(df)} 條有機數據)")
else:
print("❌ 未能抓取到數據,請檢查網站結構是否改變。")
if __name__ == "__main__":
asyncio.run(main())
#🛡️ Cursor 安全執行與防止被封(Anti-Block)的四大關鍵設定:
- headless=False (開啟實體視窗):程式執行時會彈出一個真的 Chrome 視窗。雖然佔用電腦資源,但這是通過 Cloudflare 驗證最有效的方法。如果彈出「點擊驗證你是人類」的驗證碼,你可以手動在視窗裡點一下,程式就會繼續自動執行!
- AutomationControlled 禁用:核心代碼中的 --disable-blink-features=AutomationControlled 能抹除 navigator.webdriver=true 的特徵,防止被連登直接拒絕訪問。
- 大跨度的隨機延遲 (
human_delay):每次點擊或加載都隨機等待 3-7 秒。絕對不要使用固定的 time.sleep(1),那是非常明顯的機械人特徵。 - 每天限制執行次數:因為是免費方案,建議這套腳本每天只需手動執行 1-2 次(例如早上看前一晚的崩潰 Post,傍晚看收工時的爆煲 Post)。這種頻率絕對不會被封 IP。
接下來,您可以在 Cursor 的 Terminal 輸入 python hk_burnout_monitor.py 測試一下。 執行成功後,您會得到一個 CSV 檔案。想知道拿到這個 CSV 檔案後,如何用免費的 AI (如 Claude/ChatGPT) 進行精準的「廣東話情緒指標」批量分析嗎?
#Q: 但我可以怎樣自定要監察的關鍵字?
#Q: 我想把關鍵字置於外部.csv文件中,並且程式可以自動每次只執行其中任意N個關鍵字。
#A: 這個想法非常聰明!將關鍵字與程式碼分離(Decoupling),不僅方便你隨時用 Excel 修改關鍵字列表,還能透過「每次隨機抽 N 個」的策略,徹底打亂爬蟲的行為模式,讓連登和 Threads 的防爬蟲系統(Cloudflare)完全無法抓到你的定時規律。
以下是為你修改後的完整 Cursor 程式碼。它會自動讀取外部的 keywords.csv,隨機抽取 N 個執行,並會溫馨提示你今天測試了哪些詞。
#第一步:在同一個資料夾內,建立 keywords.csv 檔案
你可以直接在 Cursor 中新建一個名為 keywords.csv 的檔案,或者用 Excel 寫好後儲存為 CSV(格式如下,只需一列,頂部一定要有 keyword 這個 Header):
keyword
爆煲
頂唔順
裸辭
返工返到抑鬱
個人好頹
星期日焦慮
射波
奴工
想死
炒老闆魷魚
#第二步:更新後的 Python 程式碼 (hk_burnout_monitor.py)
請將原來的程式碼全部替換為以下優化版。程式碼中加入了隨機抽樣邏輯(random.sample),並設定了 N_KEYWORDS 變數供你自由調整。
import asyncio
import random
import time
import os
import pandas as pd
from playwright.async_api import async_playwright
# === 參數設定 ===
CSV_KEYWORDS_FILE = "keywords.csv" # 外部關鍵字檔案名稱
N_KEYWORDS = 3 # 每次執行隨機抽取的關鍵字數量 (N)
# 1. 反爬蟲核心配置:模擬真實人類行為的延遲函數
async def human_delay(min_sec=2, max_sec=5):
await asyncio.sleep(random.uniform(min_sec, max_sec))
# 2. 連登 (LIHKG) 抓取模組
async def scrape_lihkg(page, keyword):
print(f"🕵️ [LIHKG] 正在搜尋: {keyword}...")
search_url = f"https://lihkg.com{keyword}"
try:
await page.goto(search_url, wait_until="networkidle")
await human_delay(3, 6)
posts = []
selectors = await page.query_selector_all('a[href^="/thread/"]')
if not selectors:
selectors = await page.query_selector_all('div[class*="_28Y0m"]')
for selector in selectors[:15]:
try:
title = await selector.inner_text()
url = await selector.get_attribute("href")
full_url = f"https://lihkg.com{url}" if url and not url.startswith("http") else url
if title:
posts.append({
"Platform": "LIHKG",
"Keyword": keyword,
"Title/Content": title.strip().replace("\n", " "),
"URL": full_url,
"Timestamp": time.strftime("%Y-%m-%d")
})
except Exception:
continue
return posts
except Exception as e:
print(f"⚠️ 連登抓取超時或失敗: {e}")
return []
# 3. Threads 抓取模組
async def scrape_threads(page, keyword):
print(f"🕵️ [Threads] 正在搜尋: {keyword}...")
search_url = f"https://threads.net{keyword}"
try:
await page.goto(search_url, wait_until="networkidle")
await human_delay(4, 7)
for _ in range(3):
await page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
await human_delay(1.5, 3)
posts = []
selectors = await page.query_selector_all('span')
for selector in selectors:
try:
text = await selector.inner_text()
if len(text) > 15: # 簡化過濾,後續靠 AI 篩選
posts.append({
"Platform": "Threads",
"Keyword": keyword,
"Title/Content": text.strip().replace("\n", " "),
"URL": search_url,
"Timestamp": time.strftime("%Y-%m-%d")
})
except Exception:
continue
seen = set()
unique_posts = []
for p in posts:
if p["Title/Content"] not in seen:
seen.add(p["Title/Content"])
unique_posts.append(p)
return unique_posts[:15]
except Exception as e:
print(f"⚠️ Threads 抓取超時或失敗: {e}")
return []
# 4. 主程序:自動讀取外部 CSV 並隨機抽樣
async def main():
# 檢查外部 CSV 是否存在
if not os.path.exists(CSV_KEYWORDS_FILE):
print(f"❌ 錯誤:找不到外部關鍵字檔案 '{CSV_KEYWORDS_FILE}',請先建立該檔案。")
return
try:
# 讀取 CSV 中的關鍵字
df_keywords = pd.read_csv(CSV_KEYWORDS_FILE, encoding="utf-8-sig")
all_keywords_list = df_keywords['keyword'].dropna().astype(str).tolist()
all_keywords_list = [k.strip() for k in all_keywords_list if k.strip()]
except Exception as e:
print(f"❌ 讀取 CSV 檔案失敗,請檢查 Header 是否為 'keyword'。錯誤原因: {e}")
return
if not all_keywords_list:
print("❌ 關鍵字列表為空,請在 CSV 中加入關鍵字。")
return
# 自動計算 N 的有效值,防止 N 大於關鍵字總數
actual_n = min(N_KEYWORDS, len(all_keywords_list))
# 🌟 核心邏輯:隨機抽取任意 N 個關鍵字
selected_keywords = random.sample(all_keywords_list, actual_n)
print(f"🎯 關鍵字總數: {len(all_keywords_list)} 個。本次隨機抽取 {actual_n} 個執行監控。")
print(f"📋 今日監控詞清單: {selected_keywords}\n")
all_results = []
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=False,
args=["--disable-blink-features=AutomationControlled"]
)
page = await browser.new_page()
await page.set_extra_http_headers({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept-Language": "zh-HK,zh;q=0.9,en-US;q=0.8,en;q=0.7"
})
for kw in selected_keywords:
# 抓取連登
lihkg_data = await scrape_lihkg(page, kw)
all_results.extend(lihkg_data)
await human_delay(5, 12)
# 抓取 Threads
threads_data = await scrape_threads(page, kw)
all_results.extend(threads_data)
await human_delay(5, 12)
await browser.close()
# 5. 導出結果
if all_results:
df_output = pd.DataFrame(all_results)
df_output.drop_duplicates(subset=["Title/Content"], inplace=True)
output_file = f"hk_burnout_listening_{time.strftime('%Y%m%d')}.csv"
# 如果當天多次執行,自動追加(Append)而不是覆蓋,方便累積數據
if os.path.exists(output_file):
df_existing = pd.read_csv(output_file, encoding="utf-8-sig")
df_combined = pd.concat([df_existing, df_output], ignore_index=True)
df_combined.drop_duplicates(subset=["Title/Content"], inplace=True)
df_combined.to_csv(output_file, index=False, encoding="utf-8-sig")
print(f"\n📊 數據已追加!總共累積: {len(df_combined)} 條有機數據 ──> {output_file}")
else:
df_output.to_csv(output_file, index=False, encoding="utf-8-sig")
print(f"\n📊 新報告生成成功!已儲存至: {output_file} (共 {len(df_output)} 條數據)")
else:
print("\n❌ 本次抽取未抓取到有效新數據。")
if __name__ == "__main__":
asyncio.run(main())
#🛠️ 你可以怎樣微調這段程式碼?
- 想改每次抽多少個詞?
修改第 8 行 的
N_KEYWORDS = 3。例如你想每次只低調跑 1 個,就改成 1;想跑 5 個就改成 5。 - 想隨時加減關鍵字? 你完全不用動 Cursor。直接雙擊打開目錄下的 keywords.csv,在最下面加一行廣東話(如 返工想喊),儲存。下次執行程式時,這個新詞就會自動加入隨機抽獎池。
- 多次執行的好處:
我在最後加入了自動追加(Append)機制。如果你中午跑一次(抽了 3 個詞),晚上跑一次(抽了另外 3 個詞),它們會自動整齊地合併到當天同一個
hk_burnout_listening_2026xxxx.csv檔案內,不會互相覆蓋!
現在你可以在 keywords.csv 裡塞滿你需要的香港口語,然後在 Cursor Terminal 輸入 python hk_burnout_monitor.py 測試一下。 當你有了這個自動收集的 CSV 檔案,下一步你想了解如何將抓取到的這幾百行廣東話「無痛、免費」地交給大型 AI 進行主題分類與情感標籤嗎?
#Q: 好的,請指導。
#A: 當你運行上述程式碼幾天後,你的電腦裡會累積一個或多個含有數百條廣東話留言的 CSV 檔案。
因為這是公益研究,我們可以使用免費、高隱私度且支援大檔案上傳的 AI 平台(例如免費版的 Claude 3.5 Sonnet 或 ChatGPT-4o)來進行批量的語意與情緒分析。 以下是為你設計的「無痛、免費」AI 分析工作流:
#📥 準備工作:將數據轉換為 AI 最愛的格式
雖然 AI 支援上傳 CSV,但有時因為 Excel 的編碼問題,廣東話可能出現亂碼。最穩妥的做法是:
- 用 Excel 打開你抓好的
hk_burnout_listening_xxxx.csv。 - 檢查數據,刪除明顯是廣告的整行(如有漏網之魚)。
- 全選並複製 Title/Content(即留言內容) 那一欄。
- 打開一個記事本(Notepad / TextEdit),將內容貼上,儲存為 comments.txt。
#💬 核心步驟:投餵專用 AI Prompt(情感與主題分析)
打開免費版的 Claude 3.5 Sonnet 或 ChatGPT,將你的 comments.txt 拖進對話框,或者直接將文字貼進去,並在頂部或底部附上以下這段專門調教過的「廣東話 Burnout 分析器」提示詞:
你是一位精通香港職場文化與心理健康的社會科學專家。
請分析附件中從香港討論區/Threads抓取的打工仔廣東話留言,完成以下公益研究分析任務:
1. 【整體情緒溫度計】
請統計並將所有留言分類為以下四種 Burnout 嚴重程度,並給出百分比估算及核心原因簡述:
- 輕度焦慮(返工攰、日常抱怨)
- 中度爆煲(明顯對管理層憤怒、長期失眠、星期日焦慮)
- 重度耗竭(有實質行動:準備裸辭、射波、尋求輔導)
- 急需援助(文字透露極度絕望、有自殘或放棄生命傾向 —— *註:此項如發現請特別標出*)
2. 【三大 Burnout 核心源頭】
根據留言文本,歸納出導致香港打工仔 Burnout 的前三大核心原因(例如:長工時、有毒管理、薪酬與付出不成正比等),並為每項原因提供 2-3 句具體的廣東話留言作為佐證(Quote)。
3. 【香港本土 Burnout 行為詞典】
請列出文本中網民用來表達 Burnout 的最頻繁香港口語/流行語(例如:射波、SL、頹、爆煲),並解釋他們在使用這些詞時背後的真實心理狀態。
請以結構清晰的 Markdown 格式、繁體中文(香港地區習慣用語)輸出這份公益研究分析簡報。
#📊 進階玩法:完全本地自動化(利用 Cursor / Python + 免費 API)
如果你不想每次手動複製貼上,且擁有免費的 AI API Key(例如 Gemini Flash 的免費額度,或本地運行的 Ollama + Llama3),你可以讓 Cursor 幫你寫一個 analyze_burnout.py。
#💡 給 Cursor 的 Prompt:
"請幫我寫一個 Python 腳本。它會讀取 hk_burnout_listening_xxxx.csv 中的 Title/Content 欄位,將所有文本打包,並呼叫 API(例如免費的 Google Gemini API 或是 OpenAI 相容的本地 API),將我提供的 Prompt(貼上方的 Markdown Prompt)發送出去,最後將 AI 生成的分析報告自動儲存為一個 burnout_report_xxxx.md 的文字檔。"
這樣,你的全套 Social Listening 工作流就完美閉環了: 外部 CSV 關鍵字 ──> Playwright 真人模擬爬取 ──> 本地 CSV 自動累積 ──> AI 批量處理與情感標籤。
如果想讓你的公益研究報告更有說服力,接下來我們可以:
- 討論如何將 AI 分析出來的百分比數據,匯入免費的 Orange Data Mining 或 Excel 繪製成圖表
- 或者是優化爬蟲腳本,讓它能夠自動抓取每條貼文的「讚好/倒讚(Likes/Dislikes)」數量,以此來加權計算某種情緒在香港網民中的共鳴程度。
你希望朝哪個方向繼續深化這個項目?