爬了《邪不壓正》上萬條網(wǎng)評(píng),告訴你到底值不值得看?
萬眾期待的《邪不壓正》已上映有一周多的時(shí)間。但上映當(dāng)日早上開畫 8.2,上映不到一天閃崩到 7.1 的評(píng)分好像已經(jīng)給這部本該大展拳腳的片子,戴上了一個(gè)結(jié)結(jié)實(shí)實(shí)的囚具。
首日票房雖然過億,卻依舊不敵多日日票房冠軍的《我不是藥神》;難道姜文又搞砸了?不管如何,姜文的電影總能掀起影評(píng)人高漲的評(píng)論熱情。
接下來,我們將用 Python 爬取貓眼上萬條評(píng)論數(shù)據(jù)來分析,告訴你網(wǎng)友對(duì)姜文這部電影的反響究竟如何?
整體思路,將會(huì)從數(shù)據(jù)獲取、數(shù)據(jù)處理、數(shù)據(jù)可視化三部曲來進(jìn)行。
數(shù)據(jù)獲取
關(guān)于如何獲取網(wǎng)頁的數(shù)據(jù),我一直推薦三步走:
- 下載數(shù)據(jù)
- 解析數(shù)據(jù)
- 保存數(shù)據(jù)
在下載數(shù)據(jù)之前,我們看看貓眼官網(wǎng)的網(wǎng)頁結(jié)構(gòu),看看網(wǎng)友的評(píng)論數(shù)據(jù)接口究竟在哪?
然而,打開貓眼網(wǎng)頁(http://maoyan.com/films/248566)只有寥寥幾個(gè)評(píng)論。
那么它的數(shù)據(jù)會(huì)不會(huì)是通過 Json 格式保存到服務(wù)器中呢?無奈只能通過抓包貓眼 App 來找其數(shù)據(jù)接口。
最后,發(fā)現(xiàn)其數(shù)據(jù)接口為:
http://m.maoyan.com/mmdb/comments/movie/248566.json?_v_=yes&offset=1
其中 258566 屬于電影的專屬 id,offset 代表頁數(shù),如下圖:
最后檢驗(yàn),這個(gè)接口只給展示 1000 頁數(shù)據(jù),如下:
接口找到后,開始寫爬取數(shù)據(jù)代碼,詳情代碼如下:
- import requests
- import json
- import time
- import random
- #下載第一頁數(shù)據(jù)
- def get_one_page(url):
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
- }
- response = requests.get(url,headers=headers)
- if response.status_code == 200:
- return response.text
- return None
- #解析第一頁數(shù)據(jù)
- def parse_one_page(html):
- data = json.loads(html)['cmts']
- for item in data:
- yield{
- 'comment':item['content'],
- 'date':item['time'].split(' ')[0],
- 'rate':item['score'],
- 'city':item['cityName'],
- 'nickname':item['nickName']
- }
- #保存數(shù)據(jù)到文本文檔
- def save_to_txt():
- for i in range(1,1001):
- url = 'http://m.maoyan.com/mmdb/comments/movie/248566.json?_v_=yes&offset=' + str(i)
- html = get_one_page(url)
- print('正在保存第%d頁。'% i)
- for item in parse_one_page(html):
- with open('xie_zheng.txt','a',encoding='utf-8') as f:
- f.write(item['date'] + ',' + item['nickname'] + ',' + item['city'] + ',' +str(item['rate'])+','+item['comment']+'\n')
- time.sleep(5 + float(random.randint(1, 100)) / 20)
- if __name__ == '__main__':
- save_to_txt()
數(shù)據(jù)處理
獲取數(shù)據(jù)后發(fā)現(xiàn),會(huì)有一些數(shù)據(jù)重復(fù),如下圖:
因此需要腳本批量對(duì)數(shù)據(jù)進(jìn)行去重處理,詳情代碼如下:
- def xie_zheng(infile,outfile):
- infopen = open(infile,'r',encoding='utf-8')
- outopen = open(outfile,'w',encoding='utf-8')
- lines = infopen.readlines()
- list_l = []
- for line in lines:
- if line not in list_l:
- list_l.append(line)
- outopen.write(line)
- infopen.close()
- outopen.close()
- if __name__ == '__main__':
- xie_zheng('文本原路徑','目標(biāo)路徑')
每天可以不定時(shí)(每隔四五小時(shí)獲取一次數(shù)據(jù),基本每次可獲取 900 多條數(shù)據(jù)),最終我獲取到 7/15-7/18 之間上萬條來作為數(shù)據(jù)集分析。
數(shù)據(jù)可視化
今天,我們就用 pyecharts 將清理過后的萬條評(píng)論數(shù)據(jù)來實(shí)現(xiàn)可視化。
pyecharts 是一個(gè)用于生成 Echarts 圖表的類庫。Echarts 是百度開源的一個(gè)數(shù)據(jù)可視化 JS 庫。
用 Echarts 生成的圖可視化效果非常棒,pyecharts 是為了與 Python 進(jìn)行對(duì)接,方便在 Python 中直接使用數(shù)據(jù)生成圖。(詳情請(qǐng)看:http://pyecharts.org/)
粉絲北上廣及沿海一帶居多
由上圖,可以看出北上廣一帶的用戶相對(duì)較多,這些地方的互聯(lián)網(wǎng)用戶基數(shù)本來就大,同時(shí)沿海一代的三四線城市也成為票房貢獻(xiàn)者的一部分。
詳情代碼如下:
- from pyecharts import Style
- from pyecharts import Geo
- #讀取城市數(shù)據(jù)
- city = []
- with open('xie_zheng.txt',mode='r',encoding='utf-8') as f:
- rows = f.readlines()
- for row in rows:
- if len(row.split(',')) == 5:
- city.append(row.split(',')[2].replace('\n',''))
- def all_list(arr):
- result = {}
- for i in set(arr):
- result[i] = arr.count(i)
- return result
- data = []
- for item in all_list(city):
- data.append((item,all_list(city)[item]))
- style = Style(
- title_color = "#fff",
- title_pos = "center",
- width = 1200,
- height = 600,
- background_color = "#404a59"
- )
- geo = Geo("《邪不壓正》粉絲人群地理位置","數(shù)據(jù)來源:戀習(xí)Python",**style.init_style)
- attr,value= geo.cast(data)
- geo.add("",attr,value,visual_range=[0,20],
- visual_text_color="#fff",symbol_size=20,
- is_visualmap=True,is_piecewise=True,
- visual_split_number=4)
- geo.render()
評(píng)論兩極分化相對(duì)嚴(yán)重
獲取到近幾日的網(wǎng)友上萬條評(píng)論數(shù)據(jù)后,我們切換到今天主題,看看網(wǎng)友對(duì)這部電影究竟評(píng)論如何?
我們將數(shù)據(jù)集中的評(píng)論內(nèi)容提取出來,將評(píng)論分詞后制作如下詞云圖:
從詞云中可以看出,排名靠前的熱詞分別是姜文、不錯(cuò)、好看、彭于晏、劇情、看不懂等。
因此可以看出大家對(duì)電影的評(píng)價(jià)還不錯(cuò),同時(shí)估計(jì)還有一大部分粉絲是專門看國民老公彭于晏的裸奔與八塊腹肌的(哈哈哈)。
至于劇情方面,相對(duì)于《讓子彈飛》,《邪不壓正》用了更“姜文”更癲狂的方式來講了一個(gè)相對(duì)簡(jiǎn)單的故事。
從砰砰砰幾槍打出片名的那一刻起,影片就在一個(gè)極度亢奮的節(jié)奏之下不停向前推進(jìn)著,伴隨著應(yīng)接不暇的戲謔臺(tái)詞,姜文無時(shí)無刻不在釋放自己的任性,太瘋了,甚至有些極端。
對(duì)于普通觀眾來說,太難消化了,上一秒還沒琢磨明白,下一秒又迎來了一個(gè)亢奮且莫名的環(huán)境和臺(tái)詞中(也驗(yàn)證評(píng)論中一部分網(wǎng)友對(duì)劇情看不懂的評(píng)價(jià))。
詳情代碼如下:
- import pickle
- from os import path
- import jieba
- import matplotlib.pyplot as plt
- from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
- comment = []
- with open('quan.txt',mode='r',encoding='utf-8') as f:
- rows = f.readlines()
- for row in rows:
- if len(row.split(',')) == 5:
- comment.append(row.split(',')[4].replace('\n',''))
- comment_after_split = jieba.cut(str(comment),cut_all=False)
- wl_space_split= " ".join(comment_after_split)
- #導(dǎo)入背景圖
- backgroud_Image = plt.imread('C:\\Users\\Administrator\\Desktop\\1.jpg')
- stopwords = STOPWORDS.copy()
- #可以加多個(gè)屏蔽詞
- stopwords.add("電影")
- stopwords.add("一部")
- stopwords.add("一個(gè)")
- stopwords.add("沒有")
- stopwords.add("什么")
- stopwords.add("有點(diǎn)")
- stopwords.add("這部")
- stopwords.add("這個(gè)")
- stopwords.add("不是")
- stopwords.add("真的")
- stopwords.add("感覺")
- stopwords.add("覺得")
- stopwords.add("還是")
- #設(shè)置詞云參數(shù)
- #參數(shù)分別是指定字體、背景顏色、最大的詞的大小、使用給定圖作為背景形狀
- wc = WordCloud(width=1024,height=768,background_color='white',
- mask=backgroud_Image,font_path="C:\simhei.ttf",
- stopwords=stopwords,max_font_size=400,
- random_state=50)
- wc.generate_from_text(wl_space_split)
- img_colors= ImageColorGenerator(backgroud_Image)
- wc.recolor(color_func=img_colors)
- plt.imshow(wc)
- plt.axis('off')#不顯示坐標(biāo)軸
- plt.show()
- #保存結(jié)果到本地
- wc.to_file('保存路徑')
一星級(jí)影評(píng)占比高達(dá) 20%
圖中可以看出,五星級(jí)比例接近 40%,而一星級(jí)比例與四星級(jí)比例幾乎差不多,幾乎都為 20%。(備注:一星級(jí)數(shù)量等于 1 與 0.5 的總和,以此類推)
很明顯,姜文再次掀起了影評(píng)人和觀眾的論戰(zhàn),盡管姜文對(duì)影評(píng)人并不友好,但影評(píng)人還是愿意去袒護(hù)姜文。
其實(shí),姜文的電影關(guān)鍵在于你期待什么?類型片?姜文拍的從來都不是類型片。
藝術(shù)片?姜文電影里的藝術(shù)不是一遍就可以看懂的。他的電影就是帶著一種“后搖風(fēng)格”,濃烈、生猛。
姜文和觀眾都很自我,姜文端著,不肯向市場(chǎng)低頭;觀眾正是因?yàn)闆]端著,所以看姜文的電影過于疲憊。誰都沒錯(cuò),誰都不用救。
詳情代碼如下:
- from pyecharts import ThemeRiver
- rate = []
- with open('quan.txt',mode='r',encoding='utf-8') as f:
- rows = f.readlines()
- for row in rows:
- if len(row.split(',')) == 5:
- rate.append(row.split(',')[3].replace('\n',''))
- print(rate.count('5')+rate.count('4.5'))
- print(rate.count('4')+rate.count('3.5'))
- print(rate.count('3')+rate.count('2.5'))
- print(rate.count('2')+rate.count('1.5'))
- print(rate.count('1')+rate.count('0.5'))
- #餅狀圖
- from pyecharts import Pie
- attr = ["五星", "四星", "三星", "二星", "一星"]
- #分別代表各星級(jí)評(píng)論數(shù)
- v1 = [3324,1788,1293,553,1653]
- pie = Pie("餅圖-星級(jí)玫瑰圖示例", title_pos='center', width=900)
- pie.add("7-17", attr, v1, center=[75, 50], is_random=True,
- radius=[30, 75], rosetype='area',
- is_legend_show=False, is_label_show=True)
- pie.render()
關(guān)于《邪不壓正》網(wǎng)友評(píng)論數(shù)據(jù)就分析到此結(jié)束!
你覺得《邪不壓正》不好看是對(duì)的,因?yàn)樗牧?;你若覺得《邪不壓正》好看也是對(duì)的,因?yàn)樗娴奶牧?。成也姜文,敗也姜文!但這也許就是他孤傲的世界吧。