Python小白都会的如何生成词云图片

简介:

很早之前写过一篇怎么利用微博数据制作词云图片出来,之前的写得不完整,而且只能使用自己的数据,现在重新整理了一下,任何的微博数据都可以制作出来,放在今天应该比较应景。

一年一度的虐汪节,是继续蹲在角落默默吃狗粮还是主动出击告别单身汪加入撒狗粮的行列就看你啦,七夕什么样的礼显得特别,程序猿可以试试用一种特别的方式来表达你对女神的心意,有一个创意是把她过往发的微博整理后用词云展示出来发给她。本文教你怎么用Python快速创建出有心意词云,Python小白也能分分钟做出来。

准备工作

本环境基于Python3,理论上Python2.7也是可行的,先安装必要的第三方依赖包:


 
 
  1. # requirement.txt 
  2. jieba==0.38 
  3. matplotlib==2.0.2 
  4. numpy==1.13.1 
  5. pyparsing==2.2.0 
  6. requests==2.18.4 
  7. scipy==0.19.1 
  8. wordcloud==1.3.1 

requirement.txt 文件中包含上面的几个依赖包,如果用 pip 方式安装失败,推荐使用 Anaconda 安装


 
 
  1. pip install -r requirement.txt 

第一步:分析网址

打开微博移动端网址 https://m.weibo.cn/searchs ,找到女神的微博ID,进入她的微博主页,分析浏览器发送请求的过程

Python小白都会的如何生成词云图片

打开 Chrome 浏览器的调试功能,选择 Network 菜单,观察到获取微博数据的的接口是 https://m.weibo.cn/api/container/getIndex ,后面附带了一连串的参数,这里面有些参数是根据用户变化的,有些是固定的,先提取出来。


 
 
  1. uid=1192515960& 
  2. luicode=10000011& 
  3. lfid=100103type%3D3%26q%3D%E6%9D%8E%E5%86%B0%E5%86%B0& 
  4. featurecode=20000320& 
  5. type=user
  6. containerid=1076031192515960 

再来分析接口的返回结果,返回数据是一个JSON字典结构,total 是微博总条数,每一条具体的微博内容封装在 cards 数组中,具体内容字段是里面的 text 字段。很多干扰信息已隐去。


 
 
  1.     "cardlistInfo": { 
  2.         "containerid""1076031192515960"
  3.         "total": 4754, 
  4.         "page": 2 
  5.     }, 
  6.     "cards": [ 
  7.         { 
  8.             "card_type": 9, 
  9.             "mblog": { 
  10.                 "created_at""08-26"
  11.                 "idstr""4145069944506080"
  12.                 "text""瑞士一日游圆满结束..."
  13.             } 
  14.         }] 

第二步:构建请求头和查询参数

分析完网页后,我们开始用 requests 模拟浏览器构造爬虫获取数据,因为这里获取用户的数据无需登录微博,所以我们不需要构造 cookie信息,只需要基本的请求头即可,具体需要哪些头信息也可以从浏览器中获取,首先构造必须要的请求参数,包括请求头和查询参数。

