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

大会官网:https://ais.cn/u/ZZvqiq

大会时间:2026年1月30日

前言

随着社交媒体内容价值的不断凸显,微信公众号作为内容创作和传播的核心载体,其文章数据的抓取与分析已成为数据分析、内容研究领域的重要需求。不同于普通网页爬虫,微信公众号内容因平台的反爬机制、数据加密及访问权限限制,抓取难度更高。本文将从技术原理、实战开发、异常处理等维度,系统讲解如何使用 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
环境安装命令

bash

运行

pip install requests beautifulsoup4 lxml fake-useragent 

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

2.1 核心思路拆解

  1. 模拟微信客户端请求头,绕过基础反爬;
  2. 获取文章页面 HTML 源码,解析静态内容(标题、作者、发布时间);
  3. 定位异步接口,抓取动态数据(阅读量、在看数);
  4. 数据清洗与持久化,输出结构化结果。

2.2 完整代码实现

python

运行

import requests import json import time from bs4 import BeautifulSoup from fake_useragent import UserAgent from urllib.parse import urlparse class WeChatArticleSpider: def __init__(self): # 初始化请求头,模拟微信客户端 self.ua = UserAgent() self.headers = { "User-Agent": self.ua.random, "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.timeout = 10 # 避免高频请求,设置延迟 self.delay = 2 def get_article_html(self, article_url): """ 获取文章页面HTML源码 :param article_url: 公众号文章链接 :return: 页面HTML文本/None """ try: # 延迟请求,降低反爬风险 time.sleep(self.delay) response = requests.get( url=article_url, headers=self.headers, timeout=self.timeout, allow_redirects=True ) response.raise_for_status() # 抛出HTTP异常 response.encoding = response.apparent_encoding # 自动识别编码 return response.text except requests.exceptions.RequestException as e: print(f"获取页面失败:{e}") return None def parse_static_content(self, html): """ 解析静态内容:标题、作者、发布时间、正文 :param html: 页面HTML文本 :return: 静态数据字典 """ soup = BeautifulSoup(html, "lxml") static_data = {} # 解析标题 title_tag = soup.find("h1", class_="rich_media_title") static_data["title"] = title_tag.get_text(strip=True) if title_tag else "未知标题" # 解析作者 author_tag = soup.find("a", class_="rich_media_meta_link") static_data["author"] = author_tag.get_text(strip=True) if author_tag else "未知作者" # 解析发布时间 time_tag = soup.find("em", class_="rich_media_meta rich_media_meta_text") static_data["publish_time"] = time_tag.get_text(strip=True) if time_tag else "未知时间" # 解析正文 content_tag = soup.find("div", class_="rich_media_content") if content_tag: # 清理多余标签,保留纯文本 for useless_tag in content_tag.find_all(["script", "style", "iframe"]): useless_tag.decompose() static_data["content"] = content_tag.get_text(strip=True, separator="\n") else: static_data["content"] = "正文解析失败" return static_data def parse_dynamic_data(self, html): """ 解析动态数据:阅读量、在看数(从页面JS变量中提取) :param html: 页面HTML文本 :return: 动态数据字典 """ dynamic_data = {"read_count": 0, "like_count": 0} try: # 定位包含阅读量的JS变量 js_start = html.find("var msgBizInfo = ") if js_start != -1: js_end = html.find("};", js_start) + 1 js_str = html[js_start:js_end].replace("var msgBizInfo = ", "") biz_info = json.loads(js_str) dynamic_data["read_count"] = biz_info.get("read_num", 0) dynamic_data["like_count"] = biz_info.get("like_num", 0) except Exception as e: print(f"解析动态数据失败:{e}") return dynamic_data def run(self, article_url): """ 爬虫主流程 :param article_url: 公众号文章链接 :return: 完整文章数据 """ # 校验URL合法性 parsed_url = urlparse(article_url) if not parsed_url.scheme or not parsed_url.netloc: print("URL格式错误") return None # 1. 获取页面HTML html = self.get_article_html(article_url) if not html: return None # 2. 解析静态数据 static_data = self.parse_static_content(html) # 3. 解析动态数据 dynamic_data = self.parse_dynamic_data(html) # 4. 合并数据 article_data = {**static_data, **dynamic_data} return article_data if __name__ == "__main__": # 实例化爬虫 spider = WeChatArticleSpider() # 待爬取的公众号文章链接(替换为实际链接) target_url = "https://mp.weixin.qq.com/s/xxxxxx" # 执行爬虫 result = spider.run(target_url) # 输出结果 if result: 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 代码输出结果示例

plaintext

===== 微信公众号文章抓取结果 ===== 标题: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 获取、数据解析全流程实现爬虫的完整执行逻辑

