跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonWeChat算法

Python 爬虫实战:抓取微信公众号文章内容

介绍使用 Python 抓取微信公众号文章内容的技术方案。涵盖环境配置、核心代码实现(requests、BeautifulSoup)、静态与动态数据解析、反爬策略优化及数据持久化。通过模拟请求头、Cookie 管理及代理 IP 轮换,解决访问限制问题,实现标题、正文、阅读量等字段的高效获取。

MongoKing发布于 2026/2/8更新于 2026/10/205.2K 浏览

前言

随着社交媒体内容价值的不断凸显,微信公众号作为内容创作和传播的核心载体,其文章数据的抓取与分析已成为数据分析、内容研究领域的重要需求。不同于普通网页爬虫,微信公众号内容因平台的反爬机制、数据加密及访问权限限制,抓取难度更高。本文将从技术原理、实战开发、异常处理等维度,系统讲解如何使用 Python 实现微信公众号文章内容的精准抓取,帮助开发者突破平台限制,高效获取目标数据。

摘要

本文聚焦微信公众号文章爬虫的全流程实现,核心涵盖微信公众号文章接口分析、Cookie 与 Token 鉴权处理、动态页面数据解析三大核心技术点,通过 requests 库实现 HTTP 请求、BeautifulSoup 解析 HTML 结构,结合实战案例完成文章标题、正文、发布时间、阅读量等核心字段的抓取。最终实现可复用、高稳定性的爬虫脚本,并针对反爬机制给出优化方案。

一、技术原理与环境准备

1.1 核心技术原理

微信公众号文章抓取的核心难点在于平台的访问限制:

  • 公众号文章页面需通过微信生态鉴权(Cookie、Token 验证),直接请求会返回 403/302 状态码;
  • 文章内容采用动态渲染 + 异步加载,部分字段(如阅读量、在看数)需解析接口返回的 JSON 数据;
  • 高频请求会触发 IP 封禁,需结合请求延迟、UA 伪装等反反爬策略。
1.2 环境配置
工具 / 库版本作用
Python3.8+核心开发语言
requests2.31.0发送 HTTP 请求
BeautifulSoup44.12.2解析 HTML/XML
lxml4.9.3高性能 HTML 解析器
fake-useragent1.4.0随机生成 User-Agent
环境安装命令
pip install requests beautifulsoup4 lxml fake-useragent

二、实战开发:微信公众号文章爬虫

2.1 核心思路拆解
  1. 模拟微信客户端请求头,绕过基础反爬;
  2. 获取文章页面 HTML 源码,解析静态内容(标题、作者、发布时间);
  3. 定位异步接口,抓取动态数据(阅读量、在看数);
  4. 数据清洗与持久化,输出结构化结果。
2.2 完整代码实现
import requests
import json
import time
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
from urllib.parse import urlparse

class :
     ():
        
        .ua = UserAgent()
        .headers = {
            : .ua.random,
            : ,
            : ,
            : ,
            : ,
            : ,
            
            : ,
        }
        
        .timeout = 
        
        .delay = 

     ():
        
        :
            
            time.sleep(.delay)
            response = requests.get(
                url=article_url,
                headers=.headers,
                timeout=.timeout,
                allow_redirects=
            )
            response.raise_for_status()  
            response.encoding = response.apparent_encoding  
             response.text
         requests.exceptions.RequestException  e:
            ()
             

     ():
        
        soup = BeautifulSoup(html, )
        static_data = {}
        
        title_tag = soup.find(, class_=)
        static_data[] = title_tag.get_text(strip=)  title_tag  
        
        author_tag = soup.find(, class_=)
        static_data[] = author_tag.get_text(strip=)  author_tag  
        
        time_tag = soup.find(, class_=)
        static_data[] = time_tag.get_text(strip=)  time_tag  
        
        content_tag = soup.find(, class_=)
         content_tag:
            
             useless_tag  content_tag.find_all([, , ]):
                useless_tag.decompose()
            static_data[] = content_tag.get_text(strip=, separator=)
        :
            static_data[] = 
         static_data

     ():
        
        dynamic_data = {: , : }
        :
            
            js_start = html.find()
             js_start != -:
                js_end = html.find(, js_start) + 
                js_str = html[js_start:js_end].replace(, )
                biz_info = json.loads(js_str)
                dynamic_data[] = biz_info.get(, )
                dynamic_data[] = biz_info.get(, )
         Exception  e:
            ()
         dynamic_data

     ():
        
        
        parsed_url = urlparse(article_url)
          parsed_url.scheme   parsed_url.netloc:
            ()
             
        
        html = .get_article_html(article_url)
          html:
             
        
        static_data = .parse_static_content(html)
        
        dynamic_data = .parse_dynamic_data(html)
        
        article_data = {**static_data, **dynamic_data}
         article_data

 __name__ == :
    
    spider = WeChatArticleSpider()
    
    target_url = 
    
    result = spider.run(target_url)
    
     result:
        ()
        ()
        ()
        ()
        ()
        ()
        ()
    :
        ()
