使用python爬取微博数据打造一颗“心”


Posted in Python onJune 28, 2019

前言

一年一度的虐狗节终于过去了,朋友圈各种晒,晒自拍,晒娃,晒美食,秀恩爱的。程序员在晒什么,程序员在加班。但是礼物还是少不了的,送什么好?作为程序员,我准备了一份特别的礼物,用以往发的微博数据打造一颗“爱心”,我想她一定会感动得哭了吧。哈哈

准备工作

有了想法之后就开始行动了,自然最先想到的就是用 Python 了,大体思路就是把微博数据爬下来,数据经过清洗加工后再进行分词处理,处理后的数据交给词云工具,配合科学计算工具和绘图工具制作成图像出来,涉及到的工具包有:

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

工具安装

安装这些工具包时,不同系统平台有可能出现不一样的错误,wordcloud,requests,jieba 都可以通过普通的 pip 方式在线安装,

pip install wordcloud
pip install requests
pip install jieba

在Windows 平台安装 Pillow,NumPy,Matplotlib 直接用 pip 在线安装会出现各种问题,推荐的一种方式是在一个叫 Python Extension Packages for Windows 1 的第三方平台下载 相应的 .whl 文件安装。可以根据自己的系统环境选择下载安装 cp27 对应 python2.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 信息。

使用python爬取微博数据打造一颗“心”

实现代码:

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 根据数据里面的各个词出现的频率、权重按比列显示关键字的字体大小。生成方形的图像,如图:

使用python爬取微博数据打造一颗“心”

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

使用python爬取微博数据打造一颗“心”

生成图片代码:

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 ,没有我 (哭笑)
我:明明是“心”中有 python 啊

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

完整代码可以Github 下载。

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

Python 相关文章推荐
使用Python中PDB模块中的命令来调试Python代码的教程
Mar 30 Python
python统计文本字符串里单词出现频率的方法
May 26 Python
Python实现文件复制删除
Apr 19 Python
Python 列表理解及使用方法
Oct 27 Python
django 解决manage.py migrate无效的问题
May 27 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
Feb 12 Python
Python二进制文件读取并转换为浮点数详解
Jun 25 Python
手把手教你pycharm专业版安装破解教程(linux版)
Sep 26 Python
Django后端发送小程序微信模板消息示例(服务通知)
Dec 17 Python
pandas创建DataFrame的7种方法小结
Jun 14 Python
Python自动发送和收取邮件的方法
Aug 12 Python
用python计算文件的MD5值
Dec 23 Python
详解python和matlab的优势与区别
Jun 28 #Python
python中while和for的区别总结
Jun 28 #Python
python脚本当作Linux中的服务启动实现方法
Jun 28 #Python
如何用Python制作微信好友个性签名词云图
Jun 28 #Python
python打包exe开机自动启动的实例(windows)
Jun 28 #Python
python脚本开机自启的实现方法
Jun 28 #Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
Jun 28 #Python
You might like
最令PHP初学者头痛的十四个问题
2006/07/12 PHP
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
php中使用array_filter()函数过滤空数组的实现代码
2014/08/19 PHP
PHP hex2bin()函数用法讲解
2019/02/25 PHP
picChange 图片切换特效的函数代码
2010/05/06 Javascript
JavaScript 上万关键字瞬间匹配实现代码
2013/07/07 Javascript
js获取控件位置以及不同浏览器中的差别介绍
2013/08/08 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
document.write的几点使用心得
2014/05/14 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
基于javascript的COOkie的操作实现只能点一次
2014/12/26 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
python中cPickle用法例子分享
2014/01/03 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
Python中字符串的格式化方法小结
2016/05/03 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
Python 简单计算要求形状面积的实例
2020/01/18 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
共青团员自我评价范文
2014/09/14 职场文书
国博复兴之路观后感
2015/06/02 职场文书
对学校的意见和建议
2015/06/04 职场文书
个人欠条范本
2015/07/03 职场文书
vue使用watch监听属性变化
2022/04/30 Vue.js