1. 程式人生 > >哪吒票房逼近30億,從豆瓣短評簡單分析人們對哪吒的態度

哪吒票房逼近30億,從豆瓣短評簡單分析人們對哪吒的態度

目錄

  • 前言
  • 分析
  • 具體步驟
    • 登入
    • 爬取與儲存
    • 視覺化分析
  • 結語

 

前言


  • 暑期檔電影慘淡,但隨著哪吒爆紅開拓了新局面。這也是國產動畫的首次爆紅。在哪吒剛出,筆者以為最多10億就算不錯的了。沒想過僅過了幾天就破了10億。接著頭條又突破20億--------目前11天27億,勢頭增長依然很猛

那筆者就很好奇人們是怎麼看待這一步電影的呢?

  • 哪吒?我想哪吒是陪伴過不少人成長的一部動畫片吧,也是記憶中算得上最好看的動畫片之一了。裡面的哪吒、小豬熊、申公豹、石雞娘娘令人歷歷在目。我們或許都被哪吒的敢打敢為、勇敢和天真所感動

分析

  • 對於這麼一部爆紅的動畫電影。我想簡單分析人們對哪吒動畫電影的評價狀況
    。那麼就選擇貓眼票房或者豆瓣的短評爬下來分析了。
  • step1:開啟豆瓣主頁哪吒短評的介面。F12開啟除錯點選頁面下一頁會發現有ajax資料互動。
  • step2:分析這個介面,發現無加密。返回的是json套html需要解析處理一下。用網頁訪問這個介面。但是你會發現一旦你訪問頁面靠後它就拒絕訪問了。提示你要登入再訪問。

  • step3:思路很清晰了。只需要登入—>訪問介面爬取儲存—>視覺化分析即可

具體步驟

登入

  • 賬密登入fidder抓包發現可以直接傳送請求登入。大膽猜測沒有cookie限制。登陸後即可訪問介面!
  • 程式方面只需要根據引數進行模擬即可,登入完將cookie儲存。後面的訪問都帶著這個cookie即可。

登入部分程式碼為:

import  requests
import urllib.parse
from http import cookiejar

url='https://accounts.douban.com/j/mobile/login/basic'
header={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
'Referer': 'https://accounts.douban.com/passport/login_popup?login_source=anony',
        'Origin': 'https://accounts.douban.com',
 'content-Type':'application/x-www-form-urlencoded',
 'x-requested-with':'XMLHttpRequest',
 'accept':'application/json',
 'accept-encoding':'gzip, deflate, br',
 'accept-language':'zh-CN,zh;q=0.9',
 'connection': 'keep-alive'
 ,'Host': 'accounts.douban.com'
 }
data={
    'ck':'',
    'name':'',
    'password':'',
    'remember':'false',
    'ticket':''
}
##登入函式。post請求api。返回cookie。後面攜帶這個cookie訪問介面
def login(username,password): global data data['name']=username data['password']=password data=urllib.parse.urlencode(data) print(data) req=requests.post(url,headers=header,data=data,verify=False) cookies = requests.utils.dict_from_cookiejar(req.cookies) print(cookies) return cookies

爬取與儲存

  • 通過api的規則拼湊,抓下來的資料。我們主要需要評價星,和評論語句
  • 使用Beautifulsoup進行dom解析。使用xldrxldw將資料寫入excel檔案中。一個頁面20條。頁面url增加直到出現異常為止停止。

    主要程式碼實現:
def getcomment(cookies):
   start=0
   w = xlwt.Workbook(encoding='ascii')
   ws = w.add_sheet('sheet1')
   index=1
   while True:##存入ws.write(hang,lie,value)
     try:
       url = 'https://movie.douban.com/subject/26794435/comments?start='+str(start)+'&limit=20&sort=new_score&status=P&comments_only=1'
        start+=20
        req = requests.get(url,cookies=cookies)
        res = req.json()
        res=res['html']
        soup = BeautifulSoup(res, 'lxml')
        node = soup.select('.comment-item')
        #print(node[0])
        for va in node:
           name = va.a.get('title')
           star = va.select_one('.comment-info').select('span')[1].get('class')[0][-2]
           comment = va.select_one('.short').text
           print(name, star, comment)
           ws.write(index,0,index)
           ws.write(index, 1, name)
           ws.write(index, 2, star)
           ws.write(index, 3, comment)
           index+=1

     except Exception as  e:
          print(e)
          break
    w.save('nezha.xls')
  • 對於爬取的結過一覽

視覺化分析

  • 我們要對評分進行統計、詞頻統計。還有就是生成詞雲展示。而對應的就是matplotlibWordCloud庫。

評分統計:

  • 對於評分統計,使用陣列將上面的1,2,3,4,5,五個分數段讀取時候寫入,根據資料畫出餅狀圖分析即可。
  • 從上圖也可以知道,對於評分,大部分還是分佈在5分和4分的,佔比分別為41.2%33.4%.而2分和1分時非常少!這足以說明這部片絕對不是爛片或者爭議不是很大。一部片不可能滿足所有人。存在不滿意的都在三分但依然能夠接受。所以從評分分佈來看哪吒還是廣受支援的!

詞頻統計:

  • 根據jieba分詞。統計前面熱詞出現的次數。反應觀眾共鳴點
  • 可以看的出國產、大聖(大聖歸來對比).這些熱門話題直戳心頭!

