飞道的博客

python爬取Json数据,re提取,存储Json数据,进行评论分析(某奇艺斗破苍穹评论)

275人阅读  评论(0)

今天,看了数据分析的一个视频,很上头,讲的是怎么使用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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场