写这篇文章的思路来自于这样的一盘文章:《程序员的七夕应该这么过》。
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.csdn.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
i
in
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
card
in
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
text
in
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的中文乱码解决等等等,这些都是在实际开发中的经验。
所以啊,生命在于折腾啊。
不过,七夕都过了,我这要为谁做画像呢??难过一秒钟。