手记

Python实战:微博数据采集,并封装成GUI软件,给文科生科研用

本文介绍如何使用Python获取微博数据,包含HTTP请求、正则解析、JSON处理、GUI界面开发等核心知识点

前言

在日常开发中,我们经常需要获取互联网平台的数据进行分析研究。本文以微博数据为例,介绍如何用Python实现数据获取、解析和可视化界面开发整个流程。

声明:本文仅作技术学习探讨,请勿用于任何商业用途或违反平台规则的行为。


一、技术架构

本项目采用经典的多线程+tkinter GUI架构:

┌─────────────────────────────────────────────────┐
│                   GUI 界面层                      │
│            (tkinter - 选项卡管理)                  │
├─────────────────────────────────────────────────┤
│                   业务逻辑层                      │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐     │
│  │ 搜索模块 │  │ 用户模块 │  │ 评论模块 │     │
│  └──────────┘  └──────────┘  └──────────┘     │
├─────────────────────────────────────────────────┤
│                   数据访问层                      │
│       (requests + BeautifulSoup + 正则)          │
└─────────────────────────────────────────────────┘

二、核心依赖

pip install requests pandas beautifulsoup4 tkinter

三、数据获取模块

3.1 搜索结果获取

微博搜索采用GET请求,关键参数包括:

def search_posts(keyword, page, start_time, end_time):
    """搜索微博帖子"""
    url = 'https://s.weibo.com/weibo'
    params = {
        'q': keyword,                              # 搜索关键词
        'typeall': 1,
        'suball': 1,
        'timescope': f'custom:{start_time}:{end_time}',  # 时间范围
        'Refer': 'g',
        'page': page,
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...',
        'Cookie': 'your_cookie_here',
        'Referer': 'https://s.weibo.com/weibo',
    }
    response = requests.get(url, headers=headers, params=params)
    return response.text

3.2 评论数据获取

评论接口返回JSON格式数据:

def get_comments(weibo_id, page=1, max_id=0):
    """获取微博评论"""
    api_url = 'https://weibo.com/ajax/statuses/buildComments'
    params = {
        'count': 20,
        'flow': 0,           # 0:按热度 1:按时间
        'id': weibo_id,
        'max_id': max_id,
    }
    response = requests.get(api_url, headers=headers, params=params)
    json_data = response.json()
    return json_data['data']

四、数据解析

4.1 HTML解析(BeautifulSoup)

from bs4 import BeautifulSoup

def parse_html(html_content):
    """解析HTML页面"""
    soup = BeautifulSoup(html_content, 'html.parser')
    items = soup.find_all('div', {'action-type': 'feed_list_item'})
    
    for item in items:
        # 用户昵称
        nickname = item.find('p', {'node-type': 'feed_list_content'}).get('nick-name')
        # 发布时间
        create_time = item.find('div', {'class': 'from'}).text.strip()
        # 转发数/评论数/点赞数
        card_act = item.find('div', {'class': 'card-act'})
        repost_count = card_act.find_all('li')[0].text.strip()
        
        print(f'{nickname}: {create_time}')

4.2 JSON解析

import json

def parse_json_comments(data):
    """解析评论JSON数据"""
    for comment in data:
        user_info = {
            '昵称': comment['user']['screen_name'],
            '粉丝数': comment['user']['followers_count'],
            '评论时间': comment['created_at'],
            '评论内容': comment['text_raw'],
        }
        yield user_info

4.3 时间格式转换

from datetime import datetime

GMT_FORMAT = '%a %b %d %H:%M:%S +0800 %Y'

def parse_weibo_time(gmt_time):
    """转换GMT时间为标准格式"""
    time_obj = datetime.strptime(gmt_time, GMT_FORMAT)
    return time_obj.strftime("%Y-%m-%d %H:%M:%S")

def time_to_timestamp(time_str):
    """时间字符串转时间戳"""
    time_tuple = time.strptime(time_str, "%Y-%m-%d")
    return int(time.mktime(time_tuple))

五、多线程处理

import threading

class MyThread(threading.Thread):
    def __init__(self, func, *args):
        super().__init__()
        self.func = func
        self.args = args
        self.setDaemon(True)
        self.start()

    def run(self):
        self.func(*self.args)

六、GUI界面开发

使用tkinter构建多选项卡界面:

import tkinter as tk
from tkinter import ttk

class WeiboToolGUI:
    def __init__(self, root):
        self.root = root
        self.root.title('微博数据工具 v1.2')
        self.root.minsize(width=900, height=700)
        
        # 创建Notebook控件(多选项卡)
        self.notebook = ttk.Notebook(self.root)
        self.notebook.pack(fill='both', expand=True)
        
        # 添加选项卡
        self.tab1 = ttk.Frame(self.notebook)
        self.tab2 = ttk.Frame(self.notebook)
        self.tab3 = ttk.Frame(self.notebook)
        
        self.notebook.add(self.tab1, text='关键词搜索')
        self.notebook.add(self.tab2, text='用户主页数据')
        self.notebook.add(self.tab3, text='评论获取')

软件界面效果:

七、数据存储

import pandas as pd

def save_to_csv(data_list, filename):
    """保存数据到CSV"""
    df = pd.DataFrame(data_list)
    # 追加模式,避免覆盖已有数据
    header = not os.path.exists(filename)
    df.to_csv(filename, mode='a+', header=header, 
               index=False, encoding='utf_8_sig')

采集字段一览

字段 说明
关键词 搜索关键词
微博ID 微博唯一标识
用户昵称 发布者昵称
发布时间 标准时间格式
转发数 转发数量
评论数 评论数量
点赞数 点赞数量
微博内容 完整文本

demo数据:

八、反爬策略与优化

8.1 请求间隔控制

import random
import time

# 随机等待1-3秒
wait_sec = random.uniform(1, 3)
time.sleep(wait_sec)

8.2 异常处理

try:
    response = requests.get(url, headers=headers, timeout=10)
except requests.exceptions.Timeout:
    print('请求超时')
except requests.exceptions.RequestException as e:
    print(f'请求异常: {e}')

8.3 结束条件判断

if '抱歉,未找到相关结果' in response.text:
    break  # 无结果,退出循环

九、实战总结

本文介绍了微博数据获取的完整技术方案,涵盖:

模块 技术点
网络请求 requests + headers + params
HTML解析 BeautifulSoup + find_all
JSON处理 response.json() + 字典遍历
时间处理 strptime + strftime + 时间戳
GUI开发 tkinter + Notebook
多线程 threading.Thread
数据存储 pandas + CSV追加写入
反爬策略 随机延时 + 异常捕获

通过本文的学习,你可以掌握:

  1. HTTP协议实战:GET请求、参数构造、请求头设置
  2. 数据解析技术:HTML解析、JSON解析、正则表达式
  3. GUI工具开发:tkinter多选项卡、日志输出、按钮事件
  4. 工程化能力:多线程、异常处理、文件操作

配套学习资源干货公众号:老男孩的平凡之路):

资源 说明
完整项目源码 公众号回复「微博」,已整理好可直接运行版本
开箱即用工具 公众号回复「微博」,封装好的GUI工具(支持关键词搜索、博主主页、评论采集)
Cookie配置 公众号回复「cookie」,图文教程

作者简介:专注Python技术分享,包括爬虫开发、数据分析、自动化办公等领域。团队历时3个月研发,已帮助200+开发者提升数据获取效率。

0人推荐
随时随地看视频
慕课网APP