Python中如何设计微博动态监控系统,实现新发布微博的实时通知?

Python中如何设计微博动态监控系统,实现新发布微博的实时通知?

26 回复

要设计一个微博动态监控系统,核心是轮询API和消息推送。这里给一个基于requestsschedule库的基础实现方案,监控指定用户的微博列表变化。

import requests
import time
import schedule
from datetime import datetime
import json

class WeiboMonitor:
    def __init__(self, target_uid, check_interval=60):
        """
        初始化监控器
        :param target_uid: 目标微博用户UID
        :param check_interval: 检查间隔(秒)
        """
        self.target_uid = target_uid
        self.check_interval = check_interval
        self.last_weibo_id = None  # 记录最新微博ID
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
        }
    
    def fetch_latest_weibo(self):
        """获取用户最新微博"""
        # 这里使用微博移动端API示例,实际需要根据微博接口调整
        url = f'https://m.weibo.cn/api/container/getIndex'
        params = {
            'type': 'uid',
            'value': self.target_uid,
            'containerid': '107603{uid}'.format(uid=self.target_uid)
        }
        
        try:
            response = requests.get(url, params=params, headers=self.headers, timeout=10)
            if response.status_code == 200:
                data = response.json()
                # 解析微博列表
                weibos = data.get('data', {}).get('cards', [])
                for card in weibos:
                    if card.get('card_type') == 9:  # 微博卡片类型
                        mblog = card.get('mblog', {})
                        return {
                            'id': mblog.get('id'),
                            'text': mblog.get('text', ''),
                            'created_at': mblog.get('created_at', ''),
                            'user': mblog.get('user', {}).get('screen_name', '')
                        }
        except Exception as e:
            print(f"获取微博失败: {e}")
        return None
    
    def check_new_weibo(self):
        """检查新微博"""
        latest = self.fetch_latest_weibo()
        if not latest:
            return
        
        current_id = latest['id']
        
        # 首次运行,只记录不通知
        if self.last_weibo_id is None:
            self.last_weibo_id = current_id
            print(f"[{datetime.now()}] 初始化最新微博ID: {current_id}")
            return
        
        # 发现新微博
        if current_id != self.last_weibo_id:
            self.last_weibo_id = current_id
            self.send_notification(latest)
    
    def send_notification(self, weibo_data):
        """发送通知(示例:控制台打印)"""
        print(f"\n{'='*50}")
        print(f"📢 检测到新微博!")
        print(f"用户: {weibo_data['user']}")
        print(f"时间: {weibo_data['created_at']}")
        print(f"内容: {weibo_data['text'][:100]}...")
        print(f"微博ID: {weibo_data['id']}")
        print(f"{'='*50}\n")
        
        # 实际应用中可扩展:
        # 1. 发送邮件:使用smtplib
        # 2. 微信推送:使用Server酱或企业微信API
        # 3. 保存到数据库:使用sqlite3或pymysql
    
    def run(self):
        """启动监控"""
        print(f"开始监控微博用户 {self.target_uid},检查间隔 {self.check_interval}秒")
        schedule.every(self.check_interval).seconds.do(self.check_new_weibo)
        
        # 立即执行一次初始化
        self.check_new_weibo()
        
        while True:
            schedule.run_pending()
            time.sleep(1)

# 使用示例
if __name__ == "__main__":
    # 替换为目标用户的UID(在微博个人主页URL中找到)
    TARGET_UID = "1234567890"  # 示例UID
    
    monitor = WeiboMonitor(target_uid=TARGET_UID, check_interval=30)
    monitor.run()

关键点说明:

  1. UID获取:需要目标用户的微博UID(个人主页URL中的数字)
  2. API限制:微博API有频率限制,合理设置检查间隔(建议30秒以上)
  3. 通知扩展send_notification方法可扩展为邮件、微信、Webhook等推送方式
  4. 数据存储:建议添加SQLite记录已处理微博,避免重启后重复通知

运行准备:

pip install requests schedule

生产环境建议:

  • 改用异步框架(如aiohttp+asyncio)提高效率
  • 添加代理支持应对IP限制
  • 实现失败重试机制
  • 使用配置文件管理UID和检查间隔

这个方案提供了可运行的基础框架,你可以根据实际需求扩展通知方式和数据处理逻辑。

总结:核心就是定时抓取API对比ID变化,配合消息推送。

那么网外的 freeweibo 就是检测删帖的 可以走这个思路

打开即刻 app,添加微博机器人,创建主题,添加关注对象,等 app 通知你

定时轮训?同时根据不同用户的发微博频次建立不同的轮训间隔队列(当然要动态调整)
我用 scrapy 写的微博爬虫,大概 1 分钟 2000 多个页面吧(我测试了几个小时都稳定在跑),改成分布式我觉得上限还能增加,所以 100000 的量还行?

舆情系统,10 年前玩烂的东西

即刻是怎么做的呢

看了下也就 5 楼说的靠谱点。我做过相关的项目,代码也还在,大规模检测用的,楼主要是想一起搞事情可以联系我。

即刻并不是实时提醒的。

盖个歪楼,这不是设计问题。
最好的办法就是去后场村卫生巾大厦,看看有没有运维没锁屏。登进去之后接入消息队列,然后,你懂的。

延迟多久,根据你的经验

用 python 搞过一个简单的,大概就是 selenium 拿 cookies,然后 request 定时访问,解析网页,更新了推微信

人家问的重点是问监控量大的情况下怎么保证及时性

把这一千个人拉进一个 QQ 群,给他们说,他们一发微博就给我发信息,就酱

思路不错,可惜微博的推送信息流我记得不是按照时间轴线的

想了解下有啥好思路分享吗

推送微信是怎么做到的

皮皮精灵

企业微信,申请企业号,不用传资料也可以用 api,然后里面有个微信插件的可以推到微信

把他们放在一个分组里面、按分组看就是时间轴顺序

学习了

搞一台配置好的云服务器就行了,哪来那么多麻烦 2333

还可以这样操作,学习了

分组人数有上线,10k 人数要分几十个组

分布式+代理 几年前抓过微博 每次都有一批账号被新浪判定安全风险要手机解锁

回到顶部