Python中如何实现微博用户信息分析并存储到MySQL数据库

可以爬取微博用户个人资料以及动态信息。

项目地址: https://github.com/starFalll/Spider

数据分析:

  • 生成词云
  • 统计词频
  • 统计活跃时间
  • 使用 LDA 构建了微博主题模型
  • 更多功能...

UI:

  • 生成良好的 UI 数据分析与展示界面

Python中如何实现微博用户信息分析并存储到MySQL数据库

5 回复

源码里面注释写得很清楚,另外 lz 也写了一篇文章 爬虫实战(一):爬取微博用户信息


import requests
import json
import pymysql
from datetime import datetime
import time

class WeiboUserAnalyzer:
    def __init__(self, mysql_config):
        """
        初始化数据库连接
        mysql_config格式: {
            'host': 'localhost',
            'user': 'root',
            'password': 'password',
            'database': 'weibo_analysis'
        }
        """
        self.db = pymysql.connect(**mysql_config)
        self.cursor = self.db.cursor()
        self.create_table()
    
    def create_table(self):
        """创建用户信息表"""
        sql = """
        CREATE TABLE IF NOT EXISTS weibo_users (
            id INT AUTO_INCREMENT PRIMARY KEY,
            user_id VARCHAR(50) UNIQUE,
            screen_name VARCHAR(100),
            gender VARCHAR(10),
            followers_count INT,
            friends_count INT,
            statuses_count INT,
            verified BOOLEAN,
            verified_type INT,
            description TEXT,
            location VARCHAR(100),
            created_at DATETIME,
            last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            INDEX idx_user_id (user_id),
            INDEX idx_followers (followers_count)
        )
        """
        self.cursor.execute(sql)
        self.db.commit()
    
    def get_user_info(self, user_id, access_token):
        """
        获取微博用户信息(需要微博API权限)
        实际使用时需要替换为有效的API调用
        """
        # 这里模拟API调用,实际需要替换为真实的微博API
        headers = {
            'Authorization': f'Bearer {access_token}'
        }
        
        # 模拟数据 - 实际应该调用微博API
        # url = f'https://api.weibo.com/2/users/show.json?uid={user_id}'
        # response = requests.get(url, headers=headers)
        # return response.json()
        
        # 模拟返回数据
        return {
            'id': user_id,
            'screen_name': f'用户_{user_id}',
            'gender': 'm',
            'followers_count': 1000,
            'friends_count': 200,
            'statuses_count': 500,
            'verified': True,
            'verified_type': 0,
            'description': '这是一个测试用户',
            'location': '北京',
            'created_at': '2015-03-12 10:00:00'
        }
    
    def analyze_user(self, user_data):
        """分析用户数据"""
        analysis = {
            'user_id': user_data['id'],
            'screen_name': user_data['screen_name'],
            'gender': '男' if user_data.get('gender') == 'm' else '女',
            'followers_count': user_data['followers_count'],
            'friends_count': user_data['friends_count'],
            'statuses_count': user_data['statuses_count'],
            'verified': bool(user_data.get('verified', False)),
            'verified_type': user_data.get('verified_type', -1),
            'description': user_data.get('description', ''),
            'location': user_data.get('location', ''),
            'created_at': datetime.strptime(user_data['created_at'], '%Y-%m-%d %H:%M:%S') 
                         if 'created_at' in user_data else datetime.now()
        }
        return analysis
    
    def save_to_mysql(self, user_analysis):
        """保存分析结果到MySQL"""
        sql = """
        INSERT INTO weibo_users 
        (user_id, screen_name, gender, followers_count, friends_count, 
         statuses_count, verified, verified_type, description, location, created_at)
        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
        ON DUPLICATE KEY UPDATE
        screen_name = VALUES(screen_name),
        followers_count = VALUES(followers_count),
        friends_count = VALUES(friends_count),
        statuses_count = VALUES(statuses_count),
        verified = VALUES(verified),
        description = VALUES(description),
        location = VALUES(location)
        """
        
        values = (
            user_analysis['user_id'],
            user_analysis['screen_name'],
            user_analysis['gender'],
            user_analysis['followers_count'],
            user_analysis['friends_count'],
            user_analysis['statuses_count'],
            user_analysis['verified'],
            user_analysis['verified_type'],
            user_analysis['description'],
            user_analysis['location'],
            user_analysis['created_at']
        )
        
        try:
            self.cursor.execute(sql, values)
            self.db.commit()
            print(f"用户 {user_analysis['screen_name']} 数据保存成功")
            return True
        except Exception as e:
            print(f"保存失败: {e}")
            self.db.rollback()
            return False
    
    def process_user(self, user_id, access_token):
        """处理单个用户:获取->分析->存储"""
        # 获取用户数据
        user_data = self.get_user_info(user_id, access_token)
        
        # 分析用户数据
        user_analysis = self.analyze_user(user_data)
        
        # 存储到数据库
        self.save_to_mysql(user_analysis)
        
        return user_analysis
    
    def close(self):
        """关闭数据库连接"""
        self.cursor.close()
        self.db.close()

# 使用示例
if __name__ == "__main__":
    # MySQL配置
    mysql_config = {
        'host': 'localhost',
        'user': 'your_username',
        'password': 'your_password',
        'database': 'weibo_analysis',
        'charset': 'utf8mb4'
    }
    
    # 微博API访问令牌(需要申请)
    access_token = "your_weibo_access_token"
    
    # 创建分析器实例
    analyzer = WeiboUserAnalyzer(mysql_config)
    
    # 处理用户(示例用户ID)
    user_ids = ['123456789', '987654321']
    
    for user_id in user_ids:
        try:
            result = analyzer.process_user(user_id, access_token)
            print(f"处理完成: {result['screen_name']}")
            time.sleep(1)  # 避免请求过快
        except Exception as e:
            print(f"处理用户 {user_id} 时出错: {e}")
    
    # 关闭连接
    analyzer.close()

这个实现包含了几个关键部分:

  1. 数据库操作:使用pymysql连接MySQL,创建专门存储用户信息的表
  2. 数据获取:通过微博API获取用户信息(示例中为模拟数据)
  3. 数据分析:提取关键字段并进行简单处理
  4. 数据存储:使用INSERT…ON DUPLICATE KEY UPDATE实现插入或更新

注意

  • 实际使用时需要申请微博开放平台API权限
  • 数据库表设计包含了用户基本信息和分析常用字段
  • 使用utf8mb4字符集支持表情符号存储

建议:先申请微博API权限,然后根据实际需求调整字段和分析逻辑。

User-Agent 都写错了,楼主确定跑过???

#2 那个是之前随便加上去的,这个我在配置文件里面已经说了需要自己改

#2 代码全是我自己写的呀,不然 gif 图怎么来的,跑过很多次了

回到顶部