python爬取2019年猫眼电影并进行数据分析(一)

1.数据来源

我们爬取的内容来源于猫眼电影.
我们先来寻找一下数据接口,一般是保存在JSON里面。
JSON接口是:http://piaofang.maoyan.com/second-box?beginDate=20190726
在这里插入图片描述
在这里插入图片描述
我们先简单获取2019-07-26这一天的电影内容。

import requests
import pandas as pd

url = 'http://piaofang.maoyan.com/second-box?beginDate=20190726'
res = requests.get(url)
data=res.json()
data

我们拿到 json 数据之后,就可以解析 json, 并存入 csv 文件中了

CsvFileName="test.csv"
CsvData=[]
for d in data['data']['list']:
    dd=[d['movieId'],
        d['movieName'],
        d['boxInfo'],
        d['sumBoxInfo'],
        d['avgShowView'],
        d['boxRate'],
        d['showInfo'],
        d['avgSeatView'],
        data['data']['queryDate']]
    CsvData.append(dd)

with open(CsvFileName, 'w+') as csvfile:
    spamwriter = csv.writer(csvfile, dialect='excel')
    spamwriter.writerow(['movieId','movieName','boxInfo','sumBoxInfo','avgShowView','boxRate','showInfo','avgSeatView','time'])
    for item in CsvData:
        spamwriter.writerow(item)

我们看一下得到的电影数据。
在这里插入图片描述

2.数据爬取

我们按照上面解析的json内容,很容易得到全年的电影数据。这里我们爬取的是2019年的所有电影数据。

df=pd.read_csv('./movie_data_2019.csv')
print(df.shape)
df.head()

在这里插入图片描述

3.数据分析与作图

