/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
结论先行
合法提取单篇微信公众号文章内容,核心就三点:
一、为什么选择单篇解析方案
批量爬取微信公众号文章的“捷径”正在被全面封堵。腾讯在官网设置了 robots.txt 明确禁止爬虫抓取 ,多地法院已对爬取公众号数据的行为作出不正当竞争判决,判赔金额从几十万到数百万不等 。
单篇解析不同。 它的场景是:用户主动复制一篇文章链接,通过工具完成格式转换(HTML → Markdown)。不涉及批量采集、不建立数据库、不对外提供数据服务。这在法律上的风险远低于“爬取所有文章”。
二、核心工具:wechat-article-parser
wechat-article-parser 是一个专门用于解析单篇公众号文章的 Python 库,安装简单,使用极简 。
安装
pip install wechat-article-parser
依赖自动安装:httpx、beautifulsoup4、markdownify。Python 版本要求 ≥ 3.10 。
基础用法:三行代码搞定
from wechat_article_parser import parse
result = parse("https://mp.weixin.qq.com/s/xxxxx")
print(result.article_title)
print(result.article_markdown)
parse() 返回一个 ArticleResult 对象,包含以下关键字段 :
| article_title | 文章标题 |
| article_markdown | 正文 Markdown 格式 |
| article_publish_time | 发布时间(Unix 时间戳) |
| mp_name | 公众号名称 |
| images | 文章中所有图片链接 |
| is_valid | 解析是否成功 |
异步调用
如果你在异步环境中使用:
from wechat_article_parser import parse_async
result = await parse_async("https://mp.weixin.qq.com/s/xxxxx")
常用参数
result = parse(
"https://mp.weixin.qq.com/s/xxxxx",
timeout=30, # 超时时间(秒),默认 15
include_raw_html=False, # 是否返回原始 HTML
proxy=None, # 需要代理时传入
)
三、完整实战脚本
以下是一个“复制链接 → 运行脚本 → 得到 Markdown 文件”的完整示例:
# save_article.py
import sys
from pathlib import Path
from wechat_article_parser import parse
def save_article(url: str, output_dir: str = "./articles"):
"""提取单篇公众号文章并保存为 Markdown"""
result = parse(url)
if not result.is_valid:
print("解析失败,请检查链接是否有效")
return
output = Path(output_dir)
output.mkdir(parents=True, exist_ok=True)
# 用标题作为文件名(去除非法字符)
safe_title = "".join(c for c in result.article_title if c not in r'\\/:*?"<>|')
filepath = output / f"{safe_title}.md"
with open(filepath, "w", encoding="utf-8") as f:
f.write(f"# {result.article_title}\\n\\n")
f.write(f"> 公众号:{result.mp_name}\\n\\n")
f.write(result.article_markdown)
print(f"已保存:{filepath}")
print(f"图片数量:{len(result.images)}")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("用法:python save_article.py <公众号文章链接>")
sys.exit(1)
save_article(sys.argv[1])
使用方式:
python save_article.py "https://mp.weixin.qq.com/s/xxxxx"
运行后,./articles/ 目录下会生成对应的 Markdown 文件。
四、合规边界(必须遵守)
合法提取单篇文章的前提条件:
| 用户主动提供链接,单篇解析 | 批量抓取某个公众号的所有文章 |
| 个人学习、研究、存档 | 对外提供数据服务或商业使用 |
| 控制访问频率(每篇间隔数秒) | 高频并发请求,给服务器造成压力 |
| 解析后仅本地保存 | 将内容公开发布、二次分发 |
法律依据很明确:法院在相关判例中指出,“允许数据抓取是为了保障公众获取信息,不意味着允许营利性商用” 。单篇解析属于“用户自行访问并保存”的合理范畴,但一旦变成批量采集或商业利用,性质就完全不同了。
五、常见问题
Q:解析失败怎么办?
微信有反爬机制,偶尔会拒绝请求。等待几分钟后重试即可,不要频繁重试 。
Q:能提取图片吗?
result.images 返回所有图片链接,但微信图片有防盗链,直接下载可能失败。需要额外处理 Referer 头。
Q:能解析视频号内容吗?
wechat-article-parser 支持视频分享类文章,但视频文件本身需要单独处理 。
Q:有没有其他替代工具?
WeSpy 也支持单篇解析和 Markdown 导出,且有命令行界面 。wechat-article-parser 的优势是 API 更简洁、返回字段更完整。
总结
合法提取单篇公众号文章,技术上的核心就是一个库:wechat-article-parser。三行代码拿到 Markdown 正文,字段齐全,安装即用。
真正的门槛不在技术,而在场景界定:用户给链接、你给解析、本地保存、不碰批量、不碰商用。守住这条线,这个工具就是一个实用的“文章格式转换器”,而不是一个高风险的数据采集器。