三、反反爬优化策略

微信公众号 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 文件:

python

运行

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 列表:

python

运行

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. 实战中需结合合规要求,控制抓取频率,避免触发平台封禁机制,同时可通过批量处理、数据持久化扩展爬虫的实用性。

Read more

安装 启动 使用 Neo4j的超详细教程

安装 启动 使用 Neo4j的超详细教程

最近在做一个基于知识图谱的智能生成项目。需要用到Neo4j图数据库。写这篇文章记录一下Neo4j的安装及其使用。 一.Neo4j的安装 1.首先安装JDK,配环境变量。(参照网上教程,很多) Neo4j是基于Java的图形数据库,运行Neo4j需要启动JVM进程,因此必须安装JAVA SE的JDK。从Oracle官方网站下载 Java SE JDK。我使用的版本是JDK1.8 2.官网上安装neo4j。 官方网址:https://neo4j.com/deployment-center/  在官网上下载对应版本。Neo4j应用程序有如下主要的目录结构: bin目录:用于存储Neo4j的可执行程序; conf目录:用于控制Neo4j启动的配置文件; data目录:用于存储核心数据库文件; plugins目录:用于存储Neo4j的插件; 3.配置环境变量 创建主目录环境变量NEO4J_HOME,并把主目录设置为变量值。复制具体的neo4j文件地址作为变量值。 配置文档存储在conf目录下,Neo4j通过配置文件neo4j.conf控制服务器的工作。默认情况下,不需

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程 在数字化办公日益普及的今天,企业微信作为国内领先的企业级通讯工具,其群机器人功能为团队协作带来了极大的便利。本文将手把手教你如何从零开始配置企业微信群机器人Webhook,实现自动化消息推送,提升团队沟通效率。 1. 准备工作与环境配置 在开始创建机器人之前,需要确保满足以下基本条件: * 企业微信账号:拥有有效的企业微信管理员或成员账号 * 群聊条件:至少包含3名成员的群聊(这是创建机器人的最低人数要求) * 网络环境:能够正常访问企业微信服务器 提示:如果是企业管理员,建议先在"企业微信管理后台"确认机器人功能是否已对企业开放。某些企业可能出于安全考虑会限制此功能。 2. 创建群机器人 2.1 添加机器人到群聊 1. 打开企业微信客户端,进入目标群聊 2. 点击右上角的群菜单按钮(通常显示为"..."或"⋮") 3. 选择"添加群机器人"选项 4.

Flowise物联网融合:与智能家居设备联动的应用设想

Flowise物联网融合:与智能家居设备联动的应用设想 1. Flowise:让AI工作流变得像搭积木一样简单 Flowise 是一个真正把“AI平民化”落地的工具。它不像传统开发那样需要写几十行 LangChain 代码、配置向量库、调试提示词模板,而是把所有这些能力打包成一个个可拖拽的节点——就像小时候玩乐高,你不需要懂塑料怎么合成,只要知道哪块该拼在哪,就能搭出一座城堡。 它诞生于2023年,短短一年就收获了45.6k GitHub Stars,MIT协议开源,意味着你可以放心把它用在公司内部系统里,甚至嵌入到客户交付的产品中,完全不用担心授权问题。最打动人的不是它的技术多炫酷,而是它真的“不挑人”:产品经理能搭出知识库问答机器人,运营同学能配出自动抓取竞品文案的Agent,连刚学Python两周的实习生,也能在5分钟内跑通一个本地大模型的RAG流程。 它的核心逻辑很朴素:把LangChain里那些抽象概念——比如LLM调用、文档切分、向量检索、工具调用——变成画布上看得见、摸得着的方块。你拖一个“Ollama LLM”节点,再拖一个“Chroma Vector

OpenClaw配置Bot接入飞书机器人+Kimi2.5

OpenClaw配置Bot接入飞书机器人+Kimi2.5

上一篇文章写了Ubuntu_24.04下安装OpenClaw的过程,这篇文档记录一下接入飞书机器+Kimi2.5。 准备工作 飞书 创建飞书机器人 访问飞书开放平台:https://open.feishu.cn/app,点击创建应用: 填写应用名称和描述后就直接创建: 复制App ID 和 App Secret 创建成功后,在“凭证与基础信息”中找到 App ID 和 App Secret,把这2个信息复制记录下来,后面需要配置到openclaw中 配置权限 点击【权限管理】→【开通权限】 或使用【批量导入/导出权限】,选择导入,输入以下内容,如下图 点击【下一步,确认新增权限】即可开通所需要的权限。 配置事件与回调 说明:这一步的配置需要先讲AppId和AppSecret配置到openclaw成功之后再设置订阅方式,