3.1可视化票房排名靠前的电影有哪些
from pyecharts import options as opts
from pyecharts.charts.basic_charts.pie import Pie
from pyecharts.charts.basic_charts.bar import Bar
from pyecharts.charts.basic_charts.pictorialbar import PictorialBar
from pyecharts.charts.basic_charts.line import Line
from pyecharts.globals import SymbolType
from pyecharts.commons.utils import JsCode
from pyecharts.charts.composite_charts.page import Page
symbol = 'path://M583.410406 459.19064 583.410406 290.595079c28.329288 8.817515 55.558947 25.441992 85.468057 50.048512l110.018264-117.509875c-51.778841-50.331098-113.945805-88.72292-195.48632-100.709294L583.410406 0.138222 438.381119 0.138222l0 124.681017C312.813436 150.004241 207.932921 199.417957 207.932921 355.033996c0 101.556029 129.173732 157.029995 230.448198 198.143247l0 183.528615c-40.623845-8.027092-83.485856-27.68323-134.641165-62.789473L207.932921 813.011357c64.724576 53.95148 156.66038 82.717959 230.448198 91.112618l0 119.878072 145.029287 0L583.410406 896.938499c135.927138-29.975661 242.935242-80.934388 242.935242-197.247366C826.346672 543.604117 685.75993 498.335001 583.410406 459.19064M363.840761 347.495287c0-26.2232 34.32913-43.022758 74.540358-52.878471l0 112.915798C394.13382 389.964135 363.840761 371.905225 363.840761 347.495287M583.410406 728.125879 583.410406 609.166213c44.144913 19.212805 74.347872 39.015355 74.347872 64.750172C657.758278 699.634821 624.291241 717.360975 583.410406 728.125879'
symbol2 = 'path://M512 14.009c-278.418 0-504.168 225.75-504.219 504.219 0 278.567 225.75 504.269 504.219 504.269 278.517 0 504.269-225.75 504.269-504.269 0-278.468-225.7-504.219-504.269-504.219zM734.996 511.662c1.704 8.067 2.556 17.238 2.556 27.561 0 12.629-0.852 23.252-2.556 31.871h-165.216v75.769h165.216c1.704 8.018 2.556 17.189 2.556 27.512 0 12.679-0.852 23.252-2.556 31.871h-165.216v135.1c-6.966 1.103-14.081 2.005-21.548 2.606-7.466 0.601-14.982 0.902-22.399 0.902-7.466 0-14.883-0.3-22.349-0.902-7.417-0.601-14.633-1.452-21.548-2.606v-135.1h-158.351c-2.306-6.916-3.457-16.636-3.457-29.265 0-5.212 0.3-10.323 0.852-15.535 0.601-5.162 1.452-10.022 2.606-14.583h158.351v-75.769h-158.351c-2.306-6.916-3.457-16.636-3.457-29.265 0-5.162 0.3-10.323 0.852-15.535 0.601-5.162 1.452-10.022 2.606-14.633h123.925l-158.351-278.818c7.466-1.152 15.635-2.005 24.505-2.556 8.969-0.601 17.439-0.902 25.457-0.902 8.018 0 16.335 0.3 24.956 0.852s16.335 1.404 23.252 2.556l141.113 259.927 138.607-259.927c7.417-1.152 15.033-2.005 22.799-2.556 7.667-0.55 15.635-0.852 23.653-0.852s16.035 0.3 24.053 0.852c8.067 0.55 15.535 1.404 22.399 2.556l-155.746 278.818h130.79zM496.014 706.195z'
symbol3 = 'path://M835.121212 838.368162 677.893284 838.368162c116.620068-61.372789 196.35711-185.429223 196.35711-328.48129 0-204.021673-162.184823-369.413538-362.250394-369.413538s-362.250394 165.391864-362.250394 369.413538c0 199.205994 154.61952 361.584222 348.149235 369.138268 1.040702 0.164752 2.099824 0.275269 3.185552 0.275269l334.037842 0c11.256368 0 20.466124-9.209756 20.466124-20.466124S846.37758 838.368162 835.121212 838.368162zM699.318246 435.18552c41.256636 0 74.701352 33.444716 74.701352 74.701352s-33.444716 74.701352-74.701352 74.701352-74.701352-33.444716-74.701352-74.701352S658.06161 435.18552 699.318246 435.18552zM512 254.912737c41.256636 0 74.701352 33.444716 74.701352 74.701352 0 41.256636-33.444716 74.701352-74.701352 74.701352s-74.701352-33.444716-74.701352-74.701352C437.298648 288.357454 470.743364 254.912737 512 254.912737zM328.086293 583.394027c-41.256636 0-74.701352-33.444716-74.701352-74.701352 0-41.256636 33.444716-74.701352 74.701352-74.701352 41.256636 0 74.701352 33.444716 74.701352 74.701352C402.787646 549.94931 369.341906 583.394027 328.086293 583.394027zM436.041004 707.150632c0-41.256636 33.444716-74.701352 74.701352-74.701352s74.701352 33.444716 74.701352 74.701352-33.444716 74.701352-74.701352 74.701352S436.041004 748.407268 436.041004 707.150632z'
symbol4 = 'path://M412.032 902.144c-8.192 0-16.384-3.328-22.272-9.984-77.44-86.656-202.496-87.552-205.184-87.552h-0.128c-16.384 0-29.696-13.184-29.824-29.568-0.128-16.384 13.056-29.824 29.44-29.952 6.144-0.384 153.984-0.128 250.112 107.392 11.008 12.288 9.856 31.104-2.432 41.984-5.504 5.12-12.672 7.68-19.712 7.68z m199.552-0.128c-7.296 0-14.464-2.56-20.224-7.936-12.032-11.136-12.8-29.952-1.664-41.984C689.152 744.704 833.92 744.832 839.68 745.088c16.512 0.128 29.696 13.568 29.44 30.08-0.128 16.384-13.44 29.44-29.696 29.44h-0.256c-2.432 0-125.056 0.768-205.824 87.936-5.76 6.272-13.824 9.472-21.76 9.472z m-52.48-151.296h-94.336c-2.944 0-5.888-0.384-8.704-1.28-100.608-12.928-186.24-71.296-241.28-164.992-64-108.8-78.72-249.728-36.48-350.72 4.608-10.88 15.104-18.048 26.88-18.304l8.96-0.128c56.704 0 109.568 10.752 157.824 31.872 34.816-63.616 74.496-111.872 118.4-143.872 2.304-2.048 4.992-3.712 7.936-4.992 9.216-3.968 19.84-3.072 28.288 2.304 1.408 0.896 2.816 2.048 4.096 3.2 43.904 32.256 82.56 79.872 117.632 144.768 49.152-22.144 103.296-33.408 161.408-33.408l9.088 0.128c11.776 0.256 22.272 7.424 26.88 18.304 42.24 100.992 27.52 241.92-36.48 350.72-55.168 93.568-140.672 152.064-241.28 164.992-2.816 0.896-5.76 1.408-8.832 1.408zM511.744 928c-16.384 0-29.696-13.312-29.696-29.696V720.896c0-16.512 13.312-29.696 29.696-29.696s29.696 13.312 29.696 29.696v177.28c0 16.512-13.312 29.824-29.696 29.824z m0 0'
symbol5 = 'path://M682.688 522.688c38.464 0 70.144 29.12 74.24 66.56l0.384 8.064v341.376a32 32 0 0 1-63.488 5.76l-0.512-5.76V597.312a10.688 10.688 0 0 0-7.296-10.112l-3.328-0.512H128a10.688 10.688 0 0 0-10.112 7.296l-0.576 3.328v341.376a32 32 0 0 1-63.488 5.76l-0.512-5.76V597.312c0-38.464 29.12-70.144 66.56-74.24L128 522.752h554.688z m-448 234.624a32 32 0 0 1 31.488 26.24l0.512 5.76v128a32 32 0 0 1-63.488 5.76l-0.512-5.76v-128a32 32 0 0 1 32-32z m341.312 0a32 32 0 0 1 32 32v128a32 32 0 1 1-64 0v-128a32 32 0 0 1 32-32z m-170.688-704a224 224 0 1 1 0 448 224 224 0 0 1 0-448z m0 64a160 160 0 1 0 0 320 160 160 0 0 0 0-320z m426.688-64a32 32 0 0 1 31.488 26.24l0.512 5.76v117.312h117.312a32 32 0 0 1 31.488 26.24l0.512 5.76a32 32 0 0 1-26.24 31.552l-5.76 0.512H864L864 384a32 32 0 0 1-26.24 31.488L832 416a32 32 0 0 1-31.488-26.24L800 384V266.624h-117.312a32 32 0 0 1-31.488-26.24l-0.512-5.76a32 32 0 0 1 26.24-31.424l5.76-0.512h117.248l0.064-117.376a32 32 0 0 1 20.864-29.952L826.24 53.76 832 53.312z'
symbol6 = 'path://M739.324749 4.877051c-408.046569 0-739.324749 490.775798-739.324749 509.200211 0 17.340624 331.097548 508.116423 739.324749 508.116423 409.130358 0 735.170224-512.812842 740.408537-508.116423C1484.9716 517.509261 1148.455107 4.877051 739.324749 4.877051z m0 863.23796c-351.328277 0-548.397248-354.037749-548.397249-354.037749S433.33498 159.136356 739.324749 159.136356c306.892926 0 553.093667 357.650379 549.119774 354.940906-3.973893-3.793262-242.226848 354.037749-549.119774 354.037749z m-3.431999-622.817428c-133.486682 0-241.32369 116.146058-241.32369 260.651262 0 143.602046 108.01764 260.651261 241.32369 260.651261 134.209208 0 242.226848-117.049215 242.226848-260.651261 0-144.505204-107.837008-260.651261-242.226848-260.651262z m0 0'
#s对所有电影票房累加进行升序
sort_boxInfo = df.groupby('movieName').sum().sort_values(by='boxInfo', ascending=False)
def pictorialbar(index, values, symbol) -> PictorialBar:
    
    background_color_js = (
        "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
        "[{offset: 0, color: '#c86589'}, {offset: 1, color: '#06a7ff'}], false)"
    )
    c = (
        PictorialBar(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js)))
        .add_xaxis(index)
        .add_yaxis(
            "",
            values,
            label_opts=opts.LabelOpts(is_show=False),
            symbol_size=18,
            symbol_repeat="fixed",
            symbol_offset=[0, 0],
            is_symbol_clip=True,
            symbol=symbol,
        )
        .reversal_axis()
        .set_global_opts(
            title_opts=opts.TitleOpts(title=""),
            xaxis_opts=opts.AxisOpts(is_show=False),
            yaxis_opts=opts.AxisOpts(
                axistick_opts=opts.AxisTickOpts(is_show=False),
                axisline_opts=opts.AxisLineOpts(
                    linestyle_opts=opts.LineStyleOpts(opacity=0)
                ),
            ),
        )
    )
