微博话题统计
快速开始
环境要求
- Python 3.7+
- Node.js 和 npm(用于安装 agent-browser)
- agent-browser(脚本会自动检查并安装)
基本使用
脚本会自动检查 agent-browser 是否已安装,如果未安装会自动尝试安装。
重要: Windows 平台请使用专用的
scrape_weibo_topic_windows.py脚本,该版本针对 Windows 做了深度优化,解决了多行 JS 命令行传参截断、双重 JSON 编码等兼容性问题,性能也更优(执行时间从 1+ 分钟降至 30-40 秒)。
Linux/macOS:
python3 scripts/scrape_weibo_topic.py <关键词>
Windows:
python scripts\scrape_weibo_topic_windows.py <关键词>
示例:
# Linux/macOS
python3 scripts/scrape_weibo_topic.py 刘亦菲有风的地方
# Windows (PowerShell)
python scripts\scrape_weibo_topic_windows.py 刘亦菲有风的地方
自动安装说明
首次运行时,脚本会:
- 检查 agent-browser 是否已安装
- 如果未安装,自动执行
npm install -g agent-browser - 验证安装是否成功
如果自动安装失败,请手动安装:
npm install -g agent-browser
工作流程
- 打开搜索页面: 使用agent-browser打开微博搜索页面(带搜索参数)
- 切换到话题页签: 自动点击"话题"页签进入话题搜索结果
- 提取话题数据: 使用JavaScript提取所有话题及其讨论数、阅读数
- 统计分析: 计算话题总数、总讨论数、总阅读数
- 生成报告: 输出格式化的统计结果
跨平台兼容性
支持的平台
- ✅ Linux: 完全支持,使用
scrape_weibo_topic.py - ✅ macOS: 完全支持,使用
scrape_weibo_topic.py - ✅ Windows: 完全支持,使用专用优化脚本
scrape_weibo_topic_windows.py
脚本说明
| 脚本文件 | 适用平台 | 说明 |
|---------|---------|------|
| scripts/scrape_weibo_topic.py | Linux / macOS | 通用版本 |
| scripts/scrape_weibo_topic_windows.py | Windows | Windows 专用优化版 |
Windows 优化版的核心改进:
- 将多行 JavaScript 压缩为单行传递,避免 Windows 命令行参数截断问题
- 处理
agent-browser eval返回的双重 JSON 编码 - 减少进程启动次数,将多个操作合并为单个 JavaScript 调用
- 减少
shell=True使用,Windows 下直接执行命令 - 优化等待时间和滚动策略,执行时间从 1+ 分钟降至 30-40 秒
Windows特殊说明
系统要求
- Windows 10/11
- Python 3.7+ (安装时需勾选"Add Python to PATH")
- Node.js (用于安装agent-browser)
快速安装
- 安装Python: https://www.python.org/downloads/
- 安装Node.js: https://nodejs.org/
- 安装agent-browser:
npm install -g agent-browser agent-browser install - 运行安装脚本:
cd C:\Users\你的用户名\.workbuddy\skills\weibo-topic-statistics install_windows.bat
Windows使用提示
- 使用PowerShell代替CMD以获得更好的编码支持
- 遇到中文乱码时运行:
chcp 65001 - 以管理员身份运行以避免权限问题
- 查看详细Windows指南:
WINDOWS_GUIDE.md
编码问题解决
# 方法1: 设置代码页 (CMD)
chcp 65001
python scripts\scrape_weibo_topic_windows.py 关键词
# 方法2: 设置环境变量 (PowerShell,推荐)
$env:PYTHONIOENCODING='utf-8'; python scripts\scrape_weibo_topic_windows.py 关键词
路径分隔符
脚本已自动处理路径分隔符:
- Linux/macOS: 使用
/ - Windows: 自动使用
\
防火墙设置
确保防火墙允许以下程序访问网络:
- Python.exe
- Node.js
- agent-browser相关进程
输出格式
控制台输出
=== 微博话题热度统计 ===
关键词: 刘亦菲有风的地方
统计结果:
- 话题数量: 10
- 总讨论数: 2.8万 (28,084)
- 总阅读数: 1.5亿 (146,802,000)
热门话题TOP 10:
1. #刘亦菲有风的地方#
2. #有风的地方刘亦菲#
3. #去有风的地方追刘亦菲#
...
JSON输出
{
"success": true,
"keyword": "刘亦菲有风的地方",
"topic_count": 10,
"total_discussions": 28084,
"total_reads": 146802000,
"topics": [
"#刘亦菲有风的地方#",
"#有风的地方刘亦菲#",
"#去有风的地方追刘亦菲#",
...
],
"formatted_discussions": "2.8万",
"formatted_reads": "1.5亿"
}
技术实现
核心依赖
- agent-browser: 浏览器自动化工具
- Python 3.7+: 脚本运行环境
数据提取方法
脚本使用以下技术提取数据:
- DOM遍历: 使用JavaScript查询选择器定位话题元素
- 正则表达式: 匹配"XX讨论 XX阅读"格式提取数字
- 数字解析: 将"1.2万"、"500"等文本转换为数值
关键函数
通用版 (scrape_weibo_topic.py):
scrape_weibo_topic(keyword): 主函数,执行完整的统计流程open_browser(url): 打开浏览器并访问指定URLclick_topic_tab(): 点击话题页签extract_topics(): 提取话题数据和统计数据format_number(num): 格式化数字为易读形式
Windows 优化版 (scrape_weibo_topic_windows.py):
scrape_weibo_topic(keyword): 主函数,执行完整的统计流程minify_js(js_code): 将多行 JS 压缩为单行,解决 Windows 命令行参数截断click_topic_tab_and_wait(): 合并点击和等待为单次 JS 调用scroll_and_collect_topics(): 一次性滚动收集所有话题数据format_number(num): 格式化数字为易读形式
数据说明
统计范围
- 统计微博搜索结果中显示的所有话题
- 通常包含前10-20个热门话题
- 数据为实时数据,随时间动态变化
字段含义
- 话题数量: 搜索结果中包含的话题总数
- 总讨论数: 所有话题的讨论次数总和
- 总阅读数: 所有话题的阅读次数总和
数据格式
- 讨论数和阅读数支持格式: "399"、"1.4万"、"62.3万"
- 自动转换为数值进行统计
- 输出时保留原始格式和转换后的数值
注意事项
反爬机制
- 微博有严格的反爬机制,但搜索话题页签无需登录即可访问
- 如遇到访问限制,建议增加等待时间或手动处理验证
数据准确性
- 数据为实时抓取,可能与实际显示有微小差异
- 建议多次运行取平均值以提高准确性
- 对于重要决策,建议直接在微博平台验证
性能优化
- 脚本默认等待时间为3秒,可根据网络状况调整
- 批量统计多个关键词时,建议间隔运行避免触发限制
- 可添加代理或headers配置以应对IP限制
错误处理
常见错误
-
"无法打开搜索页面"
- 检查网络连接
- 确认agent-browser已正确安装
- 检查URL是否正确
-
"页面加载超时"
- 增加等待时间
- 检查网络速度
- 尝试使用不同的网络环境
-
"无法切换到话题页签"
- 确认搜索结果包含话题
- 检查页面元素结构是否变化
- 使用--headed模式查看浏览器窗口调试
-
Windows特定错误
中文显示乱码:
# 方法1: 设置编码 (CMD) chcp 65001 python scripts\scrape_weibo_topic_windows.py 关键词 # 方法2: 使用PowerShell (推荐) $env:PYTHONIOENCODING='utf-8'; python scripts\scrape_weibo_topic_windows.py 关键词命令未找到:
# 检查Python是否在PATH中 python --version # 检查agent-browser是否安装 npm list -g agent-browser权限错误:
- 以管理员身份运行命令提示符
- 或检查杀毒软件是否阻止了脚本执行
-
"未能提取到话题数据"
- 确认话题数据存在于页面中
- 检查JavaScript执行是否成功
- 查看浏览器console是否有错误
调试技巧
使用--headed模式查看浏览器窗口:
agent-browser --headed open <url>
查看页面结构:
agent-browser snapshot
查看JavaScript错误:
agent-browser errors
扩展功能
保存为文件
可以在脚本中添加文件保存功能,将结果保存为Markdown或JSON格式:
def save_to_markdown(result: Dict, filename: str):
"""将结果保存为Markdown格式"""
with open(filename, 'w', encoding='utf-8') as f:
f.write(f"# 微博话题热度统计\n\n")
f.write(f"关键词: {result['keyword']}\n\n")
# ... 更多内容
批量统计
修改main函数支持批量统计多个关键词:
def main():
keywords = ["刘亦菲有风的地方", "AI", "区块链"]
for keyword in keywords:
result = scrape_weibo_topic(keyword)
# 处理结果
数据可视化
可以集成matplotlib等库生成图表:
- 话题热度柱状图
- 讨论数vs阅读数散点图
- 时间趋势折线图
使用示例
示例1: 基本统计
# Linux/macOS
python3 scripts/scrape_weibo_topic.py "刘亦菲有风的地方"
# Windows (PowerShell)
python scripts\scrape_weibo_topic_windows.py "刘亦菲有风的地方"
示例2: 批量统计
import subprocess
import platform
keywords = ["刘亦菲有风的地方", "AI", "区块链"]
results = []
# 根据平台选择脚本
script = "scripts/scrape_weibo_topic_windows.py" if platform.system() == "Windows" else "scripts/scrape_weibo_topic.py"
python_cmd = "python" if platform.system() == "Windows" else "python3"
for keyword in keywords:
result = subprocess.run(
[python_cmd, script, keyword],
capture_output=True,
text=True
)
results.append(result.stdout)
示例3: 集成到其他脚本
# Linux/macOS
from scripts.scrape_weibo_topic import scrape_weibo_topic
# Windows
# from scripts.scrape_weibo_topic_windows import scrape_weibo_topic
result = scrape_weibo_topic("刘亦菲有风的地方")
if result['success']:
print(f"话题数: {result['topic_count']}")
print(f"总讨论数: {result['formatted_discussions']}")
print(f"总阅读数: {result['formatted_reads']}")
最佳实践
- 合理使用频率: 避免短时间内频繁访问同一页面
- 数据验证: 重要决策前建议在微博平台验证数据
- 错误重试: 遇到临时错误时可以自动重试2-3次
- 日志记录: 记录每次运行的参数和结果便于调试
- 结果备份: 将重要统计结果保存到文件
限制和约束
- 仅统计搜索结果中显示的话题,可能不完全覆盖
- 数据为实时数据,不同时间结果可能不同
- 依赖agent-browser工具,需要正确安装和配置
- 微博页面结构变化可能影响数据提取,需要维护
Scan to join WeChat group