哪吒票房逼近30億,從豆瓣短評簡單分析人們對哪吒的態度
- 2019 年 10 月 3 日
- 筆記
- 暑期檔電影慘淡,但隨著哪吒爆紅開拓了新局面。這也是國產動畫的首次爆紅。在哪吒剛出,筆者
以為最多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解析。使用
xldr
、xldw
將數據寫入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')
- 對於爬取的結過一覽
- 我們要對評分進行統計、詞頻統計。還有就是生成詞雲展示。而對應的就是
matplotlib
、WordCloud
庫。
評分統計:
- 對於評分統計,使用數組將上面的
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 != 'rn': 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
持續輸出分享!