WeChatArticleSpider
def
__init__
self
# 初始化请求头,模拟微信客户端
self
self
"User-Agent"
self
"Referer"
"https://mp.weixin.qq.com/"
"Accept"
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
"Accept-Language"
"zh-CN,zh;q=0.9,en;q=0.8"
"Cache-Control"
"max-age=0"
"Connection"
"keep-alive"
# 需替换为实际有效的 Cookie(从浏览器 F12 抓包获取)
"Cookie"
"你的微信公众号 Cookie"
# 超时时间
self
10
# 避免高频请求,设置延迟
self
2
def
get_article_html
self, article_url
""" 获取文章页面 HTML 源码 :param article_url: 公众号文章链接 :return: 页面 HTML 文本/None """
try
# 延迟请求,降低反爬风险
self
self
self
True
# 抛出 HTTP 异常
# 自动识别编码
return
except
as
print
f"获取页面失败:{e}"
return
None
def
parse_static_content
self, html
""" 解析静态内容:标题、作者、发布时间、正文 :param html: 页面 HTML 文本 :return: 静态数据字典 """
"lxml"
# 解析标题
"h1"
"rich_media_title"
"title"
True
if
else
"未知标题"
# 解析作者
"a"
"rich_media_meta_link"
"author"
True
if
else
"未知作者"
# 解析发布时间
"em"
"rich_media_meta rich_media_meta_text"
"publish_time"
True
if
else
"未知时间"
# 解析正文
"div"
"rich_media_content"
if
# 清理多余标签,保留纯文本
for
in
"script"
"style"
"iframe"
"content"
True
"\n"
else
"content"
"正文解析失败"
return
def
parse_dynamic_data
self, html
""" 解析动态数据:阅读量、在看数(从页面 JS 变量中提取) :param html: 页面 HTML 文本 :return: 动态数据字典 """
"read_count"
0
"like_count"
0
try
# 定位包含阅读量的 JS 变量
"var msgBizInfo = "
if
1
"};"
1
"var msgBizInfo = "
""
"read_count"
"read_num"
0
"like_count"
"like_num"
0
except
as
print
f"解析动态数据失败:{e}"
return
def
run
self, article_url
""" 爬虫主流程 :param article_url: 公众号文章链接 :return: 完整文章数据 """
# 校验 URL 合法性
if
not
or
not
print
"URL 格式错误"
return
None
# 1. 获取页面 HTML
self
if
not
return
None
# 2. 解析静态数据
self
# 3. 解析动态数据
self
# 4. 合并数据
return
if
"__main__"
# 实例化爬虫
# 待爬取的公众号文章链接(替换为实际链接)
"https://mp.weixin.qq.com/s/xxxxxx"
# 执行爬虫
# 输出结果
if
print
"===== 微信公众号文章抓取结果 ====="
print
f"标题:{result['title']}"
print
f"作者:{result['author']}"
print
f"发布时间:{result['publish_time']}"
print
f"阅读量:{result['read_count']}"
print
f"在看数:{result['like_count']}"
print
f"正文(前 200 字):{result['content'][:200]}..."
else
print
"爬虫执行失败"
2.3 代码输出结果示例
===== 微信公众号文章抓取结果 =====
标题:Python 爬虫实战:从入门到精通
作者:Python 技术栈
发布时间:2026-01-14
阅读量:12580
在看数:896
正文(前 200 字):本文将详细讲解 Python 爬虫的核心技术,包括请求头伪装、反反爬策略、动态页面解析等内容。通过实战案例,帮助初学者快速掌握爬虫开发技巧,同时针对常见的反爬机制给出解决方案,让你的爬虫更稳定、更高效...
2.4 核心代码原理说明
代码模块核心原理关键作用
__init__ 方法初始化请求头(包含随机 UA、Cookie)、设置请求延迟模拟真实用户请求,规避基础反爬
get_article_html 方法发送 GET 请求,处理超时 / 重定向,自动识别编码获取文章页面完整 HTML 源码
parse_static_content 方法使用 BeautifulSoup 定位 class 属性,解析 HTML 标签提取标题、作者、正文等静态内容
parse_dynamic_data 方法从页面 JS 变量中提取 JSON 数据抓取阅读量、在看数等动态加载字段
run 方法串联 URL 校验、HTML 获取、数据解析全流程实现爬虫的完整执行逻辑

三、反反爬优化策略

3.1 Cookie 有效期处理

微信公众号 Cookie 有效期约 24 小时,可通过以下方式优化:

  1. 将 Cookie 存储到本地文件,定期更新;
  2. 结合 Selenium 模拟登录,自动获取有效 Cookie(需配置微信网页版登录)。
