Python 微博画像分析
写这篇文章的思路来自于这样的一盘文章:《程序员的七夕应该这么过》。https://mp.weixin.qq.com/s/CF0rCG8r54AQIvVmBcqkpw
在写这篇文章之前,我对Python的涉猎并不多,很多基础知识都是现学现用,中间也出现了很多问题,最终也都一一解决,也是颇为不易。
在看这篇文章前,我的MAC还只有系统自带的Python2.7环境,而这篇文章要求的运行环境是Python3.0以上,为此,我并没有在七夕,也就是昨天就鼓捣出来整个项目,而是用了一个七夕去安装Python3.0的环境,真的要手动滑稽一下,hhhhhh。
在MAC上安装Python 3.0的教程,可以查看我的前一篇博客 :MAC 下 Python3 环境安装
言归正传,进入正题。
首先介绍本人开发环境: 系统: MAC OS 10.12.5
Python版本: Python 3.6
Conda版本: Conda 4.3.25
今天,我要做的是一件什么事情呢?就是要对微博数据进行爬取,然后对数据进行清洗加工后进行分词处理,将处理后的数据交给词云工具,再配合科学计算工具和绘图工具绘制出图像出来。
这一系列的工作,涉及到的工具包包括: 网络请求包 Requests、中文分词处理 jieba 、 词云处理 wordcloud 、 图片处理库 Pillow、科学计算工具 Numpy、2D绘图库 Matplotlib。
因此,下一步,就是一一下载上面提到的库。
下载的方法通过 pip install 和 conda install 结合起来,主要原因在于conda 无法找到 jieba 、和wordcloud这两款对应的工具包,只可以通过pip install下载。我在 MAC
下 Python3 环境安装 提到了如何为 conda 添加国内镜像源从而提高下载速度,在这里也提下如何添加 pip 国内镜像源来提高下载速度,附上相关链接,需要的自行查阅 http://blog.****.net/lambert310/article/details/52412059
在安装好相关工具之后,我们顺着《程序员的七夕应该这么过》的思路走。
首先,我们打开微博,搜索某某明星女神的微博,这里我们以李冰冰为例子来做分析,进入她的微博主页,分析浏览器的的发送请求过程。
刷新网页或者第一次请求网页,打开调试窗口,发现如下XHR请求,双击其中一条请求,我们可以查看这条请求的详细信息如下:
通过这个链接可以提取出如下关键字:
且不管这些关键字的具体含义是什么,这些字段在接下来的爬取过程中将会用到。
再来分析请求的返回结果,返回数据是一个JSON字典结构,total 是微博总条数,每一条具体的微博内容封装在 cards 数组中
分析完网页后,我们开始用 requests 模拟浏览器构造爬虫获取数据,因为这里获取用户的数据无需登录微博,所以我们不需要构造 cookie信息,只需要基本的请求头即可,具体需要哪些头信息也可以从浏览器中获取,首先构造必须要的请求参数,包括请求头和查询参数。这一部分内容,我们同样可以在同一个xhr请求中获得。
于是,我们可以构建如下headers:
headers = {
"User-Agent":"Mozilla/5.0(Linux;
Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Mobile
Safari/537.36",
}
params = {"uid":"{uid}",
"luicode":"20000174",
"featurecode":"20000320",
"type":"uid",
"value":"1705822647",
"containerid":"{containerid}",
"page":"{page}”}
在经过前文的这些爬取准备基础之后,就可以开始构建我们的简单爬虫系统了,代码来源来自于:https://mp.weixin.qq.com/s/CF0rCG8r54AQIvVmBcqkpw
通过返回的数据能查询到总微博条数 total,爬取数据直接利用
requests 提供的方法把 json 数据转换成 Python 字典对象,从中提取出所有的 text 字段的值并放到 blogs 列表中,提取文本之前进行简单过滤,去掉无用信息。顺便把数据写入文件,方便下次转换时不再重复爬取。
def fetch_data(uid=None,
container_id=None):
"""
抓取数据,并保存到CSV文件中
:return:
"""
page = 0
total = 4754
blogs = []
for iin
range(0, total // 10):
params['uid'] = uid
params['page'] = str(page)
params['containerid'] = container_id
res = requests.get(url, params=params, headers=headers)
cards = res.json().get("cards")
for cardin
cards:
#每条微博的正文内容
if
card.get("card_type") == 9:
text = card.get("mblog").get("text")
text = clean_html(text)
blogs.append(text)
page += 1
print("抓取第{page}页,目前总共抓取了
{count} 条微博".format(page=page,
count=len(blogs)))
with codecs.open('weibo1.txt', 'w', encoding='utf-8')as
f:
f.write("\n".join(blogs))
将爬取到的微博数据,保存在weibo1.txt文件里面,作为词元处理数据源。
下一步进行分词处理并构建词云。
爬虫了所有数据之后,先进行分词,这里用的是结巴分词,按照中文语境将句子进行分词处理,分词过程中过滤掉停止词,处理完之后找一张参照图,然后根据参照图通过词语拼装成图。
由于在MAC环境进行相关词云分析处理,wordcloud如果没有添加MAC环境下的中文字体库路径,将会出现中文乱码现象,因此,对原文的中文字体库路径做了更改,改为MAC环境下的字体库路径
def generate_image():
data = []
jieba.analyse.set_stop_words("./stopwords.txt”)
alice_coloring = imread('./52f90c9a5131c.jpg', flatten=True)
##从背景图片生成颜色值
image_colors = ImageColorGenerator(alice_coloring)
with codecs.open("weibo1.txt",
'r', encoding="utf-8")as
f:
for textin
f.readlines():
data.extend(jieba.analyse.extract_tags(text, topK=20))
data =" ".join(data)
mask_img = imread('./52f90c9a5131c.jpg', flatten=True)
wordcloud = WordCloud(
# font_path='msyh.ttc’,
##添加MAC路径的中文字体库宋体作为标准字体库
font_path='/Library/Fonts/Songti.ttc',
background_color='white',
mask=mask_img
).generate(data)
plt.imshow(wordcloud.recolor(color_func=image_colors, random_state=3),
interpolation="bilinear")
plt.axis('off')
plt.savefig('./heart2.jpg', dpi=1600)
至此,完成了从依赖库安装、Python微博数据采集、Python构建简单爬虫、Python分词处理并构建词云这一系列过程,完成效果如下:
在完成了《程序员的七夕应该这么过》这篇文章的主要思路之后,我本人对于最后的结果呈现效果并不是很满意,所以,进行了二次词云分解处理,思路来自于:http://www.cnblogs.com/lyrichu/p/6151265.html
最后的呈现结果如下所示:多了彩色效果好看多了。
最后,就是整体工作的总结了。在这篇文章中,介绍到的内容可以说是很多了,在很多内容上,我还只是处于知其然而不知其所以然的基础上,代码完整性也都是来自于《程序员的七夕应该这么过》。
不过对于Python小白的我,刚刚接触Python这个领域的世界,也被Python这个神奇的世界给迷住了。正所谓纸上得来终觉浅,绝知此事要躬行。我们看那诸多的技术博客,往往存在这样的两种人,一种人认为,哇,如此高大上,定是难以企及的物种;一种人则认为,不过如此,三两行代码而已,我何必动手,欣赏就好了。这样子,少了实战,一切都是镜花水月一般。 就比如我,若是没有经过这一天的实战折腾,又怎么会知道MAC 下Python3的安装,Conda的国内镜像源加速、wordcloud的中文乱码解决等等等,这些都是在实际开发中的经验。
所以啊,生命在于折腾啊。
不过,七夕都过了,我这要为谁做画像呢??难过一秒钟。