摘要:作者周蘿卜鏈接長津湖貓眼影評歡迎關注,專注數據分析數據挖掘好玩工具對于這個十一黃金周的電影市場,絕對是長津湖的天下,短短幾天,票房就已經突破億,大有奮起直追戰狼的盡頭。
作者:周蘿卜 鏈接:長津湖貓眼影評
歡迎關注 ,專注Python、數據分析、數據挖掘、好玩工具!
對于這個十一黃金周的電影市場,絕對是《長津湖》的天下,短短幾天,票房就已經突破36億,大有奮起直追《戰狼2》的盡頭。而且口碑也是相當的高,貓眼評分高達9.5,絕對的票房口碑雙豐收啊
下面我們就通過爬取貓眼的電影評論,進行相關的可視化分析,看看為什么這部電影是如此的受歡迎,最后還進行了簡單的票房預測,你一定不能錯過哦,歡迎收藏學習,點贊支持,喜歡技術交流的可以文末技術交流群。
貓眼評論爬取,還是那么老一套,直接構造 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())
這么幾行代碼,我們就可以得到如下結果
獲取到數據后,我們就可以解析返回的 json 數據,并保存到本地了
先寫一個保存數據的函數
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對象 file_test = pd.DataFrame(columns=name, data=list_info) # 數據寫入 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 來保存數據,可以省去很多數據處理的事情
接下來編寫解析 json 數據的函數
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)
我們把幾個主要的信息提取出來,比如用戶的 nickname,評論時間,所在城市等等
最后把上面的代碼整合,并構造爬取的 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)
爬取過程如下
保存到本地的數據如下
下面我們就可以進行相關的可視化分析了
我們首先根據 comment_id 來去除重復數據
df_new = df.drop_duplicates(["comment_id"])
對于評論內容,我們進行去除非中文的操作
def filter_str(desstr,restr=""): #過濾除中文以外的其他字符 res = re.compile("[^/u4e00-/u9fa5^,^,^.^。^【^】^(^)^(^)^“^”^-^!^!^?^?^]") # print(desstr) res.sub(restr, desstr)
我們先來看看哪些評論是被點贊最多的
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="評論點贊前十名")) .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()
可以看到位于榜首的是一個叫“琦寶”的觀眾寫的評論,點贊量高達86027
再來看看評論回復的情況
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="評論回復前十名")) .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()
回復量最高的同樣是“琦寶”的評論,很好奇,他到底寫了什么呢,快來看看
df_new[df_new["nickName"].str.contains("琦寶")]["content"].values.tolist()[0]
Output:
"印象中第一次一大家子一起來看電影,姥爺就是志愿軍,他一輩子沒進過電影院,開始還擔心會不會不適應,感謝影院工作人員的照顧,姥爺全程非常投入,我坐在旁邊看到他偷偷抹了好幾次眼淚,剛才我問電影咋樣,一直念叨“好,好哇,我們那時候就是那樣的,就是那樣的……”/n忽然覺得歷史長河與我竟如此之近,剛剛的三個小時我看到的是遙遠的70年前、是教科書里的戰爭,更是姥爺的19歲,是真真切切的、他的青春年代!"
還真的是非常走心的評論,而且自己的家人就有經歷過長津湖戰役的經歷,那么在影院觀影的時候,肯定會有不一樣的感受!
當然我們還可以爬取每條評論的reply信息,通過如下接口
https://i.maoyan.com/apollo/apolloapi/mmdb/replies/comment/1144027754.json?v=yes&offset=0
只需要替換 json 文件名稱為對應的 comment_id 即可,這里就不再詳細介紹了,感興趣的朋友自行探索呀
下面我們來看一下整體評論數據的情況
來看看哪些城市的評論最多呢
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="評論城市前十")) .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()
一線大城市紛紛上榜,看來這些城市的愛國主義教育做的還是要好很多呀
再來看看城市的全國地圖分布
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)]
可以看到,這個評論城市的分布,也是與我國總體經濟的發展情況相吻合的
再來看看此類電影,對什么性別的觀眾更具有吸引力
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()
在填寫了性別的數據當中,女性竟然多一些,這還是比較出乎意料的
貓眼是可以在沒有觀看電影的情況下進行評論的,我們來看看這個數據的情況
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()
大部分人都是在觀看了之后才評論的,這要在一定程度上保證了評論和打分的可靠性
貓眼頁面上是10分制,但是在接口當中是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="評分分布")) .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評論占據了大部分,口碑是真的好啊
對于評論時間,我這里直接使用了原生的 echarts 來作圖
from collections import Counter result = df_new["comment_time"].values.tolist()result = [i.split()[1].split(":")[0] + "點" 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點和20點,都是大家寫評論的高峰期,一天的繁忙結束后,寫個影評放松下
接下來是每天的評論分布情況
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="每天評論數量")) .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()
就目前來看,幾乎所有的評論都集中在10月8號,難道是上班第一天,不想上班,只想摸魚??
來看下貓眼評論用戶的等級情況,雖然不知道這個等級有啥用?
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="用戶等級")) .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,哈哈哈哈,普羅大眾嘛
我們再來看看在評論中,各位主創被提及的次數情況
name = ["吳京","易烊千璽","段奕宏","朱亞文","李晨","胡軍","王寧","劉勁","盧奇","曹陽","李軍","孫毅","易","易烊","千璽"]def actor(data, name): counts = {} comment = jieba.cut(str(data), cut_all=False) # 去停用詞 for word in comment: if word in name: if word
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/122432.html
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:界面如下圖電影詳情展示此功能是提供電影詳情的界面,包括演員上映時間導員劇情簡介宣傳視頻宣傳視頻由于豆瓣官方的限制無法獲取,所以只有正在熱映板塊從貓眼獲取的電影信息才有。 Vue電影信息影評網站 此網站是我的畢業設計,題目是基于HTML5的電影信息匯總弄網站,由于最近在看Vue.js,所以就想用Vue.js來構建一個前端網站,這里code就不大篇幅的寫了,主要講一下網站的功能和所用到的技...
摘要:界面如下圖電影詳情展示此功能是提供電影詳情的界面,包括演員上映時間導員劇情簡介宣傳視頻宣傳視頻由于豆瓣官方的限制無法獲取,所以只有正在熱映板塊從貓眼獲取的電影信息才有。 Vue電影信息影評網站 此網站是我的畢業設計,題目是基于HTML5的電影信息匯總弄網站,由于最近在看Vue.js,所以就想用Vue.js來構建一個前端網站,這里code就不大篇幅的寫了,主要講一下網站的功能和所用到的技...
摘要:準備把豆瓣上對它的影評短評做一個分析。這樣就得到了最新電影的信息了。例如戰狼的短評網址為其中就是電影的,表示評論的第條評論。如下圖所示好的,至此我們已經爬取了豆瓣最近播放電影的評論數據,接下來就要對數據進行清洗和詞云顯示了。 簡介 剛接觸python不久,做一個小項目來練練手。前幾天看了《戰狼2》,發現它在最新上映的電影里面是排行第一的,如下圖所示。準備把豆瓣上對它的影評(短評)做...
摘要:戰爭已勝,精神依在,當延續了這份堅韌與毅力之后,所有事情都將變得有無限可能,本期成功就業的小余,正是憑借著這股毅力,完成了夢想,取得了高薪。 伴隨著7天國慶長假落...
閱讀 3118·2021-11-10 11:36
閱讀 3318·2021-10-13 09:40
閱讀 6109·2021-09-26 09:46
閱讀 667·2019-08-30 15:55
閱讀 1414·2019-08-30 15:53
閱讀 1584·2019-08-29 13:55
閱讀 3001·2019-08-29 12:46
閱讀 3213·2019-08-29 12:34