作者:才哥
☆
大家好,我是才哥。
作为海贼迷(不一定是真的),最近有款字节游戏的手游产品《航海王热血航线》上线了,闹的沸沸扬扬,冲到了iOS畅销榜第5。那么作为taptap迷(可能也不一定是真的),我们来一起看看大家都怎么在聊这块产品吧!
图0:航海王热血航线 开服至今评价内容词云
import requests
import pandas as pd
import jieba
import jieba.analyse
from html import unescape
from wordcloud import WordCloud,STOPWORDS
import numpy as np
from PIL import Image
import stylecloud
没有安装就安装一下对应的库即可。
本次,我们需要采集的是taptap游戏的评论。
老规矩,先打开游戏评论部分
,然后F12->Network->XHR
,再刷新页面或者下滑
,在Name中发现真实请求地址
。
图1:页面分析
如上图,可以发现真实请求地址及需要的参数如下:
# 评论数据请求接口
url = 'https://www.taptap.com/webapiv2/review/v2/by-app'
# pages = 1050
# appid = 195514
# 参数
Parames = {
'app_id': appid, # 应用id
'from': page*10, # 评论页数
'limit': 10, # 每页评论数
'sort': 'new', # 排序方式(new是最新)
'X-UA': 'V=1&PN=WebApp&LANG=zh_CN&VN_CODE=3&VN=0.1.0&LOC=CN&PLT=Android&UID=da52e3b7-a393-4a0a-b8c9-9157797114d4&VID=2663941' # 复制就行,看着像平台参数相关的
}
由于请求的数据是json
格式的,也太好处理了,我们只需要找到想要采集的字段在json
里的位置就好解析了。
图2:请求数据预览
由于不需要做特殊的数据解析处理,这里直接附上完整数据请求代码如下:
def tapReview(appid, pages):
url = 'https://www.taptap.com/webapiv2/review/v2/by-app'
# pages = 1050
# appid = 195514
dfList = []
n = 0
for page in range(pages):
Parames = {
'app_id': appid,
'from': page*10,
'limit': 10,
'sort': 'new',
'X-UA': 'V=1&PN=WebApp&LANG=zh_CN&VN_CODE=3&VN=0.1.0&LOC=CN&PLT=Android&UID=da52e3b7-a393-4a0a-b8c9-9157797114d4&VID=2663941'
}
rep = requests.get(url,params=Parames)
js = rep.json()
data = js['data']
dataList = data['list']
items = []
for li in dataList:
n = n+1
item = {}
moment = li['moment']['extended_entities']['reviews'][0]
item['评价id'] = li['moment']['id']
item['作者id'] = moment['author']['id']
item['作者'] = moment['author']['name']
item['评价创建时间'] = moment['created_time']
item['评价更新时间'] = moment['updated_time']
item['评价内容'] = unescape(moment['contents']['text'].replace('<br>','\n'))
item['评分(满分5分)'] = moment['score']
item['游戏时长'] = moment['played_tips']
items.append(item)
df = pd.DataFrame(items)
df['评价创建时间'] = pd.to_datetime(df['评价创建时间'],unit='s') + pd.Timedelta(hours=8)
df['评价更新时间'] = pd.to_datetime(df['评价更新时间'],unit='s') + pd.Timedelta(hours=8)
print(f'{n} 个 评价已经采集')
dfList.append(df)
dfs = pd.concat(dfList)
return dfs
采集的数据预览:
我们可以看到采集下来的数据很规范,这也是因为改版后的taptap评论数据信息太完善了,直接json格式包含的信息超全,评论创建日期、更新时间等等都有。如果想单独采集这些评论,以上代码就够了。
图3:采集数据预览
我们之前介绍过2种词云制作的方法,参考《【推荐收藏】介绍2种Python绘制词云的手法,你会偷偷pick谁呢?》。
这里,采取方法2的stylecloud
来进行本次词云绘制,原理不再多讲了,直接代码走起。
先定义一个绘制词云的函数:
def ciYun(data,addWords,stopWords):
'''
Parameters
----------
data : list
需要用于制作词云的文本内容列表.
addWords : list
自定义词典列表.
stopWords : list
停用词列表.
Returns
-------
None.
'''
print('\n正在作图...')
comment_data = []
for item in data:
if pd.isnull(item) == False:
comment_data.append(item)
# 添加自定义词典
for addWord in addWords:
jieba.add_word(addWord)
comment_after_split = jieba.cut(str(comment_data), cut_all=False)
words = ' '.join(comment_after_split)
# 词云停用词
stopwords = STOPWORDS.copy()
for stopWord in stopWords:
stopwords.add(stopWord)
# 添加背景图(注意背景图所在目录)
bg=np.array(Image.open(r"F:\词云\背景图.png"))
stylecloud.gen_stylecloud(
text=words,
custom_stopwords = stopwords,
palette='tableau.GreenOrange_12', # 设置配色方案
# icon_name='fas fa-apple-alt',
bg = bg, # 照片为蒙版啦
font_path='FZZJ-YGYTKJW.ttf', # 词云图 字体(中文需要设定为本机有的中文字体)
)
print('词云已生成~')
以上函数需要有3个参数,分别是:
再定义一个主函数:
def main():
# 应用id和评价页数,其中评价页数 = (评价数/10) +1
df_data = tapReview(195514,1050)
# 只取4月22日9点开服之后的评论
df_data = df_data[df_data['评价更新时间']>='2021-04-22 09:00']
# 获取评论列表
data = df_data.评价内容.to_list()
# 自定义关键词词组列表
addWords = ['氪金',"打击感","航海王",'海贼王','抽卡']
# 添加停用词(注意停用词文件所在目录)
stoptxt = pd.read_table(r'C:\Users\gongdc\Desktop\stop.txt',encoding='utf-8',header=None)
stoptxt.drop_duplicates(inplace=True)
stopWords = stoptxt[0].to_list()
# 补充的停用词(根据实际输出结果进行更迭)
words = ['n','玩','说','做','n2','开','想','更','内测','太','期待','没','少','小时','确实','玩家','级','挺','那种','行','里','中','一款']
stopWords.extend(words)
# 运行~
ciYun(data,addWords,stopWords)
# 自动打开词云图
Image.open("stylecloud.png")
以上就是本次 taptap游戏评论词云图制作流程,完整代码可以在后台回复 0426
获取。
注:代码中的应用id和页数你可以自行定义,这样就可以获取不同产品的评论内容和词云制作啦
欢迎大家添加才哥(微信号:dxaw142857
)好友进行互动交流~