Post

爬取微信公众号文章

爬取微信公众号文章

角色设定 你是一位资深Python爬虫工程师,擅长处理反爬机制和动态内容抓取,熟悉微信公众号文章的网页结构及常见的反爬策略(如动态加载、签名验证等)。


任务目标

编写一个Python脚本,从公开的微信公众号文章分享链接(如浏览器可直接访问的URL)中爬取文章的全部文字内容图片,并将结果保存为符合Markdown规范的文件(.md格式)。


输入

  • 一个公开的微信公众号文章分享链接(示例): https://mp.weixin.qq.com/s/Rsa54LdbyhXIHheJYO6gkw (该链接可通过浏览器直接打开并完整浏览文章内容,无需登录或权限)

输出要求

  1. 文件格式

    • 保存为标准的Markdown文件(

      1
      
      .md
      

      ),需包含以下结构:

      • 文章的全部文字内容(保留原文段落、标题、列表等格式)。
      • 文章中的所有图片(以Markdown图片语法嵌入,例如:![图片描述](图片URL))。
      • 图片需下载到本地并保存到与Markdown文件同目录的images子文件夹中(图片文件名建议用序号或原URL哈希值命名,避免中文乱码)。
  2. 文件命名规则

    • 文件名格式为:

      1
      
      发表日期-文章标题.md
      
      • 发表日期:从文章页面提取的原始发布日期(格式:YYYY-MM-DD,例如:2025-02-11)。
      • 文章标题:从文章页面提取的原始标题(需去除非法文件名字符,如/ \ : * ? " < > |等)。
  3. 目录结构示例

    1
    2
    3
    4
    5
    6
    
    ./  
    ├── 2025-02-11-微信公众号文章标题.md       # 主Markdown文件  
    └── images/                               # 图片子文件夹  
        ├── 001.jpg  
        ├── 002.png  
        └── ...  
    

技术细节要求

  1. 反爬处理
    • 微信公众号文章可能存在反爬机制(如动态签名、加密参数、登录验证等)。需确保脚本能稳定抓取公开分享链接的内容(无需模拟登录)。
    • 若遇到动态加载内容(如图片懒加载),需通过分析网页源码或网络请求(如XHR/Fetch)定位真实数据接口或直接提取HTML中的内容。
  2. 内容提取
    • 文字内容:提取文章正文的全部文本(包括标题、段落、列表、引用等),需保留原文的排版逻辑(如分段、加粗、斜体等可通过Markdown语法实现)。
    • 图片内容:提取文章中插入的所有图片(包括正文内嵌图片和可能的封面图),并下载到本地后通过Markdown语法引用。
  3. 健壮性
    • 脚本需处理常见异常(如链接无效、文章被删除、网络超时、反爬拦截等),并给出明确的错误提示(例如:无法访问链接:XXX文章内容提取失败:XXX)。
    • 支持通过命令行参数或函数输入的方式传入目标链接(例如:python script.py "https://mp.weixin.qq.com/s/XXX")。
  4. 依赖库
    • 可使用主流Python库(如requestsBeautifulSoupreosdatetime等),若需处理动态渲染内容(如Selenium或Playwright),需说明理由。

附加说明

  1. 若文章内容依赖JavaScript动态加载(如部分图片或文本通过前端渲染),需明确分析方法(如通过浏览器开发者工具抓包定位接口)。
  2. 图片下载需确保文件名合法(避免中文或特殊字符导致保存失败),建议用哈希值或序号命名(如img_001.jpg)。
  3. 最终脚本需可直接运行(提供完整代码,包括必要的注释和异常处理逻辑)。

示例输出(Markdown文件内容)

1
2
3
4
5
6
7
8
9
10
11
12
# 公众号文章标题  

这是文章的第一段文字内容。  

## 小标题  

- 列表项1  
- 列表项2  

![图片描述](images/img_001.jpg)  

这是文章的结尾段落。  

非常好!你希望一步一步地手动敲代码,逐步解决“爬取微信公众号文章并保存为 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()

✅ 运行方式:

  1. 将上述代码保存为 step1_basic_framework.py
  2. 在终端运行:
1
python step1_basic_framework.py
  1. 输入一个微信公众号文章链接,例如:
1
https://mp.weixin.qq.com/s/Rsa54LdbyhXIHheJYO6gkw
  1. 脚本会在当前目录下生成一个 Markdown 文件,如:
1
2024-06-01-示例文章标题(待爬取).md

内容大致为:

1
2
3
4
5
6
7
# 示例文章标题(待爬取)

> **原文链接**: https://mp.weixin.qq.com/s/...
>
> **发表日期**: 2024-06-01

<!-- 正文内容与图片待爬取 -->

这是一个模板文件,接下来的步骤,我们将逐步用真实爬取到的 标题、日期、正文、图片 来替换它!


🧠 本步骤你学会了什么?

  • 如何接收用户输入的微信公众号文章链接;
  • 如何对文件名进行清理,避免非法字符;
  • 如何生成一个最基本的 Markdown 文件模板;
  • 下一步我们将逐步实现:爬取文章标题、发布日期、正文内容、图片,并填充到这个模板中。

✅ 下一步:步骤 2 —— 爬取文章标题和发布日期

我们将使用 requestsBeautifulSoup 尝试从页面中提取 文章标题发布日期,并替换模板中的占位内容。


🔔 当你完成了本步骤的运行和理解后,请回复我 “继续步骤 2”,我将继续给你提供:

✅ 步骤 2:爬取文章标题与发布日期(用 requests + BeautifulSoup,解析公开 HTML)


你也可以选择在之后继续进阶到:

  • 步骤 3:尝试提取正文内容(可能失败,因为未渲染)
  • 步骤 4:用 Selenium 渲染真实页面并提取正文和图片
  • 步骤 5:下载图片并生成 Markdown
  • 步骤 6:整合所有功能,形成完整可运行脚本

🎯 现在请你:

  1. 复制上面的 步骤 1 代码
  2. 保存为 step1_basic_framework.py
  3. 运行它并输入一个公众号文章链接
  4. 观察生成的 Markdown 模板文件
  5. 然后回复我:“继续步骤 2”

我将继续带你爬取真正的 文章标题和发布日期! 🚀

This post is licensed under CC BY 4.0 by the author.