㊗️本期内容已收录至专栏《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爬虫实战》,再按目录大纲顺序学习,效率十倍上升~
✅ 互动征集
想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战?
评论区留言告诉我你的需求,我会优先安排实现(更新)哒~
⭐️ 若喜欢我,就请关注我叭~(更新不迷路) ⭐️ 若对你有用,就请点赞支持一下叭~(给我一点点动力) ⭐️ 若有疑问,就请评论留言告诉我叭~(我会补坑 & 更新迭代)
✅ 免责声明
本文爬虫思路、相关技术和代码仅用于学习参考,对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。
使用或者参考本项目即表示您已阅读并同意以下条款:
- 合法使用: 不得将本项目用于任何违法、违规或侵犯他人权益的行为,包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。
- 风险自负: 任何因使用本项目而产生的法律责任、技术风险或经济损失,由使用者自行承担,项目作者不承担任何形式的责任。
- 禁止滥用: 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。
- 使用或者参考本项目即视为同意上述条款,即 “谁使用,谁负责” 。如不同意,请立即停止使用并删除本项目。!!!



