手记

【爬虫工具】用python开发的微博聚合采集软件,助力文科生科研舆情分析数据爬取等

免责声明:本文仅用作技术交流与学术探讨,旨在分析社交媒体数据采集的常见技术流程。所有操作均应严格遵守相关法律法规及平台内容的使用协议,禁止用于任何商业或非法用途。

一、前言

微博作为国内重要的社交媒体平台,其公开数据在社会舆情分析、市场趋势研究、传播学等领域具有很高的学术和研究价值。本文将探讨一个微博数据采集工具的设计思路与技术实现,该工具主要围绕关键词搜索特定博主主页以及帖子评论这三个核心场景展开。

我们将从技术栈、核心工作流程、数据处理等角度,解析其中涉及的关键技术点。

二、技术架构与模块分析

项目整体采用 Python 语言开发,利用其成熟的生态库来快速构建各个功能模块。

2.1 技术选型

  • HTTP请求层 (requests): 作为与微博服务器API交互的核心,负责发送HTTP请求并获取响应数据。其简单的API和强大的功能(如Session管理、自定义请求头)是爬虫开发的首选。
  • GUI界面 (tkinter): 为了方便非技术人员使用,我们选择Python内置的tkinter库构建了一个简单的图形用户界面,用于接收用户输入(如关键词、博主链接)和展示任务状态。
  • 数据解析与处理 (json, pandas): 微博API返回的数据多为JSON格式,使用json库进行解析。解析后的非结构化数据通过pandas库转换成结构化的DataFrame,最终以便于分析的CSV格式进行存储。
  • 日志系统 (logging): 在长时间运行的数据采集中,一个健壮的日志系统至关重要。logging模块可以记录详细的运行状态、API返回信息和潜在错误,便于调试和任务追踪。

2.2 核心代码实现解析

1. HTTP请求封装

为了模拟浏览器行为,请求时需要附带必要的请求头(Headers),尤其是CookieUser-AgentCookie是维持登录状态和获取用户特定数据的关键。

import requests

# h1 是包含 User-Agent 和 Cookie 的请求头字典
# params 是URL查询参数,如关键词、页码等
r = requests.get(url, headers=h1, params=params)

# 微博API通常返回JSON格式数据
json_data = r.json()

2. JSON数据解析

API返回的JSON数据具有一定的层级结构,需要根据目标字段进行解析。以评论数据为例,评论列表通常在一个嵌套的data键中。

# 假设json_data是API返回的完整JSON对象
text_list = []
for data in json_data.get('data', []):  # 使用.get避免KeyError
    # 'text_raw' 是通常包含未处理评论文本的字段
    text = data.get('text_raw', '')
    text_list.append(text)

通过遍历data列表,可以批量提取每条评论的核心信息。

3. 数据结构化存储

采集到的数据字段众多,使用pandas可以高效地将其组织成二维数据表,并导出为CSV文件。

import pandas as pd

# 将采集到的各个字段列表数据整合成一个字典
data_dict = {
    '微博链接': weibo_url_list,
    '微博id': weibo_id_list,
    '页码': page_list,
    '评论者昵称': screen_name_list,
    '评论者粉丝数': followers_count_list,
    '评论者主页链接': user_home_url_list,
    '评论时间': create_time_list,
    '点赞数': like_counts_list,
    '评论内容IP属地': source_list,
    '评论内容': text_list,
}

# 转换为DataFrame
df = pd.DataFrame(data_dict)

# 'mode="a+"' 表示以追加模式写入,支持多页采集
# 'encoding="utf_8_sig"' 确保中文在Excel中正常显示
df.to_csv(result_file, mode='a+', index=False, header=not os.path.exists(result_file), encoding='utf_8_sig')

4. 日志模块配置

为了追踪爬虫的运行情况,配置一个支持日志分割的TimedRotatingFileHandler是很好的实践。它可以按时间(如每天)自动创建新的日志文件,避免单个日志文件过大。

import logging
from logging.handlers import TimedRotatingFileHandler
import time

def get_logger():
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    
    # 定义日志格式
    formatter = logging.Formatter(
        '[%(asctime)s-%(filename)s][%(funcName)s-%(lineno)d]--%(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    # 按天分割的日志文件处理器
    info_file_name = time.strftime("%Y-%m-%d") + '.log'
    case_dir = r'./logs/'
    info_handler = TimedRotatingFileHandler(
        filename=case_dir + info_file_name,
        when='MIDNIGHT',  # 每天午夜分割
        interval=1,
        backupCount=7,    # 保留最近7天的日志
        encoding='utf-8'
    )
    info_handler.setFormatter(formatter)
    logger.addHandler(info_handler)
    
    return logger

三、数据采集流程与要点

3.1 身份验证:Cookie的使用

当前微博绝大部分数据接口都需要用户登录后才能访问。因此,在发送请求前,必须在请求头中携带有效的Cookie

Cookie是微博识别用户身份的关键凭证。首次使用软件前,需要配置cookie。最新版本软件里已经内附一键自动化配置cookie的ck小工具,小白友好,高效便捷:

3.2 采集工作流

无论采集哪种类型的数据,基本流程是相似的:

  1. 参数配置:确定采集目标,如搜索的关键词、博主的个人主页URL、具体帖子的URL等。
  2. 构造初始请求:根据API规则,拼接URL和查询参数,带上Cookie信息,发送第一次请求。
  3. 解析与存储:从响应的JSON中解析出当前页的数据,并将其存入CSV文件。
  4. 分页处理:分析JSON响应中关于分页的信息(如 max_idpage 等字段),构造下一页的请求参数。
  5. 循环采集:重复步骤3和4,直到无法获取下一页数据或达到预设的采集页数限制。在循环中加入适当的延时(time.sleep())是避免请求频率过高导致访问受限的有效策略。

3.3 输出数据字段说明

根据不同的采集功能,输出的数据字段有所不同,以下为各功能的核心字段示例:

  • 关键词搜索功能

  • 关键词搜索-字段
    关键词, 页码, 微博id, 微博链接, 用户昵称, 用户主页链接, 发布时间, 转发数, 评论数, 点赞数, 微博内容


  • 采集博主主页帖子

  • 博主主页帖子-字段
    博主昵称, 博主id, 页码, 微博id, 微博链接, 发布时间, 转发数, 评论数, 点赞数, 话题标签, 微博内容


  • 采集单条帖子的评论

  • 单条帖子评论-字段
    微博链接, 页码, 评论者昵称, 评论者粉丝数, 评论者主页链接, 评论时间, 点赞数, 评论内容IP属地, 评论内容

四、演示视频

软件操作过程演示视频:【工具演示】爬微博聚合软件

END、作者声明

爬微博聚合软件"首发公号"老男孩的平凡之路”,欢迎技术交流、深入探讨。

本软件由本人独立原创开发,本文章由本人原创编写,请勿二创或任何形式的转载、盗发,违者必究!

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