1. 项目概述:微信公众号舆情日报自动化系统
作为一名长期关注信息效率的技术从业者,我每天需要跟踪超过200个行业公众号的动态。传统的人工浏览方式不仅耗时(日均消耗2.5小时),还经常错过关键内容。为解决这个痛点,我开发了一套基于大语言模型(LLM)的自动化舆情日报系统,实现了从文章抓取、内容清洗、智能摘要到邮件推送的全流程自动化。系统运行三个月以来,我的信息处理效率提升近8倍,核心内容覆盖率从原来的35%提升至92%。
这个系统的核心价值在于:通过技术手段将"信息过载"转化为"精准投喂"。不同于简单的RSS订阅,我们不仅实现了公众号内容的聚合,更重要的是利用LLM进行语义层面的信息提炼。下面我将从技术实现角度,完整拆解这个系统的设计思路和实现细节。
2. 系统架构设计
2.1 整体技术栈选型
系统采用分层架构设计,各组件选型基于以下考量:
| 层级 | 组件 | 选型理由 |
|---|---|---|
| 数据采集 | Python + mitmproxy | 微信协议逆向成熟方案,支持实时拦截API请求 |
| 数据处理 | Pandas + BeautifulSoup | 轻量级且处理HTML文档效率高 |
| 核心分析 | 智谱AI GLM-4 | 中文理解能力强,API稳定性好 |
| 邮件渲染 | Markdown + Jinja2 | 保持内容与样式分离,便于后期维护 |
| 任务调度 | Airflow | 提供完善的失败重试和报警机制 |
提示:微信官方禁止未经授权的爬虫行为,本系统仅用于个人学习研究,所有数据采集均在模拟人工操作的基础上进行,且严格限制请求频率(≤5次/分钟)
2.2 数据流设计
系统数据处理流程遵循ETL范式:
- Extract:通过逆向工程获取微信文章列表API
- Transform:清洗HTML标签、过滤广告内容、提取正文文本
- Load:将结构化数据输入LLM进行分析,输出摘要报告
关键创新点在于:
- 采用"分级摘要"策略:先对单篇文章生成要点,再对所有文章进行聚合分析
- 引入时效性权重算法:根据文章发布时间自动调整在日报中的展示优先级
3. 核心模块实现
3.1 微信文章获取方案
3.1.1 协议逆向工程
通过Android模拟器+Charles抓包,我们定位到关键API接口:
code复制https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=[公众号ID]&f=json
请求参数中需要特别注意:
offset:控制分页位置count:每页获取数量(建议≤10以避免触发风控)uin/key:动态生成的鉴权参数
3.1.2 反爬应对策略
在实际部署中遇到的主要挑战:
- IP封禁:采用住宅代理IP轮询(每天更换5个IP)
- 行为验证:模拟人工浏览轨迹(随机滑动+停留时间)
- 参数加密:逆向解析
pass_ticket生成算法
python复制def get_article_list(biz_id, offset=0):
headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36',
'X-Requested-With': 'com.tencent.mm'
}
params = {
'__biz': biz_id,
'offset': offset,
'count': 10,
'f': 'json'
}
# 添加动态签名参数
params.update(generate_signature(params))
response = requests.get(API_URL, headers=headers, params=params)
return parse_response(response.json())
3.2 数据清洗关键步骤
3.2.1 噪声去除
原始HTML文档包含大量干扰元素:
- 公众号名片(div class="profile_container")
- 阅读原文链接(a class="profile_meta_link")
- 广告推广(section class="ad_area")
使用XPath精准定位正文区域:
python复制//div[contains(@class,'rich_media')]//*[not(contains(@class,'qr_code'))]
3.2.2 文本标准化
清洗后的文本需要统一处理:
- 合并连续空白字符
- 将全角标点转为半角
- 移除不可见Unicode字符
- 分段处理(保留段落语义)
注意:保留文章中的图片描述文字,这些文字往往包含关键信息
3.3 LLM智能摘要引擎
3.3.1 Prompt设计哲学
经过上百次迭代测试,最终确定的prompt模板包含:
- 角色定义:明确模型作为行业分析师的身份
- 任务描述:结构化输出要求(背景、要点、影响)
- 格式规范:Markdown分级标题+emoji标识重要性
python复制def generate_prompt(title, content):
return f"""作为资深金融科技分析师,请对以下文章进行专业解读:
# {title}
## 原文内容
{content[:20000]} # 控制输入长度
## 分析要求
1. 用3句话概括核心观点
2. 提取5个关键数据/事实
3. 评估其对行业的影响(低/中/高)
4. 生成3个相关延伸思考问题
输出格式:
### 📌 核心观点
1. ...
2. ...
3. ...
### 🔍 关键数据
- 数据1(带原文引用)
- ...
### 🌐 影响评估
评级:{impact_level}
理由:...
### 💡 延伸思考
1. ...
"""
3.3.2 结果后处理
对LLM输出进行二次加工:
- 敏感词过滤(政治、竞品等)
- 事实性校验(交叉验证关键数据)
- 长度控制(单篇摘要≤500字)
3.4 邮件渲染优化
3.4.1 模板设计
采用响应式HTML模板,关键特性:
- 移动端自适应(媒体查询)
- 深色/浅色模式切换
- 重要性分级视觉标识(❗️🔥⭐️)
html复制<div class="article-card">
<h3>{{ title }}</h3>
<div class="meta">
<span class="source">{{ account }}</span>
<span class="time">{{ publish_time }}</span>
<span class="impact impact-{{ level }}">{{ level }}</span>
</div>
<div class="summary">
{{ summary|safe }}
</div>
</div>
3.4.2 发送策略
为避免进入垃圾邮件箱:
- 使用AWS SES进行域认证发送
- 控制发送频率(每天固定时间点)
- 包含退订链接(符合CAN-SPAM法案)
4. 实战问题与解决方案
4.1 典型报错处理
| 问题现象 | 根因分析 | 解决方案 |
|---|---|---|
| 获取空列表 | 公众号开启了"防爬"模式 | 在请求头中添加Referer: https://mp.weixin.qq.com |
| 摘要内容发散 | LLM上下文理解偏差 | 在prompt中添加"请严格基于原文分析"的强约束 |
| 邮件显示错乱 | CSS被邮件客户端过滤 | 使用内联样式+表格布局的fallback方案 |
4.2 性能优化记录
-
缓存机制:
- 本地缓存已处理文章MD5值
- Redis缓存API响应(TTL=6小时)
-
并行处理:
- 使用asyncio并发调用LLM API
- 控制并发数≤3(避免触发速率限制)
-
增量更新:
- 记录最后成功采集的offset
- 失败任务自动进入重试队列
5. 效果评估与迭代方向
当前系统每日处理约300篇文章,生成15-20页的日报,主要指标:
- 信息覆盖率:92.3%
- 平均处理延迟:28分钟
- 用户打开率:74.5%
后续优化计划:
- 引入多模型投票机制(GLM+GPT+Claude)
- 增加个性化推荐算法(基于用户点击行为)
- 开发Chrome插件版实时分析工具
这个项目的核心收获是:在LLM时代,工程师的价值不在于重复造轮子,而在于如何通过精巧的系统设计,将通用大模型转化为解决特定场景问题的专业工具。
