python爬虫之你好,李焕英电影票房数据分析

一、前言

春节档贺岁片《你好,李焕英》,于2月23日最新数据出来后,票房已经突破42亿,并且赶超其他贺岁片,成为2021的一匹黑马。

从小品演员再到导演,贾玲处女作《你好李焕英》,为何能这么火?接下来荣仔带你运用Python借助电影网站从各个角度剖析这部电影喜得高票房的原因。

二、影评爬取并词云分析

毫无疑问, 中国的电影评论伴随着整个社会文化语境的变迁以及不同场域和载体的更迭正发生着明显的变化。在纸质类影评统御了中国电影评论一百年后,又分别出现了电视影评、网络影评、新媒体影评等不同业态相结合的批评话语形式。电影评论的生产与传播确实已经进入一个民主多元化的时代。

电影评论的目的在于分析、鉴定和评价蕴含在银幕中的审美价值、认识价值、社会意义、镜头语等方面,达到拍摄影片的目的,解释影片中所表达的主题,既能通过分析影片的成败得失,帮助导演开阔视野,提高创作水平,以促进电影艺术的繁荣和发展;又能通过分析和评价,影响观众对影片的理解和鉴赏,提高观众的欣赏水平,从而间接促进电影艺术的发展。

2.1 网站选取

python爬虫实战——爬取豆瓣影评数据

2.2 爬取思路

爬取豆瓣影评数据步骤:1、获取网页请求
                                        2、解析获取的网页
                                        3、提取影评数据
                                        4、保存文件
                                        5、词云分析

2.2.1 获取网页请求

该实例选择采用selenium库进行编码。

导库

# 导入库
from selenium import webdriver

浏览器驱动

# 浏览驱动器路径
chromedriver = 'E:/software/chromedriver_win32/chromedriver.exe'
driver = webdriver.Chrome(chromedriver)

打开网页

driver.get("此处填写网址")

2.2.2解析获取的网页

F12键进入开发者工具,并确定数据提取位置,copy其中的XPath路径

2.2.3提取影评数据

采用XPath进行影评数据提取

driver.find_element_by_xpath('//*[@id="comments"]/div[{}]/div[2]/p/span')

2.2.4保存文件

# 新建文件夹及文件
basePathDirectory = "Hudong_Coding"
if not os.path.exists(basePathDirectory):
        os.makedirs(basePathDirectory)
baiduFile = os.path.join(basePathDirectory, "hudongSpider.txt")
# 若文件不存在则新建,若存在则追加写入
if not os.path.exists(baiduFile):
        info = codecs.open(baiduFile, 'w', 'utf-8')
else:
        info = codecs.open(baiduFile, 'a', 'utf-8')

txt文件写入

info.writelines(elem.text + '\r\n')

2.2.5 词云分析

词云分析用到了jieba库和worldcloud库。

值得注意的是,下图显示了文字的选取路径方法。

2.3 代码总观

2.3.1 爬取代码

# -*- coding: utf-8 -*-
# !/usr/bin/env python
import os
import codecs
from selenium import webdriver

# 获取摘要信息
def getFilmReview():
    try:
        # 新建文件夹及文件
        basePathDirectory = "DouBan_FilmReview"
        if not os.path.exists(basePathDirectory):
            os.makedirs(basePathDirectory)
        baiduFile = os.path.join(basePathDirectory, "DouBan_FilmReviews.txt")
        # 若文件不存在则新建,若存在则追加写入
        if not os.path.exists(baiduFile):
            info = codecs.open(baiduFile, 'w', 'utf-8')
        else:
            info = codecs.open(baiduFile, 'a', 'utf-8')

        # 浏览驱动器路径
        chromedriver = 'E:/software/chromedriver_win32/chromedriver.exe'
        os.environ["webdriver.chrome.driver"] = chromedriver
        driver = webdriver.Chrome(chromedriver)
        # 打开网页
        for k in range(15000):  # 大约有15000页
            k = k + 1
            g = 2 * k
            driver.get("https://movie.douban.com/subject/34841067/comments?start={}".format(g))
            try:
                # 自动搜索
                for i in range(21):
                    elem = driver.find_element_by_xpath('//*[@id="comments"]/div[{}]/div[2]/p/span'.format(i+1))
                    print(elem.text)
                    info.writelines(elem.text + '\r\n')
            except:
                pass

    except Exception as e:
        print('Error:', e)

    finally:
        print('\n')
        driver.close()

