欢迎光临
我们一直在努力

Python爬虫实战:Python 社交媒体挖掘 - 微博数据抓取与情感舆情分析!

㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~ ㊙️本期爬虫难度指数:⭐⭐ 🉐福利: 一次订阅后,专栏内的所有文章可永久免费看,持续更新中,保底1000+(篇)硬核实战内容。

全文目录:

      • 🌟 开篇语
      • 0️⃣ 前言(Preface)
      • 1️⃣ 摘要(Abstract)
      • 2️⃣ 背景与需求(Why)
      • 3️⃣ 合规与注意事项(必写)
      • 4️⃣ 技术选型与整体流程(What/How)
      • 5️⃣ 环境准备与依赖安装(可复现)
      • 6️⃣ 核心实现:请求层(Fetcher)
      • 7️⃣ 核心实现:解析层(Parser)
      • 8️⃣ 数据存储与导出(Storage)
      • 9️⃣ 数据可视化与 NLP 分析(Analysis)
        • 1. 词云生成 (Word Cloud)
        • 2. 情感分析与趋势图 (Sentiment Trend)
      • 🔟 运行方式与示例(Execution)
      • 1️⃣1️⃣ 常见问题与排错(强烈建议写)
      • 1️⃣2️⃣ 总结与延伸阅读
      • 🌟 文末
        • ✅ 专栏持续更新中|建议收藏 + 订阅
        • ✅ 互动征集
        • ✅ 免责声明

🌟 开篇语

哈喽,各位小伙伴们你们好呀~我是【喵手】。 运营社区: C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO 欢迎大家常来逛逛,一起学习,一起进步~🌟

  我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

  📌 专栏食用指南(建议收藏)

  • ✅ 入门基础:环境搭建 / 请求与解析 / 数据落库
  • ✅ 进阶提升:登录鉴权 / 动态渲染 / 反爬对抗
  • ✅ 工程实战:异步并发 / 分布式调度 / 监控与容错
  • ✅ 项目落地:数据治理 / 可视化分析 / 场景化应用

📣 专栏推广时间:如果你想系统学爬虫,而不是碎片化东拼西凑,欢迎订阅专栏👉《Python爬虫实战》👈,一次订阅后,专栏内的所有文章可永久免费阅读,持续更新中。    💕订阅后更新会优先推送,按目录学习更高效💯~

0️⃣ 前言(Preface)

  • 一句话说明:我们将利用微博移动端的隐藏 API 接口,编写 Python 脚本抓取特定用户的微博正文及互动数据(转/评/赞),并结合 NLP 技术生成词云与情感波动图。

  • 读完能获得什么:

  • 学会抓取 Ajax/JSON 动态加载 的数据(这是现代爬虫的主流)。
  • 掌握中文分词(Jieba)与词云(WordCloud)的完整可视化流程。

1️⃣ 摘要(Abstract)

  • 概要:本项目绕过复杂的 PC 端网页,通过模拟移动端请求 m.weibo.cn 获取 JSON 数据。抓取字段包括推文内容、发布时间、点赞转发数。随后使用 Pandas 进行时序聚合,利用 Jieba 分词制作 Hot Keywords 词云,最后用 SnowNLP 计算情感得分并绘制趋势。

  • 核心收益:

  • 理解 Cookies 在社交媒体爬虫中的核心地位。
  • 实现从“非结构化文本”到“可视化洞察”的转换。

2️⃣ 背景与需求(Why)

  • 为什么要爬:社交媒体数据是实时的“人类脉搏”。分析这些数据可以帮助我们预测热点、了解公众情绪或进行竞品分析。

  • 目标站点:微博移动版 (m.weibo.cn)。

  • 目标字段清单:

    • created_at (发布时间)
    • text (微博正文 – 需去除 HTML 标签)
    • reposts_count (转发数)
    • comments_count (评论数)
    • attitudes_count (点赞数)

3️⃣ 合规与注意事项(必写)

社交媒体的合规红线非常多,必须谨记!🛡️

  • Robots.txt & API 限制:微博对频率限制极严。如果请求太快,账号会被“关小黑屋”甚至封号。
  • 隐私边界:只抓取公开可见的微博。绝对不要尝试抓取私信、仅粉丝可见的内容或用户手机号等隐私信息。
  • Cookie 安全:爬虫需要用到你的个人 Cookie。千万不要把包含 Cookie 的代码上传到 GitHub,否则你的号就归别人了。

4️⃣ 技术选型与整体流程(What/How)

  • 技术栈:

    • 采集:Requests (模拟 API 调用)
    • 清洗:Pandas + Re (正则去标签)
    • NLP:Jieba (中文分词) + SnowNLP (情感分析)
    • 可视化:Matplotlib (折线图) + WordCloud (词云)
  • 流程图: 获取 ContainerID (用户ID) ➔ 循环请求 API (翻页) ➔ JSON 解析 ➔ Pandas 清洗 ➔ Jieba 分词 ➔ WordCloud 可视化