#     page = Page(layout=Page.DraggablePageLayout)
#     page.add(c)
#     page.render('前20名电影票房数据.html')
    return c
# 1-20榜单
pictorialbar(sort_boxInfo.index.values.tolist()[:20], sort_boxInfo['boxInfo'].values.tolist()[:20], symbol2).render('前20名电影票房数据.html')

2019 是中国电影大年,开年票房就一路飙升了,以《哪吒》和《流浪地球》为代表的国产电影,频频刷新票房新高。
在这里插入图片描述
我们这里列出了票房前20的排行,可以看到以《哪吒》为首的众多国产电影纷纷上榜,当日,作为票房收割机的美国大片仍然一如既往的给力!

而《哪吒》作为国漫的又一大代表作,是否标志着国漫的真正崛起呢,我们拭目以待吧!

再来看看20-40的榜单都有哪些电影上榜。这时候我们看到排名靠前的电影中依然可见国产电影大放异彩。

# 20-40榜单
pictorialbar(sort_boxInfo.index.values.tolist()[20:40], sort_boxInfo['boxInfo'].values.tolist()[20:40], symbol2).render('20-40名电影票房数据.html')

在这里插入图片描述

3.2 可视化单日票房冠军
oneday_boxInfo = df.sort_values(by='boxInfo', ascending=False)
print(oneday_boxInfo.shape)
oneday_boxInfo.head()
# 单日票房冠军
pictorialbar(oneday_boxInfo['movieName'].values.tolist()[:20], oneday_boxInfo['boxInfo'].values.tolist()[:20], symbol4).render('前20名单日票房冠军.html')