# 主函数
def main():
    print('开始爬取')
    getFilmReview()
    print('结束爬取')

if __name__ == '__main__':
    main()

2.3.2 词云分析代码

# -*- coding: utf-8 -*-
# !/usr/bin/env python

import jieba                #中文分词
import wordcloud            #绘制词云

# 显示数据

f = open('E:/software/PythonProject/DouBan_FilmReview/DouBan_FilmReviews.txt', encoding='utf-8')

txt = f.read()
txt_list = jieba.lcut(txt)
# print(txt_list)
string = ' '.join((txt_list))
print(string)

# 很据得到的弹幕数据绘制词云图
# mk = imageio.imread(r'图片路径')

w = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='C:/Windows/Fonts/simsun.ttc',
                        #mask=mk,
                        scale=15,
                        stopwords={' '},
                        contour_width=5,
                        contour_color='red'
                        )

w.generate(string)
w.to_file('DouBan_FilmReviews.png')

三、 实时票房搜集

3.1 网站选择

3.2 代码编写

# -*- coding: utf-8 -*-
# !/usr/bin/env python
import os
import time
import datetime
import requests

class PF(object):
    def __init__(self):
        self.url = 'https://piaofang.maoyan.com/dashboard-ajax?orderType=0&uuid=173d6dd20a2c8-0559692f1032d2-393e5b09-1fa400-173d6dd20a2c8&riskLevel=71&optimusCode=10'
        self.headers = {
            "Referer": "https://piaofang.maoyan.com/dashboard",
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36",
        }

    def main(self):
        while True:
            # 需在dos命令下运行此文件,才能清屏
            os.system('cls')
            result_json = self.get_parse()
            if not result_json:
                break
            results = self.parse(result_json)
            # 获取时间
            calendar = result_json['calendar']['serverTimestamp']
            t = calendar.split('.')[0].split('T')
            t = t[0] + " " + (datetime.datetime.strptime(t[1], "%H:%M:%S") + datetime.timedelta(hours=8)).strftime("%H:%M:%S")
            print('北京时间:', t)
            x_line = '-' * 155
            # 总票房
            total_box = result_json['movieList']['data']['nationBoxInfo']['nationBoxSplitUnit']['num']
            # 总票房单位
            total_box_unit = result_json['movieList']['data']['nationBoxInfo']['nationBoxSplitUnit']['unit']
            print(f"今日总票房: {total_box} {total_box_unit}", end=f'\n{x_line}\n')
            print('电影名称'.ljust(14), '综合票房'.ljust(11), '票房占比'.ljust(13), '场均上座率'.ljust(11), '场均人次'.ljust(11),'排片场次'.ljust(12),'排片占比'.ljust(12), '累积总票房'.ljust(11), '上映天数', sep='\t', end=f'\n{x_line}\n')
            for result in results:
                print(
                    result['movieName'][:10].ljust(9),  # 电影名称
                    result['boxSplitUnit'][:8].rjust(10),  # 综合票房
                    result['boxRate'][:8].rjust(13),  # 票房占比
                    result['avgSeatView'][:8].rjust(13),  # 场均上座率
                    result['avgShowView'][:8].rjust(13),  # 场均人次
                    result['showCount'][:8].rjust(13),  # '排片场次'
                    result['showCountRate'][:8].rjust(13),  # 排片占比
                    result['sumBoxDesc'][:8].rjust(13),  # 累积总票房
                    result['releaseInfo'][:8].rjust(13),  # 上映信息
                    sep='\t', end='\n\n'
                )
                break
            time.sleep(4)

    def get_parse(self):
        try:
            response = requests.get(self.url, headers=self.headers)
            if response.status_code == 200:
                return response.json()
        except requests.ConnectionError as e:
            print("ERROR:", e)
            return None

    def parse(self, result_json):
        if result_json:
            movies = result_json['movieList']['data']['list']
            # 场均上座率, 场均人次, 票房占比, 电影名称,
            # 上映信息(上映天数), 排片场次, 排片占比, 综合票房,累积总票房
            ticks = ['avgSeatView', 'avgShowView', 'boxRate', 'movieName',
                     'releaseInfo', 'showCount', 'showCountRate', 'boxSplitUnit', 'sumBoxDesc']
            for movie in movies:
                self.piaofang = {}
                for tick in ticks:
                    # 数字和单位分开需要join
                    if tick == 'boxSplitUnit':
                        movie[tick] = ''.join([str(i) for i in movie[tick].values()])
                    # 多层字典嵌套
                    if tick == 'movieName' or tick == 'releaseInfo':
                        movie[tick] = movie['movieInfo'][tick]
                    if movie[tick] == '':
                        movie[tick] = '此项数据为空'
                    self.piaofang[tick] = str(movie[tick])
                yield self.piaofang