5️⃣ 环境准备与依赖安装(可复现)

我们需要安装专门处理中文文本的库。

  • Python 版本:Python 3.8+

  • 依赖安装:

    pip install requests pandas jieba wordcloud snownlp matplotlib

  • 中文字体:为了让词云显示中文,你需要找一个 .ttf 字体文件(如 SimHei.ttf)放在项目目录下。

6️⃣ 核心实现:请求层(Fetcher)

微博移动端的数据是通过 GET 请求加载的,关键在于 containerid(用户的唯一标识)。

import requests
import time
import random

# 替换成你自己的 Cookie (登录 m.weibo.cn 后在 Network 中复制)
# 注意:Cookie 非常长,且有时效性
MY_COOKIE = 'YOUR_SUB_COOKIE_HERE'

def fetch_weibo_data(container_id, page=1):
url = "https://m.weibo.cn/api/container/getIndex"
params = {
"containerid": container_id,
"page_type": "03",
"page": page
}
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 10; SM-G9600) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36",
"Cookie": MY_COOKIE,
"Referer": f"https://m.weibo.cn/u/{container_id}"
}

try:
resp = requests.get(url, params=params, headers=headers, timeout=10)
if resp.status_code == 200:
return resp.json()
return None
except Exception as e:
print(f"❌ Error fetching page {page}: {e}")
return None

7️⃣ 核心实现:解析层(Parser)

JSON 数据结构嵌套很深,我们需要像剥洋葱一样把 mblog 字段拿出来。

import re
from datetime import datetime

def clean_html(raw_html):
"""用正则去除 HTML 标签"""
pattern = re.compile(r'<[^>]+>', re.S)
return pattern.sub('', raw_html)

def parse_weibo_json(json_data):
items = []
# 微博数据通常在 data -> cards 列表中
cards = json_data.get('data', {}).get('cards', [])

for card in cards:
# card_type 9 才是正文微博
if card.get('card_type') == 9:
mblog = card.get('mblog', {})

created_at = mblog.get('created_at')
# 简单处理时间,如果是"刚刚"、"几分钟前"需要额外转换,这里假设是标准格式

text = clean_html(mblog.get('text', ''))

items.append({
'created_at': created_at,
'text': text,
'reposts': mblog.get('reposts_count'),
'comments': mblog.get('comments_count'),
'likes': mblog.get('attitudes_count')
})
return items

8️⃣ 数据存储与导出(Storage)

import pandas as pd

def save_weibo(data_list):
df = pd.DataFrame(data_list)
# 存为 CSV,encoding='utf-8-sig' 保证 Excel 打开不乱码
df.to_csv("weibo_data.csv", index=False, encoding='utf-8-sig')
print(f"💾 Data saved! Total rows: {len(df)}")

9️⃣ 数据可视化与 NLP 分析(Analysis)

数据抓下来只是第一步,现在我们要让数据“说话”。🗣️

1. 词云生成 (Word Cloud)

我们要看看这个大V最近都在聊什么关键词。

import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt

def generate_wordcloud(text_list):
# 1. 拼接所有微博文本
full_text = " ".join(text_list)

# 2. Jieba 分词
# 排除常见停用词 (如: 的, 了, 是…)
stopwords = {'的', '了', '是', '我', '在', '全文', '链接', '视频', '网页'}
words = jieba.cut(full_text)
filtered_words = [w for w in words if w not in stopwords and len(w) > 1]

# 3. 生成词云
# font_path 必须指定中文字体路径,否则显示方框
wc = WordCloud(
font_path='simhei.ttf', # 确保当前目录下有这个字体文件
width=1000, height=600,
background_color='white',
max_words=100
)

wc.generate(" ".join(filtered_words))

# 4. 显示
plt.figure(figsize=(10, 6))
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.title('Trending Keywords WordCloud', fontsize=16)
plt.savefig('weibo_wordcloud_en.png') # 保存为英文文件名
plt.show()

2. 情感分析与趋势图 (Sentiment Trend)

分析用户最近的情绪是积极还是消极。

from snownlp import SnowNLP
import matplotlib.dates as mdates

def analyze_sentiment(df):
# 计算每一条微博的情感得分 (0-1)
# 0 = Negative, 1 = Positive
df['sentiment'] = df['text'].apply(lambda x: SnowNLP(x).sentiments if x else 0.5)

# 简单的可视化:情感得分随索引的变化(模拟时间轴)
plt.figure(figsize=(12, 5))
plt.plot(df.index, df['sentiment'], color='#1DA1F2', marker='o', linestyle='-', alpha=0.6)

# 添加平均线
avg_sentiment = df['sentiment'].mean()
plt.axhline(y=avg_sentiment, color='r', linestyle='–', label=f'Avg Sentiment: {avg_sentiment:.2f}')

