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

Python初学者都知道如何生成词云图

时间:2023-03-12 03:47:59 科技观察

我很早之前写过一篇文章如何使用微博数据制作词云图。之前写的不完整,只能用自己的资料。现在我重新组织了它。一键生成任意微博数据,放在今天应该比较合适。一年一度的虐狗节,是继续蹲在角落默默吃狗粮,还是主动告别单身狗加入狗粮行列,由你决定。七夕送什么礼物比较特别,程序员可以试试特别的。有一种方法可以向女神表达你的心意。一个想法是把她过去发的微博整理出来,用词云展示出来发给她。本文教你如何用Python快速制作有意义的词云,Python小白也能分分钟搞定。准备环境基于Python3。理论上Python2.7也是可行的。首先安装必要的第三方依赖:#requirement.txtjieba==0.38matplotlib==2.0.2numpy==1.13.1pyparsing==2.2.0requests==2.18.4scipy==0.19.1wordcloud==1.3.1requirement.txt文件包含上述依赖包。如果pip安装失败,建议使用Anaconda安装pipinstall-rrequirement.txt第一步:解析网址打开微博手机网址https://m.weibo.cn/searchs,找到女神的微博ID,输入她微博首页,分析浏览器发送请求的过程,打开Chrome浏览器的调试功能,选择网络菜单,观察获取微博数据的接口为https://m.weibo.cn/api/container/getIndex,后面是一系列的参数,有的是根据用户变化的,有的是固定的,先提取出来。uid=1192515960&luicode=10000011&lfid=100103type%3D3%26q%3D%E6%9D%8E%E5%86%B0%E5%86%B0&featurecode=20000320&type=user&containerid=1076031192515960然后分析接口的返回结果字典,返回的数据字典是一个JSON字典结构,total是微博总数,每条具体的微博内容封装在cards数组中,具体的内容字段就是里面的text字段。很多分散注意力的信息都被压制了。{"cardlistInfo":{"containerid":"1076031192515960","total":4754,"page":2},"cards":[{"card_type":9,"mblog":{"created_at":"08-26","idstr":"4145069944506080","text":"瑞士一日游圆满结束...",}}]}第二步:构建请求头和查询参数分析完网页,我们开始使用requests模拟浏览器构造爬虫获取数据,因为不需要登录微博获取用户数据,所以我们不需要构造cookie信息,只需要基本的请求头,具体的头信息required也可以从浏览器中获取。首先构造必要的请求参数,包括请求头和查询参数。headers={"Host":"m.weibo.cn","Referer":"https://m.weibo.cn/u/1705822647","User-Agent":"Mozilla/5.0(iPhone;CPUiPhoneOS9_1likeMacOSX)AppleWebKit/601.1.46(KHTML,likeGecko)""Version/9.0Mobile/13B143Safari/601.1",}params={"uid":"{uid}","luicode":"20000174","featurecode":"20000320","type":"uid","value":"1705822647","containerid":"{containerid}","page":"{page}"}uid是微博用户的id,虽然containerid是无意义,但也是一个具体用户页面分页参数相关的参数第三步:构造一个简单的爬虫,可以通过返回的数据查询微博总数,直接使用requests提供的方法爬取数据,将其转化为json数据转换成Python字典对象,从中提取文本字段的所有值并放入博客列表中,并在提取文本之前执行简单的过滤以删除无用信息。顺便把数据写入文件,这样下次转换的时候就不会重复爬取了。deffetch_data(uid=None,container_id=None):"""抓取数据并保存在CSV文件中:return:"""page=0total=4754blogs=[]foriinrange(0,total//10):params['uid']=uidparams['page']=str(page)params['containerid']=container_idres=requests.get(url,params=params,headers=HEADERS)cards=res.json().get("卡片")forcardincards:#每条微博的文字内容ifcard.get("card_type")==9:text=card.get("mblog").get("text")text=clean_html(text)blogs.append(text)page+=1print("抓取第{page}页,目前我们抓取了{count}条微博".format(page=page,count=len(blogs)))withcodecs.open('weibo1.txt','w',encoding='utf-8')asf:f.write("\n".join(blogs))第四步:分词处理构建词云爬取所有数据后,先进行分词,这里是口吃分词,根据中文上下文对句子进行分词,在分词的过程中过滤掉停用词,经过处理,找到一张参考图片,然后根据参考图片将词拼装成一张图片。defgenerate_image():data=[]jieba.analyse.set_stop_words("./stopwords.txt")withcodecs.open("weibo1.txt",'r',encoding="utf-8")asf:fortextinf.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',background_color='white',mask=mask_img).generate(data)plt.imshow(wordcloud.recolor(color_func=grey_color_func,random_state=3),interpolation="bilinear")plt.axis('off')plt.savefig('./heart2.jpg',dpi=1600)只需四个简单的步骤即可完成。最终效果图:完整代码可回复“qixi”获取。比赛结束后,获奖者将于明天公布。