if __name__ == '__main__':
    while True:
        pf = PF()
        pf.main()

3.3 结果展示

四、 剧组照片爬取

4.1 网站选择

4.2 代码编写

# -*- coding: utf-8 -*-
# !/usr/bin/env python
import requests
from bs4 import BeautifulSoup
import re
from PIL import Image

def get_data(url):
    # 请求网页
    resp = requests.get(url)
    # headers 参数确定
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'
    }
        # 对于获取到的 HTML 二进制文件进行 'utf-8' 转码成字符串文件
    html = resp.content.decode('utf-8')
    # BeautifulSoup缩小查找范围
    soup = BeautifulSoup(html, 'html.parser')
    # 获取 <a> 的超链接
    for link in soup.find_all('a'):
        a = link.get('href')
        if type(a) == str:
            b = re.findall('(.*?)jpg', a)
            try:
                print(b[0]+'jpg')
                img_urls = b[0] + '.jpg'
                # 保存数据
                for img_url in img_urls:
                    # 发送图片 URL 请求
                    image = requests.get(img_url, headers=headers).content
                    # 保存数据
                    with open(r'E:/IMAGES/' + image, 'wb') as img_file:
                        img_file.write(image)
            except:
                pass
        else:
            pass

# 爬取目标网页
if __name__ == '__main__':
    get_data('https://www.1905.com/newgallery/hdpic/1495100.shtml')

4.3 效果展示

五、 总结

看这部电影开始笑得有多开心,后面哭得就有多伤心,这部电影用孩子的视角,选取了母亲在选择爱情和婚姻期间所作出的选择,通过对母亲的观察,体会母亲所谓的幸福,并不是贾玲认为的:嫁给厂长的儿子就能获得的,这是他们共同的选择,无论经历过多少次,母亲都会义无反顾选择适合自己的而不是别人认为的那种幸福的人生,这也间接告诉我们:我们追求幸福的过程中,要凭借自己的走,而不是要过别人眼中和口中的幸福,毕竟人生的很多选择只有一次。

