预定热榜!!!用python分析taptap游戏评价,生成词云,源码赠送

举报
香菜聊游戏 发表于 2021/09/06 08:46:03 2021/09/06
【摘要】 预定热榜!!!用python分析taptap游戏评价,生成词云,源码赠送

今天在看taptap 的有什么新游戏的时候,突发奇想看看排行榜上的游戏玩家都在评论什么,所以选择一款游戏进行分析,我选择《原神》这款现在在比较火的游戏,废话不多说,我们开始吧。

TapTap 是一个推荐高品质手游的手游分享社区,实时同步全球各大应用市场游戏排行榜,与全球玩家共同交流并发掘高品质手游。每一款推荐游戏,都是由专业的测评团队从全球海量的游戏中精选而出,只为你提供好玩的手机游戏。

1、需求分析:


需要对目标网站进行评论的爬取,然后需要对其中的词进行分析,画出一个词云,需求很简单,一句话结束,这就是项目经理,哈哈,程序员忙活半天。

程序分析:

  找到目标游戏api主页

  爬取评论

  对评论进行分词

  去除一些没有意义的词,比如 我,的 这种停用词

  绘制词云

  输出图片

2、技术分析


2.1 爬取数据


目标网站:https://www.taptap.com/top/cloud-game


06f4ad9840f5c454be88a690a694012b.png


打开详情页,https://www.taptap.com/app/168332/review

可以看到下面的评论,说啥的都有,唉,做游戏真难。


2.png



常规操作,打开F12 ,然后一直往下拖动,可以看到评论是动态加载的,既然是动态加载的我们看下到底怎么请求的?


3.png


https://www.taptap.com/webapiv2/review/v2/by-app?app_id=168332&from=20&limit=10&X-UA=V%3D1%26PN%3DWebApp%26LANG%3Dzh_CN%26VN_CODE%3D41%26VN%3D0.1.0%26LOC%3DCN%26PLT%3DPC%26DS%3DAndroid%26UID%3D59e7bddc-565f-4774-a945-0cbcc13c1ad3%26DT%3DPC


分析下url

from=20&limit=10 :盲猜是从第20个开始,请求10个评论,多次拖动后验证了猜想,优秀

X-UA:X:在计算机中一般表示 extend,扩展的意思 UA:User Agent,有啥用我也不知道,直接拷出来就行了

我们试试修改from 和to 参数直接请求看看结果:


4.png


完美,看起来可以直接请求数据,因此我们可以直接修改参数,一直请求就可以了

2.2 词云的创建


词云的创建没什么难度,只是需要面对的是对评论数据的处理,然后调用wordCloud 就可以了,为了能有人更多的读取这篇文章,我给自己加了个难度,对一个美女图片进行了扣取,然后显示成美女的形状,看下原图


5.jpg



就问你稀不稀罕?

3、show you code


3.1 环境的安装


我的环境 :

python:python3.8

OS : win7

IDE :pycharm

拷贝下面几个命令到控制台,安装必要的包,注:一次使用一条哦

pip install matplotlib
pip install jieba
pip install wordcloud


3.2 爬取评论的代码

#!/usr/bin/env python
# encoding: utf-8
 
 
"""
#Author: 香菜
@time: 2021/9/2 0002 下午 9:07
"""
import requests
 
def get_content(url):
   try:
       user_agent = 'Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0'
       response = requests.get(url, headers={'User-Agent': user_agent})
       response.raise_for_status()  # 如果返回的状态码不是200, 则抛出异常;
       response.encoding = response.apparent_encoding  # 判断网页的编码格式, 便于respons.text知道如何解码;
   except Exception as e:
       print("爬取错误")
   else:
       print(response.url)
       print("爬取成功!")
       return response.json()
if __name__ == '__main__':
   # baseUrl = "https://www.taptap.com/app/168332/review"
   # https://www.taptap.com/webapiv2/review/v2/by-app?app_id=168332&from=30&limit=10&X-UA=V%3D1%26PN%3DWebApp%26LANG%3Dzh_CN%26VN_CODE%3D41%26VN%3D0.1.0%26LOC%3DCN%26PLT%3DPC%26DS%3DAndroid%26UID%3D929182cb-bba8-4a5d-aee8-3aaacb24dcc7%26DT%3DPC
   fromWhere = 0
   fileName = 'comments.txt'
   while fromWhere != -1:
       url = 'https://www.taptap.com/webapiv2/review/v2/by-app?app_id=168332&from='+str(fromWhere)+'&limit=10&X-UA=V%3D1%26PN%3DWebApp%26LANG%3Dzh_CN%26VN_CODE%3D41%26VN%3D0.1.0%26LOC%3DCN%26PLT%3DPC%26DS%3DAndroid%26UID%3D929182cb-bba8-4a5d-aee8-3aaacb24dcc7%26DT%3DPC'
       jsonData = get_content(url)
       for item in jsonData['data']['list']:
           comment = item['moment']['extended_entities']['reviews']
           for c in comment:
               with open(fileName, 'a+', encoding='utf-8') as f:
                   f.write(c['contents']['text'])
 
       fromWhere += 10
 
       if fromWhere >50:
           fromWhere = -1