Python小白都会的如何生成词云图片


 
 
  1. headers = { 
  2.     "Host""m.weibo.cn"
  3.     "Referer""https://m.weibo.cn/u/1705822647"
  4.     "User-Agent""Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) " 
  5.                   "Version/9.0 Mobile/13B143 Safari/601.1"
  6.  
  7. params = {"uid""{uid}"
  8.           "luicode""20000174"
  9.           "featurecode""20000320"
  10.           "type""uid"
  11.           "value""1705822647"
  12.           "containerid""{containerid}"
  13.           "page""{page}"
  • uid是微博用户的id
  • containerid虽然不什么意思,但也是和具体某个用户相关的参数
  • page 分页参数

第三步:构造简单爬虫

通过返回的数据能查询到总微博条数 total,爬取数据直接利用 requests 提供的方法把 json 数据转换成 Python 字典对象,从中提取出所有的 text 字段的值并放到 blogs 列表中,提取文本之前进行简单过滤,去掉无用信息。顺便把数据写入文件,方便下次转换时不再重复爬取。


 
 
  1. def fetch_data(uid=None, container_id=None): 
  2.     ""
  3.     抓取数据,并保存到CSV文件中 
  4.     :return
  5.     ""
  6.     page = 0 
  7.     total = 4754 
  8.     blogs = [] 
  9.     for i in range(0, total // 10): 
  10.         params['uid'] = uid 
  11.         params['page'] = str(page) 
  12.         params['containerid'] = container_id 
  13.         res = requests.get(url, params=params, headers=HEADERS) 
  14.         cards = res.json().get("cards"
  15.  
  16.         for card in cards: 
  17.             # 每条微博的正文内容 
  18.             if card.get("card_type") == 9: 
  19.                 text = card.get("mblog").get("text"
  20.                 text = clean_html(text) 
  21.                 blogs.append(text) 
  22.         page += 1 
  23.         print("抓取第{page}页,目前总共抓取了 {count} 条微博".format(page=page, count=len(blogs))) 
  24.         with codecs.open('weibo1.txt''w', encoding='utf-8'as f: 
  25.             f.write("\n".join(blogs)) 

Python小白都会的如何生成词云图片

第四步:分词处理并构建词云

爬虫了所有数据之后,先进行分词,这里用的是结巴分词,按照中文语境将句子进行分词处理,分词过程中过滤掉停止词,处理完之后找一张参照图,然后根据参照图通过词语拼装成图。


 
 
  1. def generate_image(): 
  2.     data = [] 
  3.     jieba.analyse.set_stop_words("./stopwords.txt"
  4.  
  5.     with codecs.open("weibo1.txt"'r', encoding="utf-8"as f: 
  6.         for text in f.readlines(): 
  7.             data.extend(jieba.analyse.extract_tags(text, topK=20)) 
  8.         data = " ".join(data) 
  9.         mask_img = imread('./52f90c9a5131c.jpg', flatten=True
  10.         wordcloud = WordCloud( 
  11.             font_path='msyh.ttc'
  12.             background_color='white'
  13.             mask=mask_img 
  14.         ).generate(data) 
  15.         plt.imshow(wordcloud.recolor(color_func=grey_color_func, random_state=3), 
  16.                    interpolation="bilinear"
  17.         plt.axis('off'
  18.         plt.savefig('./heart2.jpg', dpi=1600) 

简单四步就完成了,最终效果图:

Python小白都会的如何生成词云图片

完整代码可以回复“qixi”获取,对了,还有上周的送书活动已经结束,明天会公布获奖的朋友们。


作者:佚名

来源:51CTO

相关文章
|
1月前
|
存储 人工智能 开发工具
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
只需要通过向AI助理提问的方式输入您的需求,即可瞬间获得核心流程代码及参数,缩短学习路径、提升开发效率。
1420 4
AI助理化繁为简,速取代码参数——使用python SDK 处理OSS存储的图片
|
25天前
|
Python
Python实用记录(六):如何打开txt文档并删除指定绝对路径下图片
这篇文章介绍了如何使用Python打开txt文档,删除文档中指定路径的图片,并提供了一段示例代码来展示这一过程。
26 1
|
26天前
|
计算机视觉 Python
Python实用记录(一):如何将不同类型视频按关键帧提取并保存图片,实现图片裁剪功能
这篇文章介绍了如何使用Python和OpenCV库从不同格式的视频文件中按关键帧提取图片,并展示了图片裁剪的方法。
54 0
|
3月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
269 1
|
25天前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
102 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
14天前
|
自然语言处理 Python Windows
python知识点100篇系列(23)- 使用stylecloud生成词云
【10月更文挑战第10天】`stylecloud` 是 `wordcloud` 的优化版,支持使用 Font Awesome 图标自定义词云形状,操作更简便。本文介绍如何安装 `jieba` 和 `stylecloud` 库,并使用它们生成中文词云。通过 `jieba` 进行分词,再利用 `stylecloud` 的 `gen_stylecloud` 方法生成具有特定形状和颜色的词云图像。
python知识点100篇系列(23)- 使用stylecloud生成词云
|
25天前
|
Python
Python实用记录(四):os模块-去后缀或者改后缀/指定目录下图片或者子目录图片写入txt/csv
本文介绍了如何使用Python的os模块来操作文件,包括更改文件后缀、分割文件路径和后缀、将指定目录下的所有图片写入txt文档,以及将指定目录下所有子目录中的图片写入csv文档,并为每个子目录分配一个标签。
15 1
|
29天前
|
编解码 UED Python
Python批量修改指定目录下图片的大小名文章
Python批量修改指定目录下图片的大小名文章
15 1
|
1月前
|
iOS开发 MacOS Python
Python编程小案例—利用flask查询本机IP归属并输出网页图片
Python编程小案例—利用flask查询本机IP归属并输出网页图片
|
1月前
|
自然语言处理 计算机视觉 Python
用 Python 创建词云
用 Python 创建词云
24 2