3.2 高频请求限制突破
  1. 增加请求延迟(建议 2-5 秒 / 次),避免短时间内大量请求;
  2. 使用代理 IP 池轮换 IP,避免单 IP 被封禁;
  3. 随机修改请求头中的 UA、Referer 字段,降低特征识别概率。
3.3 动态内容抓取补充方案

若 JS 变量解析失败,可通过以下方式抓取动态数据:

  1. 使用 selenium/playwright 模拟浏览器渲染,等待页面加载完成后再解析;
  2. 抓包获取文章数据接口(如 https://mp.weixin.qq.com/mp/getappmsgext),直接请求接口获取 JSON 数据。

四、数据持久化与扩展

4.1 数据保存到本地文件

在 run 方法末尾添加以下代码,将结果保存为 JSON 文件:

import json
with open("wechat_article.json", "w", encoding="utf-8") as f:
    json.dump(article_data, f, ensure_ascii=False, indent=4)
print("数据已保存到 wechat_article.json")
4.2 批量抓取公众号文章

扩展爬虫支持批量处理 URL 列表:

def batch_crawl(self, url_list):
    """批量抓取多个公众号文章"""
    all_results = []
    for url in url_list:
        result = self.run(url)
        if result:
            all_results.append(result)
    return all_results

# 调用示例
url_list = [
    "https://mp.weixin.qq.com/s/xxxxxx1",
    "https://mp.weixin.qq.com/s/xxxxxx2"
]
batch_result = spider.batch_crawl(url_list)
print(f"批量抓取完成,共获取{len(batch_result)}篇文章")

五、注意事项与合规声明

  1. 合规性:抓取数据仅用于学习研究,不得用于商业用途,需遵守《网络安全法》及微信公众平台运营规范;
  2. 频率控制:避免高频请求给目标服务器造成压力,尊重网站的 robots.txt 协议;
  3. Cookie 安全:请勿将包含个人信息的 Cookie 泄露给他人,定期更换 Cookie 降低账号风险。

总结

  1. 微信公众号文章爬虫的核心是模拟微信客户端请求(Cookie/UA 伪装)+静态 / 动态数据分层解析,静态内容通过 BeautifulSoup 解析 HTML,动态数据从 JS 变量或接口中提取;
  2. 反反爬的关键在于请求特征随机化(UA/IP 轮换)、频率控制(请求延迟)、Cookie 有效期管理;
  3. 实战中需结合合规要求,控制抓取频率,避免触发平台封禁机制,同时可通过批量处理、数据持久化扩展爬虫的实用性。

目录

  1. 前言
  2. 摘要
  3. 一、技术原理与环境准备
  4. 1.1 核心技术原理
  5. 1.2 环境配置
  6. 环境安装命令
  7. 二、实战开发:微信公众号文章爬虫
  8. 2.1 核心思路拆解
  9. 2.2 完整代码实现
  10. 2.3 代码输出结果示例
  11. 2.4 核心代码原理说明
  12. 三、反反爬优化策略
  13. 3.1 Cookie 有效期处理
  14. 3.2 高频请求限制突破
  15. 3.3 动态内容抓取补充方案
  16. 四、数据持久化与扩展
  17. 4.1 数据保存到本地文件
  18. 4.2 批量抓取公众号文章
  19. 调用示例
  20. 五、注意事项与合规声明
  21. 总结

更多推荐文章

查看全部
  • NeurIPS 2024 清华与加州理工提出强化自训练方法 ReST-MCTS*
  • CentOS Stream Docker 安装与配置全流程指南
  • LeetCode Hot 100 链表进阶:反转与排序实战 (Python)
  • 6 款免费 AI 写作软件测评:网文创作与去 AI 味工具对比
  • C++ 轻量级开源项目推荐:适合阅读源码
  • 《人工智能的底层逻辑》:清华大学张长水教授 AI 通识著作解析
  • 线性 DP 经典四题详解
  • 大模型如何颠覆医疗行业
  • 大模型时代下传统程序员是否仍需编写代码
  • ClawX:OpenClaw 可视化桌面客户端使用指南
  • MATLAB 与 Python 混合编程实战指南
  • Java 图形界面编程:AWT 基础与组件体系
  • Java 反射与方法句柄:动态编程深度解析
  • Dify 大语言模型私有化部署指南:Linux 环境搭建与 Docker 配置
  • 贪心算法实战:三道经典 LeetCode 题解与思路分析
  • PicoClaw 轻量级 AI 助手安装与使用指南
  • Naiz AI:从语义到像素,全链路重构视频数字孪生
  • OpenClaw Web Search 配置与渠道选择指南
  • DPI 系统详解:从流量感知到业务理解的关键网络能力
  • 适合 Python 新手的 5 个在线编程练习网站推荐

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online