用Python+Requests搞定微博热搜实时监控(附完整源码与避坑指南)
·
Python实战:构建高稳定性的微博热搜实时监控系统
最近有个做运营的朋友向我吐槽,每天手动刷微博热搜榜太费时间,问我能不能用Python帮他自动化这个流程。这不,我花了两天时间给他整了个微博热搜实时监控系统,不仅能自动抓取数据,还能设置定时任务,甚至加了异常处理机制。今天就把这个项目的完整实现思路和代码分享给大家,特别适合需要舆情监控的运营人员和技术爱好者。
1. 项目架构设计与技术选型
在开始编码前,我们需要明确系统的核心需求和整体架构。这个监控系统需要实现以下几个关键功能:
- 实时数据获取:稳定地从微博获取最新的热搜数据
- 数据持久化:将结果保存到本地文件系统
- 异常处理:应对网络波动、API变更等突发情况
- 定时执行:支持Windows和Linux系统的定时任务配置
技术栈方面,我们选择了以下工具:
| 技术组件 | 用途 | 替代方案 |
|---|---|---|
| Python 3.8+ | 核心编程语言 | Node.js, Go |
| Requests | HTTP请求库 | urllib3, httpx |
| Schedule | 轻量级定时任务 | APScheduler, Celery |
| Logging | 系统日志记录 | Loguru, Sentry |
提示:选择Requests而不是Scrapy等框架,是为了保持项目轻量级,降低部署复杂度。
2. 环境准备与依赖安装
首先确保你的Python环境是3.8或更高版本。可以通过以下命令检查:
python --version
# 或
python3 --version
安装必要的依赖库:
pip install requests schedule pandas
对于需要可视化功能的用户,可以额外安装:
pip install matplotlib numpy
项目目录结构建议如下:
weibo-hot-search-monitor/
├── config.py # 配置文件
├── monitor.py # 主程序
├── requirements.txt # 依赖文件
└── logs/ # 日志目录
3. 核心代码实现与逐行解析
3.1 配置模块设计
首先创建一个config.py文件存放常量配置:
# config.py
import os
# API配置
API_URL = "https://weibo.com/ajax/side/hotSearch"
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
# 文件存储配置
SAVE_DIR = "data"
os.makedirs(SAVE_DIR, exist_ok=True)
3.2 主监控模块实现
monitor.py是系统的核心,我们分步骤实现:
# monitor.py
import requests
import json
import time
import logging
from datetime import datetime
import pandas as pd
from config import API_URL, HEADERS, SAVE_DIR
# 初始化日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('logs/monitor.log'),
logging.StreamHandler()
]
)
def fetch_hot_search():
"""获取微博热搜数据"""
try:
response = requests.get(API_URL, headers=HEADERS, timeout=15)
response.raise_for_status()
data = response.json()
if not data.get('data'):
raise ValueError("API返回数据格式异常")
return data['data']
except requests.exceptions.RequestException as e:
logging.error(f"网络请求失败: {str(e)}")
return None
except json.JSONDecodeError:
logging.error("API返回非JSON数据")
return None
except Exception as e:
logging.error(f"未知错误: {str(e)}")
return None
3.3 数据存储功能
def save_data(data):
"""保存热搜数据到CSV"""
if not data:
return False
try:
df = pd.DataFrame(data)
# 关键字段处理
df = df[['word', 'url', 'category', 'num']]
df.columns = ['关键词', '链接', '分类', '热度']
# 添加时间戳
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"{SAVE_DIR}/weibo_hot_{timestamp}.csv"
df.to_csv(filename, index=False, encoding='utf-8-sig')
logging.info(f"数据已保存至 {filename}")
return True
except Exception as e:
logging.error(f"数据保存失败: {str(e)}")
return False
3.4 定时任务集成
import schedule
def job():
logging.info("开始执行热搜抓取任务...")
data = fetch_hot_search()
if data:
save_data(data)
logging.info("任务执行完毕\n")
# 每30分钟执行一次
schedule.every(30).minutes.do(job)
if __name__ == "__main__":
logging.info("微博热搜监控系统启动")
while True:
schedule.run_pending()
time.sleep(1)
4. 常见问题与解决方案
4.1 API变动应对策略
微博的API接口可能会不定期更新。如果发现脚本突然无法工作,可以:
- 使用浏览器开发者工具(F12)分析微博热搜页面的网络请求
- 查找新的API端点
- 更新
config.py中的API_URL
4.2 网络异常处理
我们已经在代码中添加了基本的网络异常处理,但实际部署时可能还需要:
- 增加重试机制
- 设置代理池(如果需要高频访问)
- 监控网络质量
示例重试逻辑:
def fetch_with_retry(max_retries=3):
for i in range(max_retries):
data = fetch_hot_search()
if data:
return data
time.sleep(5 * (i + 1)) # 指数退避
return None
4.3 数据存储优化
当运行时间较长时,可以考虑:
- 使用数据库替代CSV文件(如SQLite)
- 按日期分目录存储
- 增加数据去重逻辑
5. 系统部署与定时任务
5.1 Windows任务计划
- 创建批处理文件
run_monitor.bat:
@echo off
cd /d "%~dp0"
python monitor.py
- 使用任务计划程序设置定时执行
5.2 Linux系统部署
使用crontab设置定时任务:
# 编辑crontab
crontab -e
# 添加以下内容(每30分钟执行一次)
*/30 * * * * cd /path/to/project && /usr/bin/python3 monitor.py >> /var/log/weibo_monitor.log 2>&1
5.3 Docker化部署(可选)
创建Dockerfile:
FROM python:3.8-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "monitor.py"]
构建并运行:
docker build -t weibo-monitor .
docker run -d --restart always -v $(pwd)/data:/app/data -v $(pwd)/logs:/app/logs --name weibo_monitor weibo-monitor
6. 监控与维护建议
为了让系统长期稳定运行,建议:
- 日志分析:定期检查日志文件,关注错误信息
- 资源监控:确保服务器有足够的内存和CPU资源
- 数据备份:定期备份重要的数据文件
- 版本更新:关注依赖库的更新,及时升级
我在实际部署中发现,系统最常出现的问题是网络超时和API变动。为此,我添加了以下增强功能:
- 心跳检测机制:每小时发送一次测试请求
- 邮件报警:当连续多次失败时发送告警
- 自动恢复:尝试自动修复常见问题
# 增强版监控循环
def enhanced_monitor():
error_count = 0
while True:
try:
job()
error_count = 0
except Exception as e:
error_count += 1
logging.error(f"任务执行异常({error_count}/3): {str(e)}")
if error_count >= 3:
send_alert_email()
error_count = 0
time.sleep(60 * 30) # 30分钟间隔
这个微博热搜监控系统已经在我朋友的运营团队稳定运行了三个月,帮助他们节省了大量人工收集数据的时间。最重要的是,系统的异常处理机制让他们在API变动时能第一时间得到通知,而不是等到发现数据缺失时才反应过来。
更多推荐
所有评论(0)