注:我将下载的评论写入到了文本文件comments.txt中,

我只爬取了50条的评论,没有爬取更多的内容,你可以修改参数进行爬取。

3.3 词云的制作


#!/usr/bin/env python
# encoding: utf-8
from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud, STOPWORDS
 
"""
#Author: 香菜
@time: 2021/9/2 0002 下午 8:36
"""
# # 安装:pip install matplotlib
# # 安装:pip install jieba
# # 安装pip install wordcloud
if __name__ == '__main__':
   # 1、下载数据
   # 2、整理数据
   # 3、画词云
   # !/usr/bin/Python
   # -*- coding: utf-8 -*-
   ###当前文件路径
   d = path.dirname(__file__)
 
   # 读取文本
   file = open(path.join(d, 'comments.txt'),encoding='utf-8').read()
   ##进行分词
   default_mode = jieba.cut(file)
   text = " ".join(default_mode)
   alice_mask = np.array(Image.open(path.join(d, "0.jpeg")))
   # stop = open('baidu_stop.txt', 'r+', encoding='utf-8')
   # 用‘\n’去分隔读取,返回一个一维数组
   stopword = set(map(str.strip, open('baidu_stop.txt',encoding='utf-8').readlines()))
   stopwords = set(stopword)
   wc = WordCloud(
       # 设置字体,不指定就会出现乱码,这个字体文件需要下载
       font_path=r'c:\windows\fonts\simsun.ttc',
       background_color="white",
       max_words=2000,
       mask=alice_mask,
       stopwords=stopwords)
   # 生成词云
   wc.generate(text)
 
   # 放到图片中
   wc.to_file(path.join(d, "香菜.jpg"))
 
   # show
   plt.imshow(wc, interpolation='bilinear')
   plt.axis("off")
   plt.figure()
   plt.imshow(alice_mask, cmap=plt.cm.gray, interpolation='bilinear')
   plt.axis("off")
   plt.show()
   pass


3.4 处理结果


爬取的数据

5.png

生成的图片,注:右边是生成的词云,左边是原图

6.png

4、遇到的问题


4.1 json 数据的读取


使用requests 请求回来数据后是json 数据,使用下面的方式接收jsons

response.json()


4.2 json 数据路径的查看


返回来的json数据结构曾经蛮复杂的,下面是我在调试时的json数据,可以看到一层套一层的,非常复杂,在开发的过程中如果不好知道路径,可以调试模式下,断点看下参数是什么样子,然后继续写。小技巧!


7.png

4.3 jieba 的使用


jieba分词我们之前就用过,可以看下上篇:震惊了,用Python这么简单实现了聊天系统的脏话,广告检测

在调试的过程中我发现一些无意义的词汇占了很大比例,比如我,我的等等这种词汇,明显不是我想要的,所以要去除这些词汇。专业里面来说叫停用词。

停用词是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为Stop Words(停用词)。这些停用词都是人工输入、非自动化生成的

我在代码中也提供了停用词,需要的可以下载。如果有些词停用词中没有,你可以手动添加。

4.4 图片的扣取


原图是这样的,我想要扣除后面的背景,只留下美女的轮廓,对于一个程序员来说,这真的挺难,最后还是自己瞎折腾了一下才搞定,这真的好难。

8.png

4.5 字体的绘制


在绘制的时候,如果不选择中文字体,可能会乱码,所以选择了simsun.ttc。

window中自带的字体都有下面这些,你可以自己切换,看下不同的效果

9.png

5、还有哪些优化点


这里我只是为了完成一个小的功能,将功能进行了分解,但是还是有一些优化点。

5.1 拉取子评论


可以把评论里面的子评论也进行拉取,作为数据进行导入,这样分析可能更全面

5.2 可以拉取游戏的评分


每个评论都对游戏进行了打分,可以分开对不同打分的评论进行处理,看下不同分数下各种评论的问题焦点,可以做出不同的优化

5.3 对爬取的直接分词


现在的操作是将爬取和绘制词云进行了分开处理,这样分两步了,多次操作词云都要重新分词和绘制。可以在爬取的时候直接分词,这样在绘制词云的时候可以避免重复的操作

5.4 不存入txt


可以将爬取的输入放入redis,这样操作速度更快。

总结:
这个还是花了不少时间写的代码,总结成文章也花了不少时间,不知道能不能说清楚,有问题的话可以留言

原创不易,求个点赞转发,支持一下。​​​​​​​

完整资源下载地址:https://download.csdn.net/download/perfect2011/21930270


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。