在这里插入图片描述
可以看到,单日的票房冠军竟然不是票房总冠军《哪吒》,而是《复联》,看来其在中国的影响力还是非常巨大的,连续4天蝉联榜首就是最好的明证!

而另一个国产巨作《流浪地球》也不遑多让,在前20名里独占6席,妥妥的中国电影骄傲,中国科幻电影新起点!

3.3 可视化排片场次
sort_showInfo = df.groupby('movieName').sum().sort_values(by='showInfo', ascending=False)
sort_boxInfo.head()
# 1-20 排片场次最多的电影
pictorialbar(sort_showInfo.index.values.tolist()[:20], sort_showInfo['showInfo'].values.tolist()[:20], symbol3).render('前20排片场次的电影.html')

在这里插入图片描述
这里的排片场次,是根据每部电影当天的场次累加得来的,肯定是越火爆的电影,场次越多啦。
从图中的统计也可以看出,确实越火爆的电影,排片场次越多,其票房当然也越高!

那么再来看看单日片场之王又会是谁呢

# 单日排场之王
oneday_showInfo = df.sort_values(by='showInfo', ascending=False)
pictorialbar(oneday_showInfo['movieName'].values.tolist()[:20], oneday_showInfo['showInfo'].values.tolist()[:20], symbol5).render('单日片场之王.html')

