Python实战:利用微博数据生成词云爱心

顾星河
顾星河
发布时间:2026-10-14 | 5人浏览过
原创

本文详细介绍如何使用Python爬取新浪微博数据,经过清洗、分词处理后,利用wordcloud和Matplotlib工具生成个性化的词云图像。教程涵盖环境配置、数据抓取、CSV保存及图片生成全流程,帮助开发者掌握从数据采集到可视化的完整技能。

前言

前言

一年一度的情人节已过,朋友圈中充斥着各种晒照、晒娃、晒美食以及秀恩爱的内容。程序员们则在忙碌中度过,但礼物依然不能少。作为程序员,我打算用过去发布的微博数据打造一颗“爱心”作为特别礼物,相信接收者一定会感动落泪。

准备工作与工具安装

准备工作

有了想法后便立即行动,首选工具自然是Python。整体思路是将微博数据爬取下来,经过清洗和分词处理后,将结果输入词云工具,并结合科学计算与绘图库生成图像。涉及的工具包包括:

requests用于网络请求以爬取微博数据,jieba(结巴分词)用于中文分词处理,wordcloud为词云处理库,Pillow用于图片处理,NumPy作为科学计算工具,以及类似MATLAB的2D绘图库Matplotlib。

工具安装

安装这些工具包时,不同操作系统平台可能会遇到不同的错误。wordcloud、requests和jieba均可以通过标准的pip命令在线安装:


pip install wordcloud
pip install requests
pip install jieba

在Windows平台上,直接通过pip在线安装Pillow、NumPy和Matplotlib可能会遇到各种问题。推荐的方式是从Python Extension Packages for Windows 1平台下载相应的.whl文件进行安装。用户可根据自己的系统环境选择下载,例如cp27对应Python 2.7,amd64对应64位系统。下载完成后在本地进行安装。


pip install Pillow-4.0.0-cp27-cp27m-win_amd64.whl
pip install scipy-0.18.0-cp27-cp27m-win_amd64.whl
pip install numpy-1.11.3+mkl-cp27-cp27m-win_amd64.whl
pip install matplotlib-1.5.3-cp27-cp27m-win_amd64.whl

其他平台可根据错误提示通过Google搜索解决。或者直接使用Anaconda进行开发,它是Python的一个分支,内置了大量科学计算和机器学习模块。

微博数据抓取

获取数据

新浪微博官方提供的API功能有限,仅能获取用户最新发布的5条数据。因此,我们退而求其次,使用爬虫抓取数据。在抓取前评估难度,查看GitHub上是否有现成方案,发现基本没有满足需求的代码,这反而提供了思路,于是决定自行编写爬虫。

使用移动端网址进行数据爬取。发现相关接口可以分页获取微博数据,且返回格式为JSON,这大大简化了处理流程。不过,该接口需要登录后的cookies信息,登录自己的账号后,可以通过Chrome浏览器找到Cookies信息。

实现代码:


def fetch_weibo():
api = "http://m.weibo.cn/index/my?format=cards&page=%s"
for i in range(1, 102):
response = requests.get(url=api % i, cookies=cookies)
data = response.json()[0]
groups = data.get("card_group") or []
for group in groups:
text = group.get("mblog").get("text")
text = text.encode("utf-8")
text = cleanring(text).strip()
yield text

查看微博的总页数是101,考虑到一次性返回一个列表对象太费内存,函数用yield返回一个生成器,此外还要对文本进行数据清洗,例如去除标点符号,HTML标签,“转发微博”这样的字样。

数据保存与分词处理

保存数据

数据获取之后,我们要把它离线保存起来,方便下次重复使用,避免重复地去爬取。使用csv格式保存到weibo.csv文件中,以便下一步使用。数据保存到csv文件中打开的时候可能为乱码,没关系,用notepad++查看不是乱码。


def write_csv(texts):
with codecs.open('weibo.csv', 'w') as f:
writer = csv.DictWriter(f, fieldnames=["text"])
writer.writeheader()
for text in texts:
writer.writerow({"text": text})
def read_csv():
with codecs.open('weibo.csv', 'r') as f:
reader = csv.DictReader(f)
for row in reader:
yield row['text']

分词处理

从weibo.csv文件中读出来的每一条微博进行分词处理后再交给wordcloud生成词云。结巴分词适用于大部分中文使用场景,使用停止词库stopwords.txt把无用的信息(比如:的,那么,因为等)过滤掉。


def word_segment(texts):
jieba.analyse.set_stop_words("stopwords.txt")
for text in texts:
tags = jieba.analyse.extract_tags(text, topK=20)
yield " ".join(tags)

生成词云图片

生成图片

数据分词处理后,就可以给wordcloud处理了,wordcloud根据数据里面的各个词出现的频率、权重按比列显示关键字的字体大小。生成方形的图像,如图:

是的,生成的图片毫无美感,毕竟是要送人的也要拿得出手才好炫耀对吧,那么我们找一张富有艺术感的图片作为模版,临摹出一张漂亮的图出来。我在网上搜到一张“心”型图:

生成图片代码:


def generate_img(texts):
data = " ".join(text for text in texts)
mask_img = imread('./heart-mask.jpg', flatten=True)
wordcloud = WordCloud(
font_path='msyh.ttc',
background_color='white',
mask=mask_img
).generate(data)
plt.imshow(wordcloud)
plt.axis('off')
plt.savefig('./heart.jpg', dpi=600)

需要注意的是处理时,需要给matplotlib指定中文字体,否则会显示乱码,找到字体文件夹:C:\Windows\Fonts\Microsoft YaHei UI复制该字体,拷贝到matplotlib安装目录:C:\Python27\Lib\site-packages\matplotlib\mpl-data\fonts\ttf下

差不多就这样。

效果展示与总结

当我自豪地把这张图发给她的时候,出现了这样的对话:

这是什么? 我:爱心啊,亲手做的 这么专业,好感动啊,你的眼里只有python ,没有我 (哭笑) 我:明明是“心”中有 python 啊

我好像说错了什么。哈哈哈

完整代码可以Github下载。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表