詞雲展示:

  • 相比詞頻,詞雲無法看到詞語的準確數量,但是可以看的到更多詞彙、人們的評價。筆者這裡通過count()類(map)對分詞結果進行詞頻統計。統計完的詞頻排序前300個詞展示在2個詞雲上。這些詞語的出現頻率均大於10.所以還是有所參考價值額

  • 可以從詞雲簡單分析出大家還是很滿意的,充滿濃濃封神色彩動畫風格不屈的爭鬥國產的激動!在票房直逼30億的情況下!我、要去看了。

程式碼

  • 順便給出視覺化分析部分程式碼:
import matplotlib.pyplot as plt
import matplotlib
import jieba
import xlwt
import xlrd
from wordcloud import WordCloud
import numpy as np
from collections import Counter
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
##獲取分數的餅圖。用陣列獲取1-5分出現的次數
def anylasescore(comment):
    score=[0,0,0,0,0,0]
    count=0
    for va in comment:
        try:
            score[int(va[2])]+=1
            count+=1
        except Exception as e:
            continue
    print(score)
    label='1分','2分','3分','4分','5分'
    color = 'blue', 'orange', 'yellow', 'green', 'red'  # 各類別顏色
    size=[0,0,0,0,0]
    explode=[0,0,0,0,0]
    for i in range(1,5):
        size[i]=score[i]*100/count
        explode[i]=score[i]/count/10
    pie = plt.pie(size, colors=color, explode=explode, labels=label, shadow=True, autopct='%1.1f%%')
    for font in pie[1]:
        font.set_size(8)
    for digit in pie[2]:
        digit.set_size(8)
    plt.axis('equal')
    plt.title(u'各個評分佔比', fontsize=12)
    plt.legend(loc=0, bbox_to_anchor=(0.82, 1))  # 圖例
    # 設定legend的字型大小
    leg = plt.gca().get_legend()
    ltext = leg.get_texts()
    plt.setp(ltext, fontsize=6)
    plt.savefig("score.png")
    # 顯示圖
    plt.show()
def getzhifang(map):##詞頻的直方圖
    x=[]##詞語
    y=[]##詞語出現數量
    for k,v in map.most_common(15):
        x.append(k)
        y.append(v)
    Xi = np.array(x)
    Yi = np.array(y)
    x = np.arange(0, 15, 1)
    width = 0.6
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標籤
    plt.figure(figsize=(8, 6))  ##指定影象比例: 8:6
    plt.bar(Xi, Yi, width, color='blue', label='熱門詞頻統計', alpha=0.8,)

    plt.xlabel("詞頻")##標籤
    plt.ylabel("次數")
    plt.show()
    return
def getciyun_most(map):##獲取詞雲
    x = []
    y = []
    for k, v in map.most_common(300):##300個詞雲分2個詞雲
        x.append(k)
        y.append(v)
    xi=x[0:150]
    xi=' '.join(xi)
    print(xi)
    backgroud_Image = plt.imread('nezha.jpg')  # 如果需要個性化詞雲,哪吒背景圖
    wc = WordCloud(background_color="white",
                   width=1500, height=1200,
                   #min_font_size=40,
                   mask=backgroud_Image,
                   font_path="simhei.ttf",
                   max_font_size=150,  # 設定字型最大值
                   random_state=50,  # 設定有多少種隨機生成狀態,即有多少種配色方案
                   )  # 字型這裡有個坑,一定要設這個引數。否則會顯示一堆小方框wc.font_path="simhei.ttf"   # 黑體
    # wc.font_path="simhei.ttf"
    my_wordcloud = wc.generate(xi)
    plt.imshow(my_wordcloud)
    my_wordcloud.to_file("img.jpg")
    xi=' '.join(x[150:300])
    my_wordcloud = wc.generate(xi)
    my_wordcloud.to_file("img2.jpg")

    plt.axis("off")

def anylaseword(comment):## 分詞,去掉符號、換行等垃圾資料
    commnetstr=''
    c = Counter()
    low=Counter()
    index=0
    for va in comment:
        seg_list = jieba.cut(va[3],cut_all=False)
        index+=1
        for x in seg_list:
            if len(x) > 1 and x != '\r\n':
                 try:
                    c[x]+=1
                 except:
                     continue
        commnetstr+=va[3]
    for (k, v) in c.most_common():
        if v<5:
            c.pop(k)
            continue
        #print(k,v)
    print(len(c),c)
    getzhifang(c)
    getciyun_most(c)
    #print(commnetstr)
def anylase():
    data = xlrd.open_workbook('nezha.xls')  # 開啟xls檔案
    table = data.sheets()[0]  # 開啟第i張表
    comment = []
    for i in range(1, 500):
        comment.append(table.row_values(i))
    # print(comment)
    anylasescore(comment)
    anylaseword(comment)

if __name__ == '__main__':
    anylase()


結語

  • 如果自己需要可以到github下載專案完整程式碼。當然,只需要更改部分即可同理分析其他電影。
  • 專案依然有不夠完善地方,如影評,對不同評分的平均不同處理、其他不同角度如評論使用者性別、地點等等等等,這裡不做延申。
  • 如果對後端、爬蟲、資料結構演算法等感性趣歡迎關注我的個人公眾號交流(關注一波十年少):bigsai 持續輸出分享!