在这里插入图片描述
万万没想到啊,复仇者的场次数据竟然这么亮眼,几乎占据了榜单的半壁江山,而另外的半壁也几乎被美国大片所占据,看来美国的 IP 在国内还是非常卖座的!

我们再来看下单日场均人气之王。

# 单日场均人次之王
oneday_avgShowView = df.sort_values(by='avgShowView', ascending=False)
pictorialbar(oneday_avgShowView['movieName'].values.tolist()[:20], oneday_avgShowView['avgShowView'].values.tolist()[:20], symbol6).render('单日场均人次之王.html')

在这里插入图片描述
没想到,场均人次最高的竟然是《隋朝来客》,单日单场累计人次高达1400人,简直堪称奇迹!

3.4 年度票房走势可视化

我们来看看2019年全年的票房走势情况.

box_data = pd.read_csv('./total_data_2019.csv')
print(box_data.shape)
box_data.head()
from pyecharts.charts.basic_charts.line import Line

def line_smooth() -> Line:
    background_color_js = (
        "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
        "[{offset: 0, color: '#c86589'}, {offset: 1, color: '#06a7ff'}], false)"
    )
    c = (
        Line(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js)))
        .add_xaxis(box_data['queryDate'].values.tolist())
        .add_yaxis("", box_data['totalBox'].values.tolist(), is_smooth=True, markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]),)
        .set_global_opts(title_opts=opts.TitleOpts(title=""),
                        yaxis_opts=opts.AxisOpts(
                axislabel_opts=opts.LabelOpts(formatter="{value} /万")
            ),)
    )
    return c
line_smooth().render("年度票房走势.html")

在这里插入图片描述
可以看到,春节档的当日票房还是远远高于其他时间,无论是国庆还是其他任何档期都是无法匹敌的。众多大牌都在追逐的春节档,必然是尤其得天独厚的价值的!

3.5 《哪吒》、《复联》、《流浪地球》和《我和我的祖国》进行分析

在这里,我们选出了2019年最具代表性的四部电影,来着重分析下它们的更多数据,分别是《哪吒》、《复联》、《流浪地球》和《我和我的祖国》。

这部分代码我将在下一章进行详细说明

我们已经爬取好了这四部电影的一些信息,包括观影评论、性别、用户等级、用户评分和购票。

我们先来看下数据。

nezha = pd.read_csv('maoyan_data_nezha.csv')
fulian = pd.read_csv('maoyan_data_fulian.csv')
liulang = pd.read_csv('maoyan_data_liulang.csv')
zuguo = pd.read_csv('maoyan_data_zuguo.csv')
nezha.head()

在这里插入图片描述
我们先看一下观众对这四部电影的评论情感倾向。

from pyecharts.charts.basic_charts.pie import Pie
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode

def pie_score() -> Pie:
    background_color_js = (
        "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
        "[{offset: 0, color: '#c86589'}, {offset: 1, color: '#06a7ff'}], false)"
    )
    fn = """
    function(params) {
        if(params.name == '其他')
            return '\\n\\n\\n' + params.name + ' : ' + params.value + '';
        return params.name + ' : ' + params.value + '';
    }
    """
    def new_label_opts():
        return opts.LabelOpts(formatter=JsCode(fn), position="center")
    
    c = (
        Pie(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js)))
        .add(
            "",
            [list(z) for z in zip(["哪吒", "其他"], [405, 135])],
            center=["20%", "30%"],
            radius=[60, 80],
            label_opts=new_label_opts(),
        )
        .add(
            "",
            [list(z) for z in zip(["复联", "其他"], [156, 69])],
            center=["55%", "30%"],
            radius=[60, 80],
            label_opts=new_label_opts(),
        )
        .add(
            "",
            [list(z) for z in zip(["流浪", "其他"], [103, 47])],
            center=["20%", "70%"],
            radius=[60, 80],
            label_opts=new_label_opts(),
        )
        .add(
            "",
            [list(z) for z in zip(["祖国", "其他"], [435, 195])],
            center=["55%", "70%"],
            radius=[60, 80],
            label_opts=new_label_opts(),
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(title="10分好评占比"),
            legend_opts=opts.LegendOpts(
                type_="scroll", pos_top="20%", pos_left="80%", orient="vertical"
            ),
        )
    )
    return c

