本人作爲黃渤的粉絲,《一出好戲》當然是必看無疑呀。在今天正式觀看之前,先來通過貓眼的影評來分析下網友對它的反饋。
爬取數據
這裏通過去請求貓眼的API來抓取數據,藉助的工具是 requests
。
這裏簡單說下貓眼影評的API:
http://m.maoyan.com/mmdb/comments/movie/1203084.json?_v_=yes&offset=1
其中,1203084
表示貓眼中該電影的id(可以從貓眼官網得到),offset
表示偏移量,簡單理解就是頁數。
import requests import pandas as pd base_url = "http://m.maoyan.com/mmdb/comments/movie/1203084.json?_v_=yes&offset=" # 爬取每一頁的評論 def crawl_one_page_data(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 [] return response.json() # 解析每一個獲得的結果 def parse(data): result = [] # 影評數據在 cmts 這個 key 中 comments = data.get("cmts") if not comments: return [] for cm in comments: yield [cm.get("id"), # 影評id cm.get("time"), # 影評時間 cm.get("score"), # 影評得分 cm.get("cityName"), # 影評城市 cm.get("nickName"), # 影評人 cm.get("gender"), # 影評人性別,1 表示男性,2表示女性 cm.get("content")] # 影評內容 # 爬取影評 def crawl_film_review(total_page_num=100): data = [] for i in range(1, total_page_num + 1): url = base_url + str(i) crawl_data = crawl_one_page_data(url) if crawl_data: data.extend(parse(crawl_data)) return data columns=["id", "time", "score", "city", "nickname", "gender", "content"] df = pd.DataFrame(crawl_film_review(4000), columns=columns) # 將性別映射後的數字轉爲漢字 df["gender"] = np.where(df.gender==1, "男性", "女性") # 根據id去除重複影評 df = df.drop_duplicates(subset=["id"])
爲了避免每次分析時重新抓取數據,這裏將數據保存到本地。
# 保存抓取數據,方便後續使用。 df.to_csv("《一出好戲》影評_1000.csv", index=False) df = pd.read_csv("《一出好戲》影評_1000.csv", encoding="gbk")
性別分析
from pyecharts import Pie # 求出不同性別出現的次數 gender_count = df.gender.value_counts().to_dict() pie = Pie("性別分析") pie.add(name="", attr=gender_count.keys(), value=gender_count.values(), is_label_show=True) pie
看下結果,參與評價的用戶中,女性用戶遠高於男性用戶,黃渤的個人魅力竟然迷倒了這麼多妹子??。
評分分佈
from pyecharts import Bar # 求出不同評分出現的次數 score_count = df.score.value_counts().sort_index() score_list = score_count.index.tolist() count_list = score_count.tolist() bar = Bar("評分分佈", width=450, height=450) bar.add("", score_list, count_list) bar
可以看到,五分好評還是相當多的。這意味着大衆還是很喜歡黃渤的這個處女作的?。
不同性別評分的差異
# 求出不同性別評分的均值 sex_score_mean = df.groupby(["gender"])["score"].mean().to_dict() bar = Bar("不同性別評分的差異", width=450, height=450) bar.add("", list(sex_score_mean.keys()), list(sex_score_mean.values()), is_stack=True) bar
可以看到,男性和女性的平均評分相差不多,女性能略高一丟丟?
一線城市與二線城市的評分差異
這裏選擇四個城市,其中一線城市和二線城市(太原、西安)各兩個,來看下他們之間的評分區別。
# 求出不同城市評分的均值 city_list = ["北京", "上海", "西安", "太原"] gender_city_score_mean = df[df.city.isin(city_list)].groupby(["gender", "city"], as_index=False)["score"].mean() city_data, city_index = pd.factorize(gender_city_score_mean.city) gender_data, gender_index = pd.factorize(gender_city_score_mean.gender) data = list(zip(city_data, gender_data, gender_city_score_mean.score.values))
from pyecharts import Bar3D bar3d = Bar3D("一線城市與二線城市的評分差異", width=650, height=450) range_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'] bar3d.add("", city_index, gender_index, data, is_visualmap=True, visual_range=[0, 5], visual_range_color=range_color, grid3d_width=150, grid3d_depth=80, is_grid3d_rotate=False) bar3d
可以看到,一線城市(北京、上海)的平均評分略高於二線城市(太原、西安)的評分。
影評詞雲圖
再來看看通過大家的評論能夠得到怎麼樣的雲圖。這裏選擇的背景圖是黃渤的一張帥照~~
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator import jieba import matplotlib.pyplot as plt # 將分詞後的結果以空格連接 words = " ".join(jieba.cut(df.content.str.cat(sep=" "))) # 導入背景圖 backgroud_image = plt.imread("黃渤.jpg") # 設置停用詞 stopwords = STOPWORDS stopwords.add("電影") wc = WordCloud(stopwords=stopwords, font_path="C:/Windows/Fonts/simkai.ttf", # 解決顯示口字型亂碼問題 mask=backgroud_image, background_color="white", max_words=100) my_wc = wc.generate_from_text(words) ImageColorGenerator image_colors = ImageColorGenerator(backgroud_image) plt.imshow(my_wc ) # plt.imshow(my_wc.recolor(color_func=image_colors), ) plt.axis("off") plt.show()