1. 程式人生 > >反貪風暴4-貓眼影評從爬取到可視化

反貪風暴4-貓眼影評從爬取到可視化

ffffff 而且 hidden pro 請求 -a nts dcloud ech

我感覺學習python有一個階段就是熟悉它的各種第三方庫的使用,這次我們用jieba分詞,用wordcloud生成詞雲,用pyecharts生成柱狀圖,來看看吧~

若您有需要,所有文件已上傳到我的github(左上角圖標直達)~

從爬蟲開始好了,貓眼電影電腦網頁版只能看熱門影評。其實為了獲取更多影評我們可以這樣做,瀏覽器內按f12打開開發者工具,選擇手機瀏覽模式,刷新後就會是手機版的網頁了。如圖:

技術分享圖片

然後查找接口,頁面往下拉...em...很容易就找到了,是這個 技術分享圖片 這是一個js發起的get請求,看鏈接可以知道參數有
  1. movieId:1211727#電影id
  2. userId:-1#用戶id,我猜是我沒有登錄所以為-1
  3. offset:0#控制返回的影評的位置,最主要的一條
  4. limit:15#一次返回15條影評
  5. ts:0#時間戳?不確定
  6. type:3#類型

我們偽造這一條請求就能直接獲得影評了,而且返回是json格式,甚至都不用整理數據了

爬蟲代碼:

import requests
import json


headers = {
User-Agent: Mozilla/5.0 (Linux; Android 5.1.1; MI 6  Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 TitansX/11.14.7 KNB/1.2.0 android/5.1.1 com.sankuai.moviepro/com.sankuai.moviepro/5.4.4 App/10a20/5.4.4 com.sankuai.moviepro/5.4.4
, } def get_one(offset): url = https://m.maoyan.com/review/v2/comments.json? params = { movieId: 1211727, userId: -1, offset: offset, #offset控制傳來第幾頁數據 limit: 15, ts: 0, type: 3, } r = requests.get(url=url,params=params,verify=False) #
verify=False為避免ssl認證,防止訪問https時報錯,這裏假設所有訪問都會正常,沒有加容錯機制。 js = json.loads(r.text) #將返回的json轉為字典類型 with open(fantan4.json,a,encoding=utf-8) as f: json.dump({"items":js[data][comments]}, f, ensure_ascii=False, sort_keys=True, indent=4) #寫獲取的所有詳情到json文件中 f.write(,) #這裏加一個‘,‘是為了之後將json文件格式改造正確所用 comments = [] for dic in js[data][comments]: comments.append(dic[content]) #這裏獲取每條影評到列表 str1 = .join(comments) #影評列表轉字符串以‘ ‘分開 print(str1) with open(com.txt,a,encoding=utf-8) as f: f.write(str1) #單獨寫入影評到文件,用於詞雲的生成 for i in range(0,67): print(i) get_one(i*15)

保存的json我自己增加了一個鍵‘all’並以[]包含了所有的值,如圖:

技術分享圖片

數據都準備好了就開始畫圖啦~先用評論按詞頻生成詞雲看看吧~這是做蒙版的圖(自己扣出來的,羽化有點嚴重,請不要在意這些細節~~): 技術分享圖片 生成的詞雲: 技術分享圖片 生成詞雲的代碼:
from os import path     #組織文件路徑
from PIL import Image   #處理傳入的背景圖
#詞雲生成模塊
from wordcloud import WordCloud,ImageColorGenerator
import matplotlib.pyplot as plt
import jieba     #中文分詞
import numpy as np
#中文處理
import matplotlib.font_manager as fm
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding=utf-8)
#背景圖
bg = np.array(Image.open(1.jpg))

#獲取當前項目路徑
dir = path.dirname(__file__)

#添加自定義的分詞
jieba.add_word(古天樂)
jieba.add_word(林峰)
jieba.add_word(反貪)
#一些詞要去除,停用詞表
stopwords_path=stopwords.txt

#文本的名稱
text_path=com.txt

#讀取要分析的文本
text = open(path.join(dir,text_path),encoding=utf-8).read()

#函數,用於分詞
def jiebaClearText(text):
    #空列表,將已經去除的停用詞的分詞保存
    myWordList = []
    #分詞
    seg_list = jieba.cut(text,cut_all=False)
    #seg_list類型是generator
    #將每個generator的內容用/連接
    listStr = /.join(seg_list)
    #停用表
    f_stop = open(stopwords_path,encoding=utf-8)
    #讀取
    try:
        f_stop_text = f_stop.read()
    finally:
        f_stop.close()
    #停用詞格式化,用\n分開(因為原來文件裏一行一個停用詞),返回一列表

    f_stop_seg_list = f_stop_text.split(\n)
    #將用‘/‘結合的內容分開並去重用於去掉停用詞

    bookList=listStr.split(/)

    #默認模式遍歷,去掉停用詞
    for myword in bookList :
        #去掉停用詞,邏輯:若內容不在停用詞列表且長度>1則收錄
        if not ((myword.split())) in f_stop_seg_list and len(myword.strip())>1:
            myWordList.append(myword)
    return myWordList
text1 = jiebaClearText(text)

#計算詞頻
frequency = {}
for i in text1:
    print(i)
    if i in frequency:
        frequency[i]+=1
    else:
        frequency[i]=1

print(frequency)
#生成
wc = WordCloud(
    background_color = white,   #背景色
    max_words = 300,  #最大顯示詞數
    mask = bg,    #圖片背景
    min_font_size=6,  # 字最大尺寸
    max_font_size = 100,   #字最大尺寸
    random_state = 42,
    font_path=C:/Windows/Fonts/simkai.ttf #字體
).fit_words(frequency)

#為圖片設置字體
my_font = fm.FontProperties(fname=C:/Windows/Fonts/simkai.ttf)

#產生背景圖片,基於彩色圖像的顏色生成器
image_colors = ImageColorGenerator(bg)
#畫圖
plt.imshow(wc.recolor(color_func=image_colors))

#為雲圖去掉坐標軸
plt.axis(off)
#畫雲圖,顯示
plt.figure()
#為背景圖去掉坐標軸
plt.axis(off)
plt.imshow(bg,cmap=plt.cm.gray)

#保存
wc.to_file(man.png)

最後給出pyecarts生成柱狀圖的代碼:

from pyecharts import Bar
import json


#用於記錄不同性別的打分
all = {0:[0,0,0,],1:[0,0,0,],2:[0,0,0,],3:[0,0,0,],4:[0,0,0,],5:[0,0,0,],6:[0,0,0,],7:[0,0,0,],8:[0,0,0,],9:[0,0,0,],10:[0,0,0,]}
with open(fantan4.json,r,encoding=utf-8) as f:
    js = json.loads(f.read())

for i in js[all]:
    items = i[items]
    for details in items:
        score = details[score]
        #取分數
        gender = details[gender]
        #取對應性別
        all[score][gender]+=1
        print(all)
male,female,none = zip(all[0],all[1],all[2],all[3],all[4],all[5],all[6],all[7],all[8],all[9],all[10])
#以性別分開數據,這麽做為了將數據轉化滿足pyecharts輸入的要求

attr = [0分,1分,2分,3分,4分,5分,6分,7分,8分,9分,10分]
#0為男,1為女,2為未知
bar = Bar("評分",)
bar.add("男性評分", attr, male, is_stack=True)
bar.add("女性評分", attr, female, is_stack=True)
bar.add("未知性別評分", attr, none, is_stack=True)
bar.render(1.html)

效果(鼠標放上去試試~~):

女性評分
10分: 189

反貪風暴4-貓眼影評從爬取到可視化