python爬取Json資料,re提取,儲存Json資料,進行評論分析(某奇藝鬥破蒼穹評論)

2021-04-22 19:00:02

今天,看了資料分析的一個視訊,很上頭,講的是怎麼使用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資料,做了很多工作,雖然耗時很長,不過收穫很多。

最後,感謝大家前來觀看鄙人的文章,文中或有諸多不妥之處,還望指出和海涵。