当前位置: 首页 > 科技观察

基于微博数据用Python打造一颗“心”

时间:2023-03-14 01:00:46 科技观察

一年一度的虐狗节终于过去了,朋友圈里各种发文纷至沓来,晒自拍,晒娃,晒美食,秀恩爱。程序员在发什么,程序员在加班。但是礼物还是少不了的,送什么好呢?作为一名程序员,我准备了一份特别的礼物,用我过去发布的微博数据创造一个“爱”。我想她会感动得流泪。哈哈,有了准备工作的想法后,我就开始行动了。自然而然地,我首先想到的是使用Python。大致思路是爬取微博数据,对数据进行清洗处理,然后进行分词处理。处理后的数据交给词云工具,结合科学计算工具和绘图工具做出图像,涉及的工具包有:请求网络请求爬取微博数据、口吃分词中文分词处理、词云处理库wordcloud,图像处理库Pillow,一个科学计算工具NumPy,类似于MATLAB的二维绘图库Matplotlib工具。安装这些工具包时,不同的系统平台可能会出现不同的错误。wordcloud、requests、jieba都可以通过普通pip在线安装,pipinstallwordcloudpipinstallrequestspipinstalljieba在Windows平台直接用pip安装Pillow、NumPy、Matplotlib会出现各种问题。推荐的方式是下载对应的.whl文件安装。可以根据自己的系统环境选择下载安装python2.7对应的cp27和64位系统对应的amd64。下载到本地后,安装pipinstallPillow-4.0.0-cp27-cp27m-win_amd64.whlpipinstallscipy-0.18.0-cp27-cp27m-win_amd64.whlpipinstallnumpy-1.11.3+mkl-cp27-cp27m-win_amd64.whlpipinstallmatplotlib-1.5.3-cp27-cp27m-win_amd64.whl其他平台可以提示谷歌解决错误。或者直接基于Anaconda开发,Anaconda是Python的一个分支,内置了大量的科学计算和机器学习模块。获取数据新浪微博提供的官方API是渣男。只能获取用户***发布的5条数据。下一个最好的办法是使用爬虫来抓取数据。嗯,逛了一圈GitHub,基本没有满足需求的。它给了我一些想法,所以我决定自己写一个爬虫。使用http://m.weibo.cn/手机端URL爬取数据。发现接口http://m.weibo.cn/index/my?format=cards&page=1可以获取页面中的微博数据,返回的数据是json格式,省事不少,但是这个登录信息后界面需要cookies,您可以登录您的账户,通过Chrome浏览器查找Cookies信息。实现代码:deffetch_weibo():api="http://m.weibo.cn/index/my?format=cards&page=%s"foriinrange(1,102):response=requests.get(url=api%i,cookies=cookies)data=response.json()[0]groups=data.get("card_group")or[]forgroupingroups:text=group.get("mblog").get("text")text=text.encode("utf-8")text=cleanring(text).strip()yieldtext微博浏览总页数101考虑到一次性返回一个列表对象太占内存intensive,函数使用yield返回生成器,同时对文本进行数据清洗,比如去除标点符号、HTML标签、“转发微博”之类的词。保存数据数据获取后,我们需要离线保存,方便下次复用,避免重复爬取。以csv格式保存到weibo.csv文件中,以备下一步使用。数据保存到csv文件打开的时候,可能是乱码,没关系,用notepad++查看不是乱码。defwrite_csv(texts):withcodecs.open('weibo.csv','w')asf:writer=csv.DictWriter(f,fieldnames=["text"])writer.writeheader()对于文本中的文本:writer.writerow({"text":text})defread_csv():withcodecs.open('weibo.csv','r')asf:reader=csv.DictReader(f)forrowinreader:yieldrow['text']分词处理从weibo.csv文件中读取的每条微博都经过分词处理,然后交给wordcloud生成词云。口吃分词适合大部分中文使用场景。使用停用词库stopwords.txt过滤掉无用信息(如:of、then、because等)。defword_segment(texts):jieba.analyse.set_stop_words("stopwords.txt")fortextintexts:tags=jieba.analyse.extract_tags(text,topK=20)yield"".join(tags)生成图片数据分词processing之后,可以用wordcloud进行处理,wordcloud按照数据中每个词出现的频率和权重,按比例显示关键词的字体大小。生成方形图片,如图:是的,生成的图片没有美感。毕竟是送人的,拿来炫耀肯定得心应手吧?然后我们找一个艺术形象作为模板,复制出来。一幅美丽的图画出来了。我在网上找到一张“心形”图片:flatten=True)wordcloud=WordCloud(font_path='msyh.ttc',background_color='white',mask=mask_img).生成(数据)plt.imshow(wordcloud)plt.axis('off')plt.savefig('./heart.jpg',dpi=600)需要注意的是,在处理的时候需要给matplotlib指定一个中文字体,否则会显示乱码,找到字体文件夹:C:\Windows\Fonts\MicrosoftYaHeiUI复制字体,复制到matplotlib安装目录:C:\Python27\Lib\site-packages\matplotlib\mpl-data\fonts\ttf差不多就是这样。当我自豪地把照片发给她时,对话随之而来:这是什么?我:亲爱的,你自己做的这么专业,太感动了,你眼里只有蟒蛇,没有我(哭笑不得)我:明明你的“心里”有蟒蛇,我好像说错了什么,哈哈哈。本文首发于公众号《一个程序员的微站》(id:VTtalk)