前阵子想批量存一批公众号文章,发现事情没那么简单。
微信公众号文章不像普通网页,直接 curl 或者 requests 请求,大概率给你弹一个滑块验证码。验不过就拿不到内容。验过了?频率一高,滑块又来了。
我花了一周时间,把市面上能搜到的方案全试了一遍。浏览器手动复制、Python + 代理 IP、Selenium 自动化、抓包逆向 API、第三方 SaaS 服务,还有一个在 V2EX 上看到的极简方案——UA 伪装法。
结论先放这儿:如果你只是想稳定抓取公开文章,UA 伪装是性价比最高的方案。 没有之一。
一条 curl 的魔法
事情起因是 V2EX 上一个帖子。有人说微信文章只要把 User-Agent 改成微信内置浏览器的标识,就能直接拿到完整 HTML,不用 Cookie、不用登录、不用代理。
我一开始不太信。试了一下:
curl -sL \
-H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.34(0x16082222) NetType/WIFI Language/zh_CN" \
"https://mp.weixin.qq.com/s/xxxxxx"
结果真的拿到了完整页面。
没有滑块,没有重定向,没有"请在微信中打开"。就是这么朴实无华。
后来想了一下原理,其实很简单。微信公众号文章的反爬策略主要靠三板斧:
- 检查 User-Agent 里有没有
MicroMessenger这个关键字 - 没有的话,弹滑块验证码
- 频率太高了,再考虑 IP 限制
换句话说,它的"反爬"本质上不是反机器人,而是只允许微信生态内的流量。你只要在 UA 里声明自己是微信客户端,服务器就放你过去。这层验证形同虚设,但偏偏就是挡住了大多数爬虫。
如果你用 OpenClaw 或者类似的 Agent 框架,可以把这套逻辑封装成一个 Skill,以后直接调用。
为什么这个方案能「降维打击」?
让我们把它和常见方案做个对比,你就知道它有多优雅了。
方案一:浏览器手动复制
最原始的办法——打开文章,Ctrl+A 全选,复制粘贴。
零门槛,不需要写任何代码。但你要是想存个几十篇,这个体力活能把你干废。而且频繁手动操作一样会触发滑块。
结论:偶尔存一两篇可以,批量别想了。
方案二:Python requests + 代理 IP 池
这是中文互联网上搜到最多的方案。思路是:请求被拦了就换代理 IP 重试。
能跑通,但问题不少。首先代理 IP 要钱,质量好的住宅代理一个月几十到几百块。其次滑块识别在不断升级,换了代理不一定能绕过,还得配合打码服务。整个链路又贵又脆。
结论:适合有预算的大规模采集团队,个人用完全是杀鸡用牛刀。
方案三:Selenium / Playwright 模拟浏览器
启动一个真实浏览器实例,模拟人的操作去加载页面、提取内容。
优点是能执行 JavaScript,拿到渲染后的完整 DOM。但代价很明显:每个实例吃 200MB 左右内存,速度慢(每次要等页面加载),而且现在不少网站都有自动化指纹检测,Selenium 容易被识别出来。滑块验证也不一定能自动过,可能还得接第三方打码。
结论:如果你需要登录、需要滚动加载、需要复杂交互,这是唯一选择。但如果只是抓个文章 HTML,太重了。
方案四:抓包逆向 API 接口
用 Charles 或 Fiddler 抓微信客户端的真实请求,提取 API 参数,然后模拟调用。
好处是能直接拿到结构化数据,不用解析 HTML。但坏处更突出:逆向成本高,参数经常变,Cookie 和 Token 会过期,需要持续维护。本质上是在跟微信的安全团队打持久战。
结论:适合需要长期稳定数据管道的团队,普通需求没必要搞这么复杂。
方案五:第三方 SaaS 服务
各种"微信文章采集器""公众号数据平台",开箱即用。
省事是真省事,但问题也不少——费用不低,数据质量和时效没保证,而且你把命脉交给了第三方。哪天服务挂了或者涨价了,你只能干瞪眼。
结论:非技术团队的轻量需求可以考虑,但别把核心业务绑在上面。
方案对比一张表
| 方案 | 成本 | 技术门槛 | 绕滑块 | 速度 | 稳定性 | 适合谁 |
|---|---|---|---|---|---|---|
| UA 伪装 | 免费 | 极低 | ✅ 天然绕 | 极快 | 中 | 个人/小团队 |
| 代理 IP | 中 | 低 | ❌ 不一定 | 中 | 中 | 中大规模 |
| 自动化浏览器 | 低 | 中 | ⚠️ 可能触发 | 慢 | 高 | 复杂交互 |
| API 逆向 | 低 | 高 | ✅ 模拟真实 | 快 | 低 | 长期数据流 |
| 第三方服务 | 高 | 无 | ✅ 对方搞定 | 不定 | 中 | 非技术团队 |
| 手动复制 | 免费 | 无 | ⚠️ 会触发 | 极慢 | 低 | 偶尔用用 |
最后说几句实话
关于风险,别装看不见:
- 频率要克制。别开着脚本一秒十条地请求,迟早被封 IP。加个随机延迟,一两秒间隔足够。
- 微信随时可能改策略。今天能用不代表明天能用。如果哪天 UA 伪装失效了,说明微信把这个洞堵上了——到时候再找新方案。
- 抓取不等于拥有版权。你可以存档、分析、做内部参考,但别直接搬运到自己的公众号上。
- 合规底线。大规模商业抓取有法律风险,个人学习研究用没问题,别越界。
说到底,UA 伪装法的价值不在于它有多"高级",而在于它够简单。简单到你不需要装任何依赖、不需要买任何服务、不需要维护任何基础设施,一条命令就能开始干活。
搞技术这些年我最大的体会就是:最优雅的方案往往不是最复杂的那个,而是刚好够用的那个。