plt.title('User Sentiment Analysis Trend', fontsize=14)
plt.xlabel('Recent Tweets (Chronological Order)')
plt.ylabel('Sentiment Score (0=Neg, 1=Pos)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

🔟 运行方式与示例(Execution)

主程序入口 main.py:

if __name__ == "__main__":
# 假设我们要抓取"人民日报"的微博
# 你需要先去 m.weibo.cn 搜索用户,在 URL 里找到 containerid
# 例如:1076032803301701
TARGET_ID = "1076032803301701"

all_tweets = []
print("🚀 Starting Weibo Spider…")

# 抓取前 5 页作为演示
for page in range(1, 6):
print(f"🕷️ Fetching page {page}…")
json_data = fetch_weibo_data(TARGET_ID, page)
if json_data:
tweets = parse_weibo_json(json_data)
all_tweets.extend(tweets)
# 必须休眠!微博风控很严
time.sleep(random.uniform(3, 6))
else:
break

if all_tweets:
# 1. 保存数据
save_weibo(all_tweets)

# 2. 加载数据进行分析
df = pd.DataFrame(all_tweets)

# 3. 生成词云
print("☁️ Generating WordCloud…")
generate_wordcloud(df['text'].tolist())

# 4. 情感分析
print("❤️ Analyzing Sentiment…")
analyze_sentiment(df)

print("🎉 All tasks completed!")

1️⃣1️⃣ 常见问题与排错(强烈建议写)

  • 返回 403 Forbidden / 空数据:

    • 原因:Cookie 过期了,或者没有设置 Header 里的 Referer。
    • 解决:重新登录 m.weibo.cn,按 F12 -> Network -> XHR,找到 getIndex 请求,复制最新的 Cookie。
  • 词云全是方框 □□□:

    • 原因:WordCloud 默认不支持中文。
    • 解决:必须下载一个中文字体(如 SimHei.ttf 或 SourceHanSans.otf),并在代码中通过 font_path 参数指定路径。
  • Jieba 分词不准:

    • 原因:很多网络流行语(如“绝绝子”、“yyds”)Jieba 默认词库里没有。
    • 解决:使用 jieba.add_word('绝绝子') 手动添加新词,或者加载自定义词典。
  • 1️⃣2️⃣ 总结与延伸阅读

    • 复盘:我们通过抓取 Ajax 接口,实现了对社交媒体数据的“无头浏览”采集。我们不仅拿到了数据,还用 NLP 技术透视了数据背后的情绪。

    • 下一步:

    • 话题追踪:不仅仅抓取某个人,尝试抓取 #某个话题# 下的所有微博,分析舆情走向。
    • 网络关系图:利用 NetworkX 库,分析微博的转发关系,画出“谁是意见领袖(KOL)”的社交关系图。这可是非常硬核的技能!🕸️

    🌟 文末

    好啦~以上就是本期的全部内容啦!如果你在实践过程中遇到任何疑问,欢迎在评论区留言交流,我看到都会尽量回复~咱们下期见!

    小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦~ 三连就是对我写作道路上最好的鼓励与支持! ❤️🔥

    ✅ 专栏持续更新中|建议收藏 + 订阅

    墙裂推荐订阅专栏 👉 《Python爬虫实战》,本专栏秉承着以“入门 → 进阶 → 工程化 → 项目落地”的路线持续更新,争取让每一期内容都做到:

    ✅ 讲得清楚(原理)|✅ 跑得起来(代码)|✅ 用得上(场景)|✅ 扛得住(工程化)

    📣 想系统提升的小伙伴:强烈建议先订阅专栏 《Python爬虫实战》,再按目录大纲顺序学习,效率十倍上升~

    ✅ 互动征集

    想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战?

    评论区留言告诉我你的需求,我会优先安排实现(更新)哒~


    ⭐️ 若喜欢我,就请关注我叭~(更新不迷路) ⭐️ 若对你有用,就请点赞支持一下叭~(给我一点点动力) ⭐️ 若有疑问,就请评论留言告诉我叭~(我会补坑 & 更新迭代)


    ✅ 免责声明

    本文爬虫思路、相关技术和代码仅用于学习参考,对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。

    使用或者参考本项目即表示您已阅读并同意以下条款:

    • 合法使用: 不得将本项目用于任何违法、违规或侵犯他人权益的行为,包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。
    • 风险自负: 任何因使用本项目而产生的法律责任、技术风险或经济损失,由使用者自行承担,项目作者不承担任何形式的责任。
    • 禁止滥用: 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。
    • 使用或者参考本项目即视为同意上述条款,即 “谁使用,谁负责” 。如不同意,请立即停止使用并删除本项目。!!!

    赞(0)
    未经允许不得转载:171主机测评 » Python爬虫实战:Python 社交媒体挖掘 - 微博数据抓取与情感舆情分析!
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址