到此这篇关于python爬虫之你好,李焕英电影票房数据分析的文章就介绍到这了,更多相关python爬取电影票房内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python数据分析之公交IC卡刷卡分析

    一.背景 交通大数据是由交通运行管理直接产生的数据(包括各类道路交通.公共交通.对外交通的刷卡.线圈.卡口.GPS.视频.图片等数据).交通相关行业和领域导入的数据(气象.环境.人口.规划.移动通信手机信令等数据),以及来自公众互动提供的交通状况数据(通过微博.微信.论坛.广播电台等提供的文字.图片.音视频等数据)构成的. 现在给出了一个公交刷卡样例数据集,包含有交易类型.交易时间.交易卡号.刷卡类型.线路号.车辆编号.上车站点.下车站点.驾驶员编号.运营公司编号等.试导入该数据集并做分析. 二

  • python数据分析之员工个人信息可视化

    一.实验目的 (1)熟练使用Counter类进行统计 (2)掌握pandas中的cut方法进行分类 (3)掌握matplotlib第三方库,能熟练使用该三方库库绘制图形 二.实验内容 采集到的数据集如下表格所示: 三.实验要求 1.按照性别进行分类,然后分别汇总男生和女生总的收入,并用直方图进行展示. 2.男生和女生各占公司总人数的比例,并用扇形图进行展示. 3.按照年龄进行分类(20-29岁,30-39岁,40-49岁),然后统计出各个年龄段有多少人,并用直方图进行展示. import pan

  • python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析

    一.环境准备 python3.8.3 pycharm 项目所需第三方包 pip install scrapy fake-useragent requests selenium virtualenv -i https://pypi.douban.com/simple 1.1 创建虚拟环境 切换到指定目录创建 virtualenv .venv 创建完记得激活虚拟环境 1.2 创建项目 scrapy startproject 项目名称 1.3 使用pycharm打开项目,将创建的虚拟环境配置到项目中来

  • Python数据分析之pandas函数详解

    一.apply和applymap 1. 可直接使用NumPy的函数 示例代码: # Numpy ufunc 函数 df = pd.DataFrame(np.random.randn(5,4) - 1) print(df) print(np.abs(df)) 运行结果: 0         1         2         3 0 -0.062413  0.844813 -1.853721 -1.980717 1 -0.539628 -1.975173 -0.856597 -2.612406

  • 如何使用Python对NetCDF数据做空间相关分析

    引言:我一直想理解空间相关分析的计算思维,于是今天又拿起Python脚本和数据来做练习.首先需要说明的是,这次实验的数据和Python脚本均来自于[好久不见]大佬,在跟大佬说明之后,允许我写到公众号来与大家共享,在此对大佬的指点表示感谢,这次实验的脚本可在气象家园或简书app(如果没记错的话)搜索到这次实验的相关内容,也可以微信或者后台发消息给我获取.在此之前我觉得自己还没理解这个方法的计算思维,检验的标准就是我能否迅速运用到其他方面.于是今天又重新回来温习一遍,我把自己的理解与大伙共同交流.

  • Python数据分析:手把手教你用Pandas生成可视化图表的教程

    大家都知道,Matplotlib 是众多 Python 可视化包的鼻祖,也是Python最常用的标准可视化库,其功能非常强大,同时也非常复杂,想要搞明白并非易事.但自从Python进入3.0时代以后,pandas的使用变得更加普及,它的身影经常见于市场分析.爬虫.金融分析以及科学计算中. 作为数据分析工具的集大成者,pandas作者曾说,pandas中的可视化功能比plt更加简便和功能强大.实际上,如果是对图表细节有极高要求,那么建议大家使用matplotlib通过底层图表模块进行编码.当然,我

  • python数据分析之用sklearn预测糖尿病

    一.数据集描述 本数据集内含十个属性列 Pergnancies: 怀孕次数 Glucose:血糖浓度 BloodPressure:舒张压(毫米汞柱) SkinThickness:肱三头肌皮肤褶皱厚度(毫米) Insulin:两个小时血清胰岛素(μU/毫升) BMI:身体质量指数,体重除以身高的平方 Diabets Pedigree Function: 疾病血统指数 是否和遗传相关,Height:身高(厘米) Age:年龄 Outcome:0表示不患病,1表示患病. 任务:建立机器学习模型以准确预

  • python3对拉勾数据进行可视化分析的方法详解

    前言 上回说到我们如何把拉勾的数据抓取下来的,既然获取了数据,就别放着不动,把它拿出来分析一下,看看这些数据里面都包含了什么信息. (本次博客源码地址:https://github.com/MaxLyu/Lagou_Analyze (本地下载)) 下面话不多说了,来一起看看详细的介绍吧 一.前期准备 由于上次抓的数据里面包含有 ID 这样的信息,我们需要将它去掉,并且查看描述性统计,确认是否存在异常值或者确实值. read_file = "analyst.csv" # 读取文件获得数据

  • Python数据可视化正态分布简单分析及实现代码

    Python说来简单也简单,但是也不简单,尤其是再跟高数结合起来的时候... 正态分布(Normaldistribution),也称"常态分布",又名高斯分布(Gaussiandistribution),最早由A.棣莫弗在求二项分布的渐近公式中得到.C.F.高斯在研究测量误差时从另一个角度导出了它.P.S.拉普拉斯和高斯研究了它的性质.是一个在数学.物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力. 正态曲线呈钟型,两头低,中间高,左右对称因其曲线呈钟形,因此人

  • python 微信好友特征数据分析及可视化

    一.背景及研究现状 在我国互联网的发展过程中,PC互联网已日趋饱和,移动互联网却呈现井喷式发展.数据显示,截止2013年底,中国手机网民超过5亿,占比达81%.伴随着移动终端价格的下降及wifi的广泛铺设,移动网民呈现爆发趋势. 微信已经成为连接线上与线下.虚拟与现实.消费与产业的重要工具,它提高了O2O类营销用户的转化率.过去开发软件,程序员常要考虑不同开发环境的语言.设备的适配性和成本.现在,开发者可以在一个"类操作底层"去开发应用,打破了过去受限的开发环境. 二.研究意义及目的

随机推荐