今天,看了数据分析的一个视频,很上头,讲的是怎么使用Json库分析Json格式的数据。
我想着,我自己编一个Json文件,然后分析一下也可以。后来,觉得直接从网上爬取可能更好。
而且,我也是第一次尝试爬取Json格式的数据,挺有挑战性的。
关于这一次Json数据的网址是用Fiddler抓包抓到的,关于Fiddler的安装,可以参考我的文章:文章地址。
抓到的评论是以Json数据出现的,如下图:
完整代码如下图:
#Author:Mr.Pan_学狂
#start_time:2021/4/21/18:15
#finish_time:2021/4/21/23:40
import requests
import re
import os
import json
import jieba
from pyecharts.charts import Bar
from pyecharts import options as opts
def mark_spyder():#设置评论爬虫
#设置url地址
url = 'https://sns-comment.iqiyi.com/v3/comment/get_comments.action?agent_type=118&agent_version=9.11.5&authcookie=null&business_type=17&content_id=6037601523852600&hot_size=10&last_id=&page=&page_size=10&types=hot,time&callback=jsonp_1618934956180_39284'
headers = {
#设置请求头
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
}
response = requests.get(url,headers=headers,verify=False)#针对https,采用False
response.encoding='utf-8'#使用utf-8编码方式
html = response.text#获取页面源代码
return html#返回页面源代码
# mark_spyder()
def Json_transform():#将数据格式转换成json数据格式
html = mark_spyder()
# print(html)
reg = '{ jsonp_1618934956180_39284(.*?) }'#设置规则提取数据
content = re.findall(reg,html)[0]#返回的是列表,以下标取出值
#print(content)
if '(' in content:#目的是处理成json格式数据(字典类型)
content = content.replace('(','')#使用空字符串替换
if ')' in content:#去除括号
content = content.replace(')','')#使用空字符串替换
print(content)
#content = eval(content)
return content
# Json_transform()
def save_file():#定义函数存储数据
content = Json_transform()
if os.path.exists('G:/Json'):#若路径中存在Json文件夹,则执行追加写入操作
with open('G:/Json/mark.json','a+',encoding='utf-8') as f:
f.write(content)#将爬取到的字典格式的数据写入
else:#否则,创建Json文件夹,并且执行追加写入操作
os.mkdir('G:/Json')
with open('G:/Json/mark.json','a+',encoding='utf-8') as f:
f.write(content)
# save_file()
def read_file():#创建一个读取Json文件的函数,用Json库加载数据文件。
with open('G:/Json/mark.json','r+',encoding='utf-8') as f:
file = f.read()#读取全部内容
json_data = json.loads(file)
# print(json_data)#打印数据
#print(json_data['data'])#输出data的值
data = json_data['data']#我们要获取评论
Content_ls = []#创建一个列表用于存储评论数据
for d in data:#循环出字典data的所有键
#print(d)
try:#加入异常处理,报错则执行继续
for content in data[d]:#循环出每一个键
if type(content) is dict:#如果是字典类型
Content_ls.append(content['content'])#执行增加字典的content评论内容
except Exception:#出现异常时继续下一次循环
continue
for C in Content_ls:
C = C.strip()
# print(C)
return Content_ls
def mark_analysis():
marks = read_file()
Word_devide = []
for mark in marks:
mark = String_Process(mark)#调用字符处理函数,处理字符串
result = jieba.lcut(mark)#jieba精确分词
Word_devide.extend(result)#将每次的分词结果都加入到列表中
# print(Word_devide)
word_dict = {
}#定义一个空子典用于存储处理后的高频词和对应的词频
for Word in Word_devide:
if len(Word) == 1:#去除一些虚词(停用词),例如的,呢,吗,啊之类的词语。
continue
elif Word in word_dict.keys():
word_dict[Word] += 1#随着出现次数累加1
else:
word_dict[Word] = 1#如果是第一次则加1
# print(word_dict)
return word_dict
def Data_show():
word_dict = mark_analysis()
High_Word_Count = []#定义一个列表用于存储词频
word_count = {
}#定义一个字典用于存储梳理后的词对应的词频
for k in word_dict:
High_Word_Count.append(word_dict[k])
High_Word_Count.sort()
High_Word_Count = High_Word_Count[::-1]#反转列表
High_Word_Count = High_Word_Count[:10]#取出前十个高频词
for word in word_dict:
if word_dict[word] in High_Word_Count:
word_count[word] = word_dict[word]
else:
continue
# print(word_count)
x_ls = []#x轴数据
y_ls = []#y轴数据
for w in word_count:
x_ls.append(w)
y_ls.append(word_count[w])
# print(x_ls)
# print(y_ls)
(Bar()
.add_xaxis(x_ls) # 加入x轴的数据,list类型
.add_yaxis('出现次数', y_ls) # 加入y轴的标题和数据,也是list类型
.set_global_opts(title_opts=opts.TitleOpts(title="Json评论数据分析")) # 设置全局配置,图形的标题。
.render('F:/Json评论分析.html')
)
def String_Process(string):#定义一个字符处理函数,设置参数string,是有待处理的字符串。
varchar = r'‘’“”:#,!【】,&#|?|,&;;[?:"。]!🙏👀- '#人为设定字符集合
special_varchar = ['\r','\n','\U0001f9f8']
ls = []#定义一个列表用于存储拆散的字符
for s in string:
ls.append(s)#将字符串拆散存进列表中
for element in ls[:]:
if element in varchar or element in special_varchar:#如果在字符集合内发现,则从列表中删除
ls.remove(element)
String = ''#定义字符串
for l in ls:#将列表中拆散的元素组合回去。
String = String+l
#print("处理后的字符串:",String)#得到处理结果
return String
def main_function():#定义主函数
mark_spyder()
Json_transform()
save_file()
read_file()#调用函数
mark_analysis()
Data_show()
if __name__ == '__main__':#程序入口
main_function()
运行结果,如下图:
前十个高频词对应的词频
我们有兴趣可以自己使用wordcloud库绘制成词云,通过统计结果出现的词语,我们看出《斗破苍穹》这部动漫更新似乎是比较慢。第一次,尝试爬取Json数据,做了很多工作,虽然耗时很长,不过收获很多。
最后,感谢大家前来观看鄙人的文章,文中或有诸多不妥之处,还望指出和海涵。
转载:https://blog.csdn.net/weixin_43408020/article/details/115974829
查看评论