pie_score().render("10分好评占比.html")

在这里插入图片描述
可以看到,这四部电影的口碑都是非常棒的,10分占比都非常之高,尤其是《哪吒》,占比高达3/4,可以说是正宗的名利双收了!

我们再来看一下观影性别。

def pie_gendere() -> Pie:
    background_color_js = (
        "new echarts.graphic.LinearGradient(0, 0, 0, 1, "
        "[{offset: 0, color: '#c86589'}, {offset: 1, color: '#06a7ff'}], false)"
    )
    fn = """
    function(params) {
        if(params.name == '女性')
            return '\\n\\n\\n' + params.name + ' : ' + params.value + '';
        return params.name + ' : ' + params.value + '';
    }
    """
    def new_label_opts():
        return opts.LabelOpts(formatter=JsCode(fn), position="center")
    
    c = (
        Pie(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js)))
        .add(
            "",
            [list(z) for z in zip(["哪吒", "女性"], [124, 166])],
            center=["20%", "30%"],
            radius=[60, 80],
            label_opts=new_label_opts(),
        )
        .add(
            "",
            [list(z) for z in zip(["复联", "女性"], [75, 48])],
            center=["55%", "30%"],
            radius=[60, 80],
            label_opts=new_label_opts(),
        )
        .add(
            "",
            [list(z) for z in zip(["流浪", "女性"], [51, 37])],
            center=["20%", "70%"],
            radius=[60, 80],
            label_opts=new_label_opts(),
        )
        .add(
            "",
            [list(z) for z in zip(["祖国", "女性"], [163, 165])],
            center=["55%", "70%"],
            radius=[60, 80],
            label_opts=new_label_opts(),
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(title="观影男女占比"),
            legend_opts=opts.LegendOpts(
                type_="scroll", pos_top="20%", pos_left="80%", orient="vertical"
            ),
        )
    )
    return c

pie_gendere().render("观影男女占比.html")

在这里插入图片描述
可以看出,对于《哪吒》这部电影,女性比例要超过男性的,看来女性朋友们还是比较喜欢这种较为轻松的电影的。而对于《复联》和《流浪地球》来说,则是男性观众占据多数,毕竟都是热血电影嘛!最后的《祖国》,那必须是男女老幼,老少咸宜喽!

最后,我们来看看广大影迷们对这四部电影的评论吧。我们用词云进行显示。

from wordcloud import WordCloud
from PIL import Image
import jieba
import numpy as np
font = r'./data/FZSTK.TTF'
def comment_wordcloud(data, wc_name, pic):
    df_list = data['content'].tolist()
    cut_word = "".join(jieba.cut(str(df_list), cut_all=False))
    img = Image.open(pic)
    img_array = np.array(img)
    wc = WordCloud(width=1800, height=1500, background_color='white', font_path=font, mask=img_array)
    wc.generate(cut_word)
    wc.to_file('word_%s.png' % wc_name)

哪吒

comment_wordcloud(nezha, 'nezha', 'nezha.jpg')

在这里插入图片描述
复联

comment_wordcloud(fulian, 'fulian', 'fulian.jpg')

在这里插入图片描述
流浪地球

comment_wordcloud(liulang, 'liulang', 'liulang.jpg')

在这里插入图片描述
祖国

comment_wordcloud(zuguo, 'zuguo', 'ciyun.jpg')

在这里插入图片描述

发布了129 篇原创文章 · 获赞 28 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_35770067/article/details/104224702