用數據說話爲何《一出好戲》首日就能拿下1.5億票房.

本人作爲黃渤的粉絲,《一出好戲》當然是必看無疑呀。在今天正式觀看之前,先來通過貓眼的影評來分析下網友對它的反饋。

爬取數據

這裏通過去請求貓眼的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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章