一個用於抓取 Threads 社群平台內容的 Python 爬蟲工具,專門設計用來收集和分析投資相關貼文內容。
- 🔐 智能登入檢測 - 自動偵測登入狀態並提示手動登入
- 🛡️ 防反爬機制 - 隨機延時、User-Agent 偽裝、分批休息
- 🔄 自動補抓系統 - 智能檢測異常內容並生成補抓清單
- 📊 品質控制 - 自動去重、異常檢測、成功率統計
- 🤖 NotebookLM 整合 - 直接輸出適合 AI 分析的格式
- 總抓取量: 447 篇貼文
- 成功率: 87.7%
- 有效內容: 383 篇
- 總字數: 33 萬字
- 平均長度: 1,609 字元/篇
pip install -r requirements.txt
pip install -r requirements.txt
python src/threads_batch_spider.py
- 程式會自動開啟 Chrome 瀏覽器
- 手動登入 Threads 帳號
- 確認登入成功後按 Enter
- 程式自動開始抓取內容
- 完成後輸出 CSV 檔案
threads_batch_spider.py- 完整版爬蟲(推薦使用)threads_post_content_crawler.py- 簡化版爬蟲
all_threads_urls_first_crawl.csv- 所有貼文網址清單make_investment_easy_threads_main_posts.csv- 原始抓取結果make_investment_easy_threads_main_posts_clean.csv- 清理後的資料threads_for_notebooklm.csv- NotebookLM 專用格式threads_urls_to_refetch.csv- 需要補抓的網址清單
Bai-Hua-Tou-Zi-ThreadsNei-Rong.txt- 純文字格式,適合 AI 分析
if "登入" in driver.page_source or "Login" in driver.page_source: print(f"[ERROR] 需重新登入: {url}") return "LOGIN_REQUIRED"
time.sleep(random.uniform(10, 18)) # 隨機延時 if (idx + 1) % 20 == 0: time.sleep(120) # 每20篇休息2分鐘
def detect_empty_posts(input_csv, output_csv): error_conditions = ["", "LOGIN_REQUIRED", "NO_TEXT_FOUND", "nan"] empty_urls = df[df["post_text_and_replies"].isin(error_conditions)] empty_urls.to_csv(output_csv)
- ✅ 有效內容: 392 篇 (87.7%)
- ❌ 空白內容: 48 篇
- ❌ 登入失效: 7 篇
- 平均長度: 1,609 字元
- 最長內容: 6,853 字元
- 重複內容: < 2%
處理後的資料可直接上傳至 Google NotebookLM:
- 使用
threads_for_notebooklm.csv或Bai-Hua-Tou-Zi-ThreadsNei-Rong.txt - 上傳至 NotebookLM 建立知識庫
- 享受 AI 問答功能
範例問題:
- "白話投資對技術分析的觀點是什麼?"
- "整理所有關於選擇權的討論"
- "分析風險管理的核心要點"
原因: 未在 Selenium 開啟的瀏覽器內登入 解決: 等待提示後在自動開啟的瀏覽器視窗內手動登入
原因: 觸發反爬機制或 IP 被暫時封鎖 解決: 增加延時間隔或更換網路環境
原因: Threads 分享機制或頁面結構異常 解決: 使用內建的去重功能
詳細疑難排解請參考 troubleshooting.md
username = "your_target_account" profile_url = "https://www.threads.com/@your_target_account"
time.sleep(random.uniform(5, 10)) # 減少延時 time.sleep(random.uniform(15, 25)) # 增加延時
- 內容分析: 使用 NLP 技術分析主題分布
- 情感分析: 追蹤市場情緒變化
- 時間序列: 分析觀點演變趨勢
- 知識圖譜: 建立概念關聯網路
歡迎提交 Issue 和 Pull Request!
- Fork 專案
- 建立功能分支
- 提交變更
- 發起 Pull Request
MIT License - 詳見 LICENSE 檔案
⭐ 如果這個專案對你有幫助,請給個星星支持!
📋 requirements.txt selenium>=4.15.0 pandas>=2.0.0 requests>=2.31.0 beautifulsoup4>=4.12.0 lxml>=4.9.0
🚫 .gitignore
pycache/ *.py[cod] *$py.class *.so .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST
venv/ env/ ENV/
.vscode/ .idea/ *.swp *.swo
.DS_Store Thumbs.db
chromedriver* geckodriver*
data/raw/.csv data/processed/.csv *.txt
*.log
.env credentials.json
🔧 docs/troubleshooting.md
程式執行完成,但 CSV 檔案中只有網址,內容欄位全部空白。
- Selenium 開啟的是全新瀏覽器 session
- 與本機已登入的瀏覽器完全隔離
- 程式以「未登入」狀態訪問頁面
- 等待程式提示「請先登入...」
- 在自動開啟的瀏覽器視窗內手動登入 Threads
- 確認能看到個人主頁後按 Enter
- 不要在本機其他瀏覽器視窗登入
抓取過程中出現 HTTP ERROR 500 或被導向錯誤頁面。
- 請求頻率過高觸發反爬機制
- IP 被暫時封鎖
- 網站臨時維護
- 增加延時間隔:
time.sleep(random.uniform(15, 30)) - 更換網路環境(手機熱點)
- 稍後再試(通常 1-2 小時後自動解除)
不同網址抓到相同的貼文內容。
- Threads 分享/轉發機制
- 頁面結構動態變化
- 選擇器抓取錯誤區域
使用內建去重功能: df_clean = df.drop_duplicates(subset=['post_text_and_replies'], keep='first')
selenium.common.exceptions.WebDriverException: 'chromedriver' executable needs to be in PATH
- 安裝 Chrome 瀏覽器
- 下載對應版本的 ChromeDriver
- 將 ChromeDriver 放入 PATH 或專案目錄
- 或使用 webdriver-manager 自動管理: from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import Service
service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, options=options)
處理大量資料時記憶體不足或程式崩潰。
- 分批處理: batch_size = 50 for i in range(0, len(url_list), batch_size): batch = url_list[i:i+batch_size]
- 及時釋放記憶體: df = None # 釋放大型 DataFrame gc.collect() # 強制垃圾回收
CSV 檔案中文顯示亂碼。
使用正確的編碼格式: df.to_csv('output.csv', encoding='utf-8-sig', index=False)
import logging logging.basicConfig(level=logging.DEBUG)
if "error" in driver.page_source: driver.save_screenshot("error_page.png") with open("error_page.html", "w") as f: f.write(driver.page_source)
print(f"當前網址: {driver.current_url}") print(f"頁面標題: {driver.title}") print(f"找到區塊數: {len(blocks)}")
options.add_argument("--disable-images") options.add_argument("--disable-css")
options.add_argument("--headless")
options.add_argument("--page-load-strategy=eager") 📁 最終檔案清單 必要檔案: README.md - 專案說明
requirements.txt - 相依套件
.gitignore - 忽略檔案清單
src/threads_batch_spider.py - 主要爬蟲腳本
docs/troubleshooting.md - 疑難排解
範例資料檔案(可選): data/raw/all_threads_urls_first_crawl.csv - 網址清單範例
data/processed/threads_for_notebooklm.csv - 處理後資料範例