爬取微信公众号文章
角色设定 你是一位资深Python爬虫工程师,擅长处理反爬机制和动态内容抓取,熟悉微信公众号文章的网页结构及常见的反爬策略(如动态加载、签名验证等)。
任务目标
编写一个Python脚本,从公开的微信公众号文章分享链接(如浏览器可直接访问的URL)中爬取文章的全部文字内容和图片,并将结果保存为符合Markdown规范的文件(.md
格式)。
输入
- 一个公开的微信公众号文章分享链接(示例):
https://mp.weixin.qq.com/s/Rsa54LdbyhXIHheJYO6gkw
(该链接可通过浏览器直接打开并完整浏览文章内容,无需登录或权限)
输出要求
文件格式
保存为标准的Markdown文件(
1
.md
),需包含以下结构:
- 文章的全部文字内容(保留原文段落、标题、列表等格式)。
- 文章中的所有图片(以Markdown图片语法嵌入,例如:

)。 - 图片需下载到本地并保存到与Markdown文件同目录的
images
子文件夹中(图片文件名建议用序号或原URL哈希值命名,避免中文乱码)。
文件命名规则
文件名格式为:
1
发表日期-文章标题.md
- 发表日期:从文章页面提取的原始发布日期(格式:
YYYY-MM-DD
,例如:2025-02-11
)。 - 文章标题:从文章页面提取的原始标题(需去除非法文件名字符,如
/ \ : * ? " < > |
等)。
- 发表日期:从文章页面提取的原始发布日期(格式:
目录结构示例
1 2 3 4 5 6
./ ├── 2025-02-11-微信公众号文章标题.md # 主Markdown文件 └── images/ # 图片子文件夹 ├── 001.jpg ├── 002.png └── ...
技术细节要求
- 反爬处理
- 微信公众号文章可能存在反爬机制(如动态签名、加密参数、登录验证等)。需确保脚本能稳定抓取公开分享链接的内容(无需模拟登录)。
- 若遇到动态加载内容(如图片懒加载),需通过分析网页源码或网络请求(如XHR/Fetch)定位真实数据接口或直接提取HTML中的内容。
- 内容提取
- 文字内容:提取文章正文的全部文本(包括标题、段落、列表、引用等),需保留原文的排版逻辑(如分段、加粗、斜体等可通过Markdown语法实现)。
- 图片内容:提取文章中插入的所有图片(包括正文内嵌图片和可能的封面图),并下载到本地后通过Markdown语法引用。
- 健壮性
- 脚本需处理常见异常(如链接无效、文章被删除、网络超时、反爬拦截等),并给出明确的错误提示(例如:
无法访问链接:XXX
或文章内容提取失败:XXX
)。 - 支持通过命令行参数或函数输入的方式传入目标链接(例如:
python script.py "https://mp.weixin.qq.com/s/XXX"
)。
- 脚本需处理常见异常(如链接无效、文章被删除、网络超时、反爬拦截等),并给出明确的错误提示(例如:
- 依赖库
- 可使用主流Python库(如
requests
、BeautifulSoup
、re
、os
、datetime
等),若需处理动态渲染内容(如Selenium或Playwright),需说明理由。
- 可使用主流Python库(如
附加说明
- 若文章内容依赖JavaScript动态加载(如部分图片或文本通过前端渲染),需明确分析方法(如通过浏览器开发者工具抓包定位接口)。
- 图片下载需确保文件名合法(避免中文或特殊字符导致保存失败),建议用哈希值或序号命名(如
img_001.jpg
)。 - 最终脚本需可直接运行(提供完整代码,包括必要的注释和异常处理逻辑)。
示例输出(Markdown文件内容)
1
2
3
4
5
6
7
8
9
10
11
12
# 公众号文章标题
这是文章的第一段文字内容。
## 小标题
- 列表项1
- 列表项2

这是文章的结尾段落。
非常好!你希望一步一步地手动敲代码,逐步解决“爬取微信公众号文章并保存为 Markdown”这个需求,这是一个非常合理、有利于深入理解的学习方式 👍。
✅ 总体目标回顾
输入:一个微信公众号文章的公开分享链接(如
https://mp.weixin.qq.com/s/xxx
) 输出:将该文章的 文字内容 + 图片 爬取下来,保存为一个 Markdown 文件,文件名格式为:发表日期-文章标题.md
为了让你能够清晰、可操作、逐步实现,我将整个流程拆解为 6 个步骤(6个 Py 脚本阶段),每个步骤解决一个明确的小问题,你可以一步一步地编写、运行、测试,最终整合起来。
🧩 步骤 1:基础框架 —— 获取输入链接并保存为 Markdown(空模板)
🎯 目标:
搭建项目结构,接收用户输入的微信公众号文章链接,创建一个最基本的 Python 脚本框架,并生成一个只有标题和链接的 Markdown 文件(内容暂时为空,后续再填充)。
✅ 步骤 1 代码:step1_basic_framework.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import os
import re
import sys
from datetime import datetime
def clean_filename(name):
"""清除文件名中的非法字符"""
return re.sub(r'[\\/*?:"<>|]', '_', name)
def main():
# 提示用户输入微信公众号文章链接
url = input("请输入微信公众号文章链接(例如:https://mp.weixin.qq.com/s/xxxxx): ").strip()
if not url.startswith('https://mp.weixin.qq.com/s/'):
print("❌ 错误:请输入正确的微信公众号文章链接,应以 https://mp.weixin.qq.com/s/ 开头")
return
# 暂时模拟提取到的数据(后续步骤会真正爬取)
title = "示例文章标题(待爬取)"
date = datetime.now().strftime('%Y-%m-%d') # 暂时用当前日期,后续会爬取真实日期
# 清理文件名
safe_title = clean_filename(title)
filename = f"{date}-{safe_title}.md"
filepath = os.path.join('.', filename)
# 生成简单的 Markdown 内容
md_content = f"""# {title}
> **原文链接**: {url}
>
> **发表日期**: {date}
<!-- 正文内容与图片待爬取 -->
"""
# 保存 Markdown 文件
try:
with open(filepath, 'w', encoding='utf-8') as f:
f.write(md_content)
print(f"✅ 已生成 Markdown 文件(模板): {filepath}")
print("📌 下一步:我们将逐步爬取文章标题、日期、正文和图片,替换这个模板内容。")
except Exception as e:
print(f"❌ 保存文件失败: {e}")
if __name__ == '__main__':
main()
✅ 运行方式:
- 将上述代码保存为
step1_basic_framework.py
- 在终端运行:
1
python step1_basic_framework.py
- 输入一个微信公众号文章链接,例如:
1
https://mp.weixin.qq.com/s/Rsa54LdbyhXIHheJYO6gkw
- 脚本会在当前目录下生成一个 Markdown 文件,如:
1
2024-06-01-示例文章标题(待爬取).md
内容大致为:
1
2
3
4
5
6
7
# 示例文章标题(待爬取)
> **原文链接**: https://mp.weixin.qq.com/s/...
>
> **发表日期**: 2024-06-01
<!-- 正文内容与图片待爬取 -->
这是一个模板文件,接下来的步骤,我们将逐步用真实爬取到的 标题、日期、正文、图片 来替换它!
🧠 本步骤你学会了什么?
- 如何接收用户输入的微信公众号文章链接;
- 如何对文件名进行清理,避免非法字符;
- 如何生成一个最基本的 Markdown 文件模板;
- 下一步我们将逐步实现:爬取文章标题、发布日期、正文内容、图片,并填充到这个模板中。
✅ 下一步:步骤 2 —— 爬取文章标题和发布日期
我们将使用 requests
和 BeautifulSoup
尝试从页面中提取 文章标题 和 发布日期,并替换模板中的占位内容。
🔔 当你完成了本步骤的运行和理解后,请回复我 “继续步骤 2”,我将继续给你提供:
✅ 步骤 2:爬取文章标题与发布日期(用 requests + BeautifulSoup,解析公开 HTML)
你也可以选择在之后继续进阶到:
- 步骤 3:尝试提取正文内容(可能失败,因为未渲染)
- 步骤 4:用 Selenium 渲染真实页面并提取正文和图片
- 步骤 5:下载图片并生成 Markdown
- 步骤 6:整合所有功能,形成完整可运行脚本
🎯 现在请你:
- 复制上面的 步骤 1 代码
- 保存为
step1_basic_framework.py
- 运行它并输入一个公众号文章链接
- 观察生成的 Markdown 模板文件
- 然后回复我:“继续步骤 2”
我将继续带你爬取真正的 文章标题和发布日期! 🚀