wechat-article-fetch · 公眾號文章抓取
核心事實(已實測,直接執行)
- UA 是唯一準入門檻:使用腳本內建瀏覽器 UA。不帶 UA / curl / python-requests / MicroMessenger → 全部 302
- 正文極易取得:服務端渲染,位於
<div id="js_content">,裸 GET 即可,無需 JS/Cookie/登入 - 圖片無防盜鏈:真實位址在
data-src - 發現層:原文不被搜尋引擎收錄;搜狗提供加密跳轉鏈,清潔態純 HTTP 可拆簽名直鏈(視窗≥1h,儘快抓);⚠️ 連續約 15~20 請求/30 分鐘觸發 IP 級驗證碼(需人工,瀏覽器無解)→ 低頻率串行,觸發即停
UA 範例(自行寫腳本時用):Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
用法(腳本同目錄,零依賴,CLI+庫雙模式,錯誤結構化 WeChatError)
python wechat_fetch.py "<url>" [--format md|json|text] [--out FILE] # 抓正文
python wechat_discover.py "關鍵詞" [--format table|json] # 搜元資料(跳轉鏈拆法見通道狀態)
python batch_fetch.py urls.txt [--min-delay 3] [--max-delay 8] [--daily-limit 500] # 批量:限速/斷點續傳/驗證碼停機
通道狀態(2026-08 實測,防止誤用死路)
| 通道 | 狀態 |
|---|---|
| 公開文章頁裸抓 | ✅ 長期穩定(本技能核心) |
| 搜狗搜尋 | ✅ 僅近期元資料(清潔態);跳轉鏈純 HTTP 拆簽名 URL(視窗≥1h,儘快抓);⚠️ 連續~15-20請求/30分鐘觸發IP驗證碼,需人工 |
| 合集(專輯)頁 | ⚠️ 匿名可翻,僅合集內文章 |
| 公眾號主頁歷史列表 | ❌ 匿名被攔「請在微信客戶端開啟連結」;getmsg 僅最近 ~10 篇 |
| 公眾號後台跨號搜尋 | ❌ 已死(2026-07-30 微信關閉,行業工具全癱) |
結論:抓取層穩定;發現層上限 = 搜狗近期 + 合集(⚠️ 動態頻控,低頻率);全量歷史無合規通道。
流程
- 已有連結 → GET(瀏覽器 UA)→ 取
#js_content→ 輸出。失敗按分診表,勿盲重試 - 只有關鍵詞 → 搜狗拿元資料;要正文則純 HTTP 拆跳轉鏈 JS 拼串拿簽名 URL回抓取流程(失敗/觸發反爬再瀏覽器兜底;或找轉載鏡像,須告知使用者可能被刪改)。主頁歷史、後台搜尋不要嘗試(已死/被攔)
解析(僅自行寫正則時需要,直接用腳本可跳過)
錨點:var msg_title / nickname / ct + #js_content。⚠️ msg_title/nickname 有 .html(false)/htmlDecode() 套殼——正則只匹配等號後第一個引號串,否則全部抽空;圖片取 data-src 而非 src。
失敗分診(不要盲目重試)
| 現象 | 原因 | 動作 |
|---|---|---|
| 302 | UA 不合格 | 換瀏覽器 UA |
| 200 + 參數錯誤 | 連結無效 | 停,核對連結 |
| 302 → antispider | 搜狗側攔截(IP級驗證碼,2026-08-13實測需人工) | 停止,不繞;低頻率重試或等待恢復(瀏覽器同樣被攔) |
| 302 → appmsgcaptcha | 連結異常/觸發驗證碼 | 停止,不繞過 |
| 200 + 該頁面不存在 | UA 被判為爬蟲 | 換瀏覽器 UA |
| 200 + 請在微信客戶端開啟 | 需登入的頁面 | 該通道不可用,換搜狗/合集 |
| 200 + 已刪除/違規 | 文章被處理 | 跳過,記錄原因 |
硬約束(違反即停)
- 不碰登入態:個人微信/公眾號後台 Cookie、掃碼態一律不用(封號 + 違約)
- 不繞過驗證碼:觸發即整體停止(繞過技術措施是中國刑法 285 條紅線)
- 不規模化採集:robots 整站 Disallow,定位個人研究小量取用;串行 + 秒級間隔,單日 ≤500 篇
- 不商用不傳播:文章受著作權保護,個人學習研究屬合理使用(前提:不傳播、不商用、保留署名)
- 發現層受動態頻控管制(2026-08-13 實測:
1520 請求/30 分鐘觸發 IP 驗證碼,小時級未自動解除):低頻串行(建議 ≤10 次/30 分鐘),觸發即整體停止,等待恢復,不得嘗試繞過