摘要:作者周蘿卜鏈接長(zhǎng)津湖貓眼影評(píng)歡迎關(guān)注,專注數(shù)據(jù)分析數(shù)據(jù)挖掘好玩工具對(duì)于這個(gè)十一黃金周的電影市場(chǎng),絕對(duì)是長(zhǎng)津湖的天下,短短幾天,票房就已經(jīng)突破億,大有奮起直追戰(zhàn)狼的盡頭。
作者:周蘿卜 鏈接:長(zhǎng)津湖貓眼影評(píng)
歡迎關(guān)注 ,專注Python、數(shù)據(jù)分析、數(shù)據(jù)挖掘、好玩工具!
對(duì)于這個(gè)十一黃金周的電影市場(chǎng),絕對(duì)是《長(zhǎng)津湖》的天下,短短幾天,票房就已經(jīng)突破36億,大有奮起直追《戰(zhàn)狼2》的盡頭。而且口碑也是相當(dāng)?shù)母撸堁墼u(píng)分高達(dá)9.5,絕對(duì)的票房口碑雙豐收啊
下面我們就通過爬取貓眼的電影評(píng)論,進(jìn)行相關(guān)的可視化分析,看看為什么這部電影是如此的受歡迎,最后還進(jìn)行了簡(jiǎn)單的票房預(yù)測(cè),你一定不能錯(cuò)過哦,歡迎收藏學(xué)習(xí),點(diǎn)贊支持,喜歡技術(shù)交流的可以文末技術(shù)交流群。
貓眼評(píng)論爬取,還是那么老一套,直接構(gòu)造 API 接口信息即可
url = "https://m.maoyan.com/mmdb/comments/movie/257706.json?v=yes&offset=30"payload={}headers = { "Cookie": "_lxsdk_cuid=17c188b300d13-0ecb2e1c54bec6-a7d173c-100200-17c188b300ec8; Hm_lvt_703e94591e87be68cc8da0da7cbd0be2=1633622378; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; __mta=87266087.1633622378325.1633622378325.1633622378325.1; uuid_n_v=v1; iuuid=ECBA18D0278711EC8B0DFD12EB2962D2C4A641A554EF466B9362A58679FDD6CF; webp=true; ci=55%2C%E5%8D%97%E4%BA%AC; ci=55%2C%E5%8D%97%E4%BA%AC; ci=55%2C%E5%8D%97%E4%BA%AC; featrues=[object Object]; _lxsdk=92E6A4E0278711ECAE4571A477FD49B513FE367C52044EB5A6974451969DD28A; Hm_lpvt_703e94591e87be68cc8da0da7cbd0be2=1633622806", "Host": "m.maoyan.com", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36"}response = requests.request("GET", url, headers=headers, data=payload)print(response.json())
這么幾行代碼,我們就可以得到如下結(jié)果
獲取到數(shù)據(jù)后,我們就可以解析返回的 json 數(shù)據(jù),并保存到本地了
先寫一個(gè)保存數(shù)據(jù)的函數(shù)
def save_data_pd(data_name, list_info): if not os.path.exists(data_name + r"_data.csv"): # 表頭 name = ["comment_id","approve","reply","comment_time","sureViewed","nickName", "gender","cityName","userLevel","user_id","score","content"] # 建立DataFrame對(duì)象 file_test = pd.DataFrame(columns=name, data=list_info) # 數(shù)據(jù)寫入 file_test.to_csv(data_name + r"_data.csv", encoding="utf-8", index=False) else: with open(data_name + r"_data.csv", "a+", newline="", encoding="utf-8") as file_test: # 追加到文件后面 writer = csv.writer(file_test) # 寫入文件 writer.writerows(list_info)
直接通過 Pandas 來保存數(shù)據(jù),可以省去很多數(shù)據(jù)處理的事情
接下來編寫解析 json 數(shù)據(jù)的函數(shù)
def get_data(json_comment): list_info = [] for data in json_comment: approve = data["approve"] comment_id = data["id"] cityName = data["cityName"] content = data["content"] reply = data["reply"] # 性別:1男,2女,0未知 if "gender" in data: gender = data["gender"] else: gender = 0 nickName = data["nickName"] userLevel = data["userLevel"] score = data["score"] comment_time = data["startTime"] sureViewed = data["sureViewed"] user_id = data["userId"] list_one = [comment_id, approve, reply, comment_time, sureViewed, nickName, gender, cityName, userLevel, user_id, score, content] list_info.append(list_one) save_data_pd("maoyan", list_info)
我們把幾個(gè)主要的信息提取出來,比如用戶的 nickname,評(píng)論時(shí)間,所在城市等等
最后把上面的代碼整合,并構(gòu)造爬取的 url 即可
def fire(): tmp = "https://m.maoyan.com/mmdb/comments/movie/257706.json?v=yes&offset=" payload={} headers = { "Cookie": "_lxsdk_cuid=17c188b300d13-0ecb2e1c54bec6-a7d173c-100200-17c188b300ec8; Hm_lvt_703e94591e87be68cc8da0da7cbd0be2=1633622378; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; __mta=87266087.1633622378325.1633622378325.1633622378325.1; uuid_n_v=v1; iuuid=ECBA18D0278711EC8B0DFD12EB2962D2C4A641A554EF466B9362A58679FDD6CF; webp=true; ci=55%2C%E5%8D%97%E4%BA%AC; ci=55%2C%E5%8D%97%E4%BA%AC; ci=55%2C%E5%8D%97%E4%BA%AC; featrues=[object Object]; _lxsdk=92E6A4E0278711ECAE4571A477FD49B513FE367C52044EB5A6974451969DD28A; Hm_lpvt_703e94591e87be68cc8da0da7cbd0be2=1633622806", "Host": "m.maoyan.com", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36" } for i in range(0, 3000, 15): url = tmp + str(i) print(url) response = requests.request("GET", url, headers=headers, data=payload) comment = response.json() if not comment.get("hcmts"): break hcmts = comment["hcmts"] get_data(hcmts) cmts = comment["cmts"] get_data(cmts) time.sleep(10)
爬取過程如下
保存到本地的數(shù)據(jù)如下
下面我們就可以進(jìn)行相關(guān)的可視化分析了
我們首先根據(jù) comment_id 來去除重復(fù)數(shù)據(jù)
df_new = df.drop_duplicates(["comment_id"])
對(duì)于評(píng)論內(nèi)容,我們進(jìn)行去除非中文的操作
def filter_str(desstr,restr=""): #過濾除中文以外的其他字符 res = re.compile("[^/u4e00-/u9fa5^,^,^.^。^【^】^(^)^(^)^“^”^-^!^!^?^?^]") # print(desstr) res.sub(restr, desstr)
我們先來看看哪些評(píng)論是被點(diǎn)贊最多的
approve_sort = df_new.sort_values(by=["approve"], ascending=False)approve_sort = df_new.sort_values(by=["approve"], ascending=False)x_data = approve_sort["nickName"].values.tolist()[:10]y_data = approve_sort["approve"].values.tolist()[:10]b = (Bar() .add_xaxis(x_data) .add_yaxis("",y_data) .set_global_opts(title_opts = opts.TitleOpts(title="評(píng)論點(diǎn)贊前十名")) .set_series_opts(label_opts=opts.LabelOpts(is_show=True,position="right")) .reversal_axis())grid = Grid(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))grid.add(b, grid_opts=opts.GridOpts(pos_left="20%"))grid.render_notebook()
可以看到位于榜首的是一個(gè)叫“琦寶”的觀眾寫的評(píng)論,點(diǎn)贊量高達(dá)86027
再來看看評(píng)論回復(fù)的情況
reply_sort = df_new.sort_values(by=["reply"], ascending=False)x_data = reply_sort["nickName"].values.tolist()[:10]y_data = reply_sort["reply"].values.tolist()[:10]b = (Bar() .add_xaxis(x_data) .add_yaxis("",y_data) .set_global_opts(title_opts = opts.TitleOpts(title="評(píng)論回復(fù)前十名")) .set_series_opts(label_opts=opts.LabelOpts(is_show=True,position="right")) .reversal_axis())grid = Grid(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))grid.add(b, grid_opts=opts.GridOpts(pos_left="20%"))grid.render_notebook()
回復(fù)量最高的同樣是“琦寶”的評(píng)論,很好奇,他到底寫了什么呢,快來看看
df_new[df_new["nickName"].str.contains("琦寶")]["content"].values.tolist()[0]
Output:
"印象中第一次一大家子一起來看電影,姥爺就是志愿軍,他一輩子沒進(jìn)過電影院,開始還擔(dān)心會(huì)不會(huì)不適應(yīng),感謝影院工作人員的照顧,姥爺全程非常投入,我坐在旁邊看到他偷偷抹了好幾次眼淚,剛才我問電影咋樣,一直念叨“好,好哇,我們那時(shí)候就是那樣的,就是那樣的……”/n忽然覺得歷史長(zhǎng)河與我竟如此之近,剛剛的三個(gè)小時(shí)我看到的是遙遠(yuǎn)的70年前、是教科書里的戰(zhàn)爭(zhēng),更是姥爺?shù)?span id="ssyq0uy" class="token number">19歲,是真真切切的、他的青春年代!"
還真的是非常走心的評(píng)論,而且自己的家人就有經(jīng)歷過長(zhǎng)津湖戰(zhàn)役的經(jīng)歷,那么在影院觀影的時(shí)候,肯定會(huì)有不一樣的感受!
當(dāng)然我們還可以爬取每條評(píng)論的reply信息,通過如下接口
https://i.maoyan.com/apollo/apolloapi/mmdb/replies/comment/1144027754.json?v=yes&offset=0
只需要替換 json 文件名稱為對(duì)應(yīng)的 comment_id 即可,這里就不再詳細(xì)介紹了,感興趣的朋友自行探索呀
下面我們來看一下整體評(píng)論數(shù)據(jù)的情況
來看看哪些城市的評(píng)論最多呢
result = df_new["cityName"].value_counts()[:10].sort_values()x_data = result.index.tolist()y_data = result.values.tolist()b = (Bar() .add_xaxis(x_data) .add_yaxis("",y_data) .set_global_opts(title_opts = opts.TitleOpts(title="評(píng)論城市前十")) .set_series_opts(label_opts=opts.LabelOpts(is_show=True,position="right")) .reversal_axis())grid = Grid(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))grid.add(b, grid_opts=opts.GridOpts(pos_left="20%"))grid.render_notebook()
一線大城市紛紛上榜,看來這些城市的愛國(guó)主義教育做的還是要好很多呀
再來看看城市的全國(guó)地圖分布
result = df_new["cityName"].value_counts().sort_values()x_data = result.index.tolist()y_data = result.values.tolist()city_list = [list(z) for z in zip(x_data, y_data)]
可以看到,這個(gè)評(píng)論城市的分布,也是與我國(guó)總體經(jīng)濟(jì)的發(fā)展情況相吻合的
再來看看此類電影,對(duì)什么性別的觀眾更具有吸引力
attr = ["其他","男","女"]b = (Pie() .add("", [list(z) for z in zip(attr, df_new.groupby("gender").gender.count().values.tolist())]) .set_global_opts(title_opts = opts.TitleOpts(title="性別分布")) .set_series_opts(label_opts=opts.LabelOpts(is_show=True,position="right")))grid = Grid(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))grid.add(b, grid_opts=opts.GridOpts(pos_left="20%"))grid.render_notebook()
在填寫了性別的數(shù)據(jù)當(dāng)中,女性竟然多一些,這還是比較出乎意料的
貓眼是可以在沒有觀看電影的情況下進(jìn)行評(píng)論的,我們來看看這個(gè)數(shù)據(jù)的情況
result = df_new["sureViewed"].value_counts()[:10].sort_values().tolist()b = (Pie() .add("", [list(z) for z in zip(["未看過", "看過"], result)]) .set_global_opts(title_opts = opts.TitleOpts(title="是否觀看過")) .set_series_opts(label_opts=opts.LabelOpts(is_show=True,position="right")))grid = Grid(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))grid.add(b, grid_opts=opts.GridOpts(pos_left="20%"))grid.render_notebook()
大部分人都是在觀看了之后才評(píng)論的,這要在一定程度上保證了評(píng)論和打分的可靠性
貓眼頁面上是10分制,但是在接口當(dāng)中是5分制
result = df_new["score"].value_counts().sort_values()x_data = result.index.tolist()y_data = result.values.tolist()b = (Bar() .add_xaxis(x_data) .add_yaxis("",y_data) .set_global_opts(title_opts = opts.TitleOpts(title="評(píng)分分布")) .set_series_opts(label_opts=opts.LabelOpts(is_show=True,position="right")) .reversal_axis())grid = Grid(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))grid.add(b, grid_opts=opts.GridOpts(pos_left="20%"))grid.render_notebook()
可以看到5-4.5評(píng)論占據(jù)了大部分,口碑是真的好啊
對(duì)于評(píng)論時(shí)間,我這里直接使用了原生的 echarts 來作圖
from collections import Counter result = df_new["comment_time"].values.tolist()result = [i.split()[1].split(":")[0] + "點(diǎn)" for i in result]result_dict = dict(Counter(result))result_list = []for k,v in result_dict.items(): tmp = {} tmp["name"] = k tmp["value"] = v result_list.append(tmp)children_dict = {"children": result_list}
示例地址:https://echarts.apache.org/examples/zh/editor.html?c=treemap-sunburst-transition
能夠看出,在晚上的19點(diǎn)和20點(diǎn),都是大家寫評(píng)論的高峰期,一天的繁忙結(jié)束后,寫個(gè)影評(píng)放松下
接下來是每天的評(píng)論分布情況
result = df_new["comment_time"].values.tolist()result = [i.split()[0] for i in result]result_dict = dict(Counter(result))b = (Pie() .add("", [list(z) for z in zip(result_dict.keys(), result_dict.values())]) .set_global_opts(title_opts = opts.TitleOpts(title="每天評(píng)論數(shù)量")) .set_series_opts(label_opts=opts.LabelOpts(is_show=True,position="right")))grid = Grid(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))grid.add(b, grid_opts=opts.GridOpts(pos_left="20%"))grid.render_notebook()
就目前來看,幾乎所有的評(píng)論都集中在10月8號(hào),難道是上班第一天,不想上班,只想摸魚??
來看下貓眼評(píng)論用戶的等級(jí)情況,雖然不知道這個(gè)等級(jí)有啥用?
result = df_new["userLevel"].value_counts()[:10].sort_values()x_data = result.index.tolist()y_data = result.values.tolist()b = (Bar() .add_xaxis(x_data) .add_yaxis("",y_data) .set_global_opts(title_opts = opts.TitleOpts(title="用戶等級(jí)")) .set_series_opts(label_opts=opts.LabelOpts(is_show=True,position="right")) .reversal_axis())grid = Grid(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))grid.add(b, grid_opts=opts.GridOpts(pos_left="20%"))grid.render_notebook()
大家基本都是 level2,哈哈哈哈,普羅大眾嘛
我們?cè)賮砜纯丛谠u(píng)論中,各位主創(chuàng)被提及的次數(shù)情況
name = ["吳京","易烊千璽","段奕宏","朱亞文","李晨","胡軍","王寧","劉勁","盧奇","曹陽","李軍","孫毅","易","易烊","千璽"]def actor(data, name): counts = {} comment = jieba.cut(str(data), cut_all=False) # 去停用詞 for word in comment: if word in name: if word
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/122432.html
摘要:時(shí)間永遠(yuǎn)都過得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:界面如下圖電影詳情展示此功能是提供電影詳情的界面,包括演員上映時(shí)間導(dǎo)員劇情簡(jiǎn)介宣傳視頻宣傳視頻由于豆瓣官方的限制無法獲取,所以只有正在熱映板塊從貓眼獲取的電影信息才有。 Vue電影信息影評(píng)網(wǎng)站 此網(wǎng)站是我的畢業(yè)設(shè)計(jì),題目是基于HTML5的電影信息匯總弄網(wǎng)站,由于最近在看Vue.js,所以就想用Vue.js來構(gòu)建一個(gè)前端網(wǎng)站,這里code就不大篇幅的寫了,主要講一下網(wǎng)站的功能和所用到的技...
摘要:界面如下圖電影詳情展示此功能是提供電影詳情的界面,包括演員上映時(shí)間導(dǎo)員劇情簡(jiǎn)介宣傳視頻宣傳視頻由于豆瓣官方的限制無法獲取,所以只有正在熱映板塊從貓眼獲取的電影信息才有。 Vue電影信息影評(píng)網(wǎng)站 此網(wǎng)站是我的畢業(yè)設(shè)計(jì),題目是基于HTML5的電影信息匯總弄網(wǎng)站,由于最近在看Vue.js,所以就想用Vue.js來構(gòu)建一個(gè)前端網(wǎng)站,這里code就不大篇幅的寫了,主要講一下網(wǎng)站的功能和所用到的技...
摘要:準(zhǔn)備把豆瓣上對(duì)它的影評(píng)短評(píng)做一個(gè)分析。這樣就得到了最新電影的信息了。例如戰(zhàn)狼的短評(píng)網(wǎng)址為其中就是電影的,表示評(píng)論的第條評(píng)論。如下圖所示好的,至此我們已經(jīng)爬取了豆瓣最近播放電影的評(píng)論數(shù)據(jù),接下來就要對(duì)數(shù)據(jù)進(jìn)行清洗和詞云顯示了。 簡(jiǎn)介 剛接觸python不久,做一個(gè)小項(xiàng)目來練練手。前幾天看了《戰(zhàn)狼2》,發(fā)現(xiàn)它在最新上映的電影里面是排行第一的,如下圖所示。準(zhǔn)備把豆瓣上對(duì)它的影評(píng)(短評(píng))做...
摘要:戰(zhàn)爭(zhēng)已勝,精神依在,當(dāng)延續(xù)了這份堅(jiān)韌與毅力之后,所有事情都將變得有無限可能,本期成功就業(yè)的小余,正是憑借著這股毅力,完成了夢(mèng)想,取得了高薪。 伴隨著7天國(guó)慶長(zhǎng)假落...
閱讀 3120·2021-11-10 11:36
閱讀 3320·2021-10-13 09:40
閱讀 6127·2021-09-26 09:46
閱讀 668·2019-08-30 15:55
閱讀 1416·2019-08-30 15:53
閱讀 1586·2019-08-29 13:55
閱讀 3004·2019-08-29 12:46
閱讀 3217·2019-08-29 12:34