飞道的博客

【Python】Python网络爬虫-电视剧《平凡的荣耀》数据爬取与分析

391人阅读  评论(0)

一、前言

距上次更新博客,又过去很长时间了,感觉再不更新一下,自己写博客的习惯就要废了,哈哈。从去年九月份开学之后,疫情学期期末考试开学考、实验室项目软著申请和新项目设计、课程集训等事情较多,没有很多时间;然后这个学期我到大三下学期,实验室工作交接完就准备考研,之后也没有很多时间来写博客,所以赶紧来更新一下,和大家分享一些知识和心得,希望喜欢的小伙伴可以点赞、收藏和关注,哈哈。

二、《平凡的荣耀》数据爬取与分析

1 简介
旨在实现对翻拍电视剧《平凡的荣耀》综合热度的分析,计划设计数据爬取模块、数据分析模块和数据模块。具体实现思路如下。

1.数据爬取模块需求分析
在数据爬取模块,计划爬取三个部分的数据。首先,爬取电视剧演员阵容数据,实现对主演基本信息和粉丝数量的获取。其次,爬取电视剧卫视收视情况数据,实现对电视剧播出期间多个卫视收视率、收视份额和收视排名信息的获取。最后,爬取豆瓣平台该电视剧热评数据,实现对前100条热评信息的获取。

2.数据分析模块需求分析
在数据分析模块,计划对爬取的三部分数据进行数据分析。首先,通过对主演信息数据的分析,得出该剧主演是否对电视剧收视情况产生了影响。其次,通过对多卫视收视情况的分析,得出该电视剧在播出期间的持续热度与相对热度。最后,通过对豆瓣热评的分析,得出观众对该电视剧的喜爱程度。

3.数据存储模块需求分析
在数据存储模块,计划通过两种方式实现数据的存储。首先,使用json文件存储爬取模块获取的基础数据。其次,读取部分json文件,通过操作表格的方式,将主演信息、卫视收视情况和100条热评数据分别存入三个Excel表格中。

2 开发技术和环境
(1)开发环境
开发系统:Windows 10操作系统;
开发工具:Anaconda+PyCharm;
开发语言:Python3.7。
(2)文件
Json文件、Excel文档
3 系统设计
1.总体设计
本作品总体设计包括对《平凡的荣耀》的数据爬取、数据分析和数据存储三个方面。在数据爬取方面,进行主演信息、卫视收视情况和豆瓣热评爬取的设计。在数据分析方面,进行演员阵容、卫视收视热度和观众喜爱程度分析的设计。在数据存储方面,进行对提取数据使用Json和Excel两种方式存储的设计。
系统功能模块图:

2.数据存储方式
本作品通过两种方式实现对提取数据进行存储,分别是Json文件存储和Excel表格存储。在数据爬取阶段,使用Json文件存储的方式,方便将提取数据按字典格式进行保存。在数据分析阶段,使用Excel表格存储的方式,方便对提取数据进行更加直观的分析。
数据存储结构图:

4 系统实现

1.数据爬取与存储模块实现

该模块主要实现对主演基础信息、卫视收视数据和豆瓣热评数据的爬取与存储,具体实现如下。

1.1主演信息爬取与存储实现
(1) 实现方案
在该部分,主要进行了两个方面信息的爬取与存储。
第一个方面,获取所有演员阵容,通过提取《平凡的荣耀》百科页面角色介绍模块中主要角色对应演员姓名及个人百科链接来实现。自定义get_actors()函数,在该函数中,使用requests库中的get()方法构造请求,使用BeautifulSoup构造方法进行解析,并使用其find()和find_all()方法进一步提取出需要信息,最后存储到json文件中。
第二个方面,获取各个演员的基础数据,通过访问获取的每个演员的百科链接,来获取每个演员姓名、出生地、出生日期、星座、血型、身高、体重和粉丝量信息。自定义get_one_actors()函数,类似于get_actors()函数实现步骤,实现数据的提取和存储。
(2)实现代码

# 获取当前路径
path = os.getcwd()
# 爬取演员信息并返回html
def get_actors():
    # 定义headers和网页
    headers = {
   
        # 'Host': 'baike.baidu.com',
        'User-Agent':'Mozilla/5.0(Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
'Cookie':__yjsv5_shitong=1.0_7_1b511363715b8341a6b858c9784cf79473ec_300_1607592679535_218.56.38.242_f194afe3; yjs_js_security_passport=e2ee49471e3e645bb94ed5b037ce6cfba6955b66_1607592680_js'
    }
    url = 'https://baike.baidu.com/item/平凡的荣耀'
    # get
    response = requests.get(url, headers=headers)
    # 将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象, 可以传入一段字符串
    soup = BeautifulSoup(response.text, 'lxml')
    # print(soup.find_all('li'))
    # 获取角色介绍模块div数据
    first_actors = soup.find(name='div', attrs={
   'class': 'lemmaWgt-roleIntroduction'})
    # print(actors)
    # 进一步得到模块中li标签中的演员数据
    second_actors = first_actors.find_all(name='li')
    # print(second_actors)
    # 演员数据提取
    actors = []
    for second_actor in second_actors:
        actor = {
   }
        if second_actor.find(name='div', attrs={
   'class': 'role-actor'}):
            # 提取演员名称及百科链接
            actor["name"]=second_actor.find('div',{
   'class': 'role-actor'}).find('a').text
            actor['link'] = 'https://baike.baidu.com' + second_actor.find('div',{
   'class': 'role-actor'}).find('a').get('href')
        actors.append(actor)
    # print(actors)
    json_actors = json.loads(str(actors).replace("\'", "\""))
    # print(json_actors)
    file_path = path + '/电视剧数据文件/actors.json'
    file_path = file_path.replace('\\', '/')
    print(file_path)
    with open(file_path, 'w', encoding='UTF-8') as f:
        json.dump(json_actors, f, ensure_ascii=False)
# 获取每个演员的百科信息
def get_one_actors():
    read_path = path + '/电视剧数据文件/actors.json'
    read_path = read_path.replace('\\', '/')
    # 读取json数据
    with open(read_path, 'r', encoding='UTF-8') as f:
        actors = json.loads(f.read())
    headers = {
   
        # 'Host': 'baike.baidu.com',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
    }
    # 存提取的百科数据
    actor_infos = []
    for actor in actors:
        actor_info = {
   }
        actor_info['姓名'] = actor['name']
        # 获取请求
        response = requests.get(actor['link'], headers=headers)
        # 得到百科全部数据
        first_soup = BeautifulSoup(response.text, 'lxml')
        # 提取演员基本信息模块列表部分数据
        second_soup = first_soup.find(name='div', attrs={
   'class': 'basic-info cmn-clearfix'})
        # 得到div中的dl
        dls = second_soup.find_all(name='dl')
        # 遍历所有的dl
        for dl in dls:
            dts = dl.find_all(name='dt')
            # print(dts)
            # dds = dl.find_all(name='dd')
            # print(dds[index].text.strip())
            # 遍历单个dl的所有dt
            for dt in dts:
                # 匹配字符,通过join和split方法,提取dt中的纯文字
                if ''.join(str(dt.text).split()) == '出生地':
                    actor_info['出生地'] = dt.find_next(name='dd').text.strip().replace("\n", "")
                if ''.join(str(dt.text).split()) == '出生日期':
                    actor_info['出生日期'] = dt.find_next(name='dd').text.strip()
                if ''.join(str(dt.text).split()) == '血型':
                    actor_info['血型'] = dt.find_next(name='dd').text.strip()
                if ''.join(str(dt.text).split()) == '身高':
                    actor_info['身高'] = dt.find_next(name='dd').text.strip()
                if ''.join(str(dt.text).split()) == '体重':
                    actor_info['体重'] = dt.find_next(name='dd').text.strip()
                if ''.join(str(dt.text).split()) == '星座':
                    # print(''.join(str(dt.text)))
                    actor_info['星座'] = dt.find_next(name='dd').text.strip()
        # 获取百度数说模块
        first_fans = first_soup.find(name='div', attrs={
   'class': 'fans-portrait'})
        # 进一步得到粉丝总数部分数据
        try:
            fans = first_fans.find(name='span', attrs={
   'class': 'fans-total'}).text
            actor_info['粉丝量'] = fans
        except:
            actor_info['粉丝量'] = '未知'
        actor_infos.append(actor_info)
        json_actor_infos = json.loads(str(actor_infos).replace("\'", "\""))
        # 存
        file_path = path + '/电视剧数据文件/actor_infos.json'
        file_path = file_path.replace('\\', '/')
        with open(file_path, 'w', encoding='UTF-8') as f:
            json.dump(json_actor_infos, f, ensure_ascii=False)

1.2 卫视收视情况爬取与存储实现

(1) 实现方案
在该部分,主要进行了对东方和浙江两个卫视该电视剧收视数据的爬取与存储。通过提取《平凡的荣耀》百科页面播出信息模块中收视情况部分两个卫视CSM59城在播出期间每天的收视率、收视份额和排名数据来实现。自定义get_ratings()安徽省农户,在该函数中,使用requests库中的get()方法构造请求,使用BeautifulSoup构造方法进行解析,并使用其find()和find_all()方法进一步提取出需要信息,最后将获取的两个卫视的收视情况数据分别存储到两个json文件中。
(2) 实现代码

# 爬取收视情况
def get_ratings():
    # 定义headers和网页
    headers = {
   
        # 'Host': 'baike.baidu.com',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',   'Cookie':__yjsv5_shitong=1.0_7_1b511363715b8341a6b858c9784cf79473ec_300_1607592679535_218.56.38.242_f194afe3; yjs_js_security_passport=e2ee49471e3e645bb94ed5b037ce6cfba6955b66_1607592680_js'
    }
    url = 'https://baike.baidu.com/item/平凡的荣耀'
    # 获取response
    response = requests.get(url, headers=headers)
    # 转
    first_soup = BeautifulSoup(response.text, 'lxml')
    # 审查播出信息模块下收视情况子模块div,发现class=para
    # 提取class=para的div,因为不止收视情况div的class为该值,所以find_all
    second_soup = first_soup.find_all(name='div', attrs={
   'class': 'para'})
    # print(second_soup)
    # 遍历符合条件的div
    for d in second_soup:
        # 如果div中文本为收视情况,则匹配成功并获取它下面的一个table
        if ''.join(str(d.text).split()) == '收视情况':
            final_soup = d.find_next(name='table')
    # 得到table中的所有tr
    trs = final_soup.find_all(name='tr')
    # print(trs)
    # 定义存放两个卫视收视情况的字典
    dongfang_datas = []
    zhejiang_datas = []
    # 遍历tr,获取播出期间各个卫视的收视情况
    for tr in trs[2:]:
        dongfang = {
   }
        zhejiang = {
   }
        tds = tr.find_all(name='td')
        dongfang['播出日期'] = tds[0].text
        dongfang['收视率%'] = tds[1].text
        dongfang['收视份额%'] = tds[2].text
        dongfang['排名'] = tds[3].text
        zhejiang['播出日期'] = tds[0].text
        zhejiang['收视率%'] = tds[4].text
        zhejiang['收视份额%'] = tds[5].text
        zhejiang['排名'] = tds[6].text
        dongfang_datas.append(dongfang)
        zhejiang_datas.append(zhejiang)
        # print(tds[2].text)
    # print(dongfang_datas)
    # print(zhejiang_datas)
    # 转格式
    json_dongdang_datas = json.loads(str(dongfang_datas).replace("\'", "\""))
    json_zhejiang_datas = json.loads(str(zhejiang_datas).replace("\'", "\""))
    dongfang_path = path + '/电视剧数据文件/dongfang.json'
    dongfang_path = dongfang_path.replace('\\', '/')
    zhejiang_path = path + '/电视剧数据文件/zhejiang.json'
    zhejiang_path = zhejiang_path.replace('\\', '/')
    # 将两个卫视的收视情况存入到两个json文件中
    with open(dongfang_path, 'w', encoding='UTF-8') as f:
        json.dump(json_dongdang_datas, f, ensure_ascii=False)
    with open(zhejiang_path, 'w', encoding='UTF-8') as f:
        json.dump(json_zhejiang_datas, f, ensure_ascii=False)

1.3豆瓣热评爬取与存储实现

(1) 实现方案
在该部分,主要进行了豆瓣热评数据的爬取和存储。通过提取豆瓣该电视剧页面短评模块前5页(每页20条)100条热评的评论人、评分、点赞数和评论内容来实现。自定义get_hot_comments()函数,在该函数中,使用requests库中的get()方法构造请求,使用BeautifulSoup构造方法进行解析,并使用其find()和find_all()方法进一步提取出需要信息,最后存储到json文件中。
(2) 实现代码

# 爬取线上优酷热评
def get_hot_comments():
    headers = {
   
        'Host': 'movie.douban.com',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',    'Cookie':_vwo_uuid_v2=DE8F855EC24AE2DDC7761E12EAB48EAEF|c5c585e9feb33aa574682b87f0284a1c;_pk_id.100001.4cf6=45cef77f2b5a9960.1607930880.1.1607931254.1607930880.'
    }
    # 热评
    comments = []
    for i in range(5):
        url = f'https://movie.douban.com/subject/30186581/comments?start={i*20}&status=P&sort=new_score'
        # 获取全部
        responce = requests.get(url, headers=headers)
        # 转bs4
        first_soup = BeautifulSoup(responce.text, 'lxml')
        # 提取"平凡的荣耀 短评"下的评论模块
        second_soup = first_soup.find(name='div', attrs={
   'class': 'article'})
        # 提取100条热评
        first_hot_comments = second_soup.find(name='div', attrs={
   'class': 'mod-bd'})
        second_hot_comments = first_hot_comments.find_all(name='div', attrs={
   'class': 'comment'})
        # print(second_hot_comments)
        for comment in second_hot_comments:
            c = {
   }
            # 获取存用户名、观影感受和评论时间的span
            first_user = comment.find(name='span', attrs={
   'class': 'comment-info'})
            user = first_user.find(name='a').text
            date = first_user.find(name='span', attrs={
   'class': 'comment-time'})
            feel = date.find_previous(name='span')
            # print(user,date)
            c['评论人'] = user
            try:
                c['观看感受'] = feel['title']
            except:
                c['观看感受'] = '无'
            c['评论日期'] = date.text.strip()
            # 获取评论内容
            content = comment.find(name='p').text.strip().replace("\n", "")
            # print(content)
            c['内容'] = content
            # 获取存点赞数的span
            first_vote = comment.find(name='span', attrs={
   'class': 'comment-vote'})
            vote = first_vote.find(name='span', attrs={
   'class': 'votes vote-count'}).text
            c['点赞数'] = vote
            comments.append(c)
    # print(comments)
    # print(len(comments))
    # 存
    json_hot_comments = json.loads(str(comments).replace("\'", "\""))
    file_path = path + '/电视剧数据文件/hot_comments.json'
    file_path = file_path.replace('\\', '/')
    with open(file_path, 'w', encoding='UTF-8') as f:
        json.dump(json_hot_comments, f, ensure_ascii=False)

2 数据分析模块实现
该模块主要实现对该电视剧演员粉丝数量、卫视收视率和收视份额以及豆瓣观众评价的分析,具体实现如下。

2.1 演员粉丝数量分析实现
(1) 实现方案
在该部分,主要进行对主演阵容中每个演员粉丝数量的分析。通过分析演员粉丝数量,来实现对该电视剧演员阵容的评价。自定义show_fans()函数,在该函数中,使用pandas库中的read_json()方法读取存放演员信息的json文件,得到主演姓名和粉丝数量;使用pyplot函数集合中的bar方法绘制粉丝数量柱状分析图;最后使用savefig方法将柱状图进行保存。
(2) 实现代码

# 绘制粉丝数量图
def show_fans():
    # 读
    read_path = path + '/电视剧数据文件/actor_infos.json'
    read_path = read_path.replace('\\', '/')
    df = pd.read_json(read_path)
    actor_names = list(df['姓名'])
    actor_fans = list(df['粉丝量'])
    bar = (
        Bar()
        .add_xaxis(actor_names)
        .add_yaxis("粉丝数量", actor_fans)
        .set_global_opts(title_opts=opts.TitleOpts(title="《平凡的荣耀》主演粉丝数量分析图"))
    )
    bar.render(path + '/电视剧收视率分析图/fans.html

2.2 卫视收视情况分析实现
(1) 实现方案
在该部分,主要进行对该电视剧播出期间在东方卫视和浙江卫视收视率和收视份额的分析,来实现对电视剧播出期间持续热度和相对热度的评价。
自定义show_tv_ratings(json_file)函数,在该函数中,根据形参传入json文件名,使用pandas库中的read_json()方法对特定卫视json文件进行数据提取,得到播出期间每天的收视率;使用pyplot函数集合中的plot方法绘制收视率的折线分析图;最后使用savefig方法将折线图进行保存。
自定义show_tvs_ratings()函数,在该函数中,使用pandas库中的read_json()方法读取两个卫视json文件进行数据提取,得到卫视播出期间每天的收视份额;使用pyplot函数集合中的bar方法绘制播出期间电视剧在两个卫视收视份额的柱状分析图;最后使用savefig方法将柱状图进行保存。
(2) 实现代码

# 绘制单个卫视收视率变化图
def show_tv_ratings(json_file):
    # 导入json数据
    read_path = path + '/电视剧数据文件/' + json_file
    read_path = read_path.replace('\\', '/')
    # print(read_path)
    df = pd.read_json(read_path, dtype={
   '播出日期': str})
    dates = list(df['播出日期'])
    ratings = list(df['收视率%'])
    line = (
        Line()
        .add_xaxis(dates)
        .add_yaxis("收视率%", ratings, is_connect_nones=True)
    )
    if str(json_file)[:-5] == 'dongfang':
        line.set_global_opts(title_opts=opts.TitleOpts(title="《平凡的荣耀》东方卫视收视率变化趋势图"))
    else:
        line.set_global_opts(title_opts=opts.TitleOpts(title="《平凡的荣耀》浙江卫视收视率变化趋势图"))
    line.render(path + '/电视剧收视率分析图/' + str(json_file)[:-5] + '_ratings.html')
# 绘制卫视收视份额对比图
def show_tvs_ratings():
    # 导入json数据
    dongfang = path + '/电视剧数据文件/dongfang.json'
    dongfang = dongfang.replace('\\', '/')
    zhejiang = path + '/电视剧数据文件/zhejiang.json'
    zhejiang = zhejiang.replace('\\', '/')
    df1 = pd.read_json(dongfang)
    df2 = pd.read_json(zhejiang)
    # 提取需要的数据
    dongfang_dates = list(df1['播出日期'])
    dongfang_ratings = list(df1['收视份额%'])
    # zhejiang_dates = list(df2['播出日期'])
    zhejiang_ratings = list(df2['收视份额%'])
    # 绘制
    bar = (
        Bar()
        .add_xaxis(dongfang_dates)
        .add_yaxis("东方卫视", dongfang_ratings)
        .add_yaxis("浙江卫视", zhejiang_ratings)
        .set_global_opts(title_opts=opts.TitleOpts("《平凡的荣耀》收视份额变化分析图"))
    )
    bar.render(path + '/电视剧收视率分析图/tvs_ratings.html')

2.3 豆瓣热评分析实现
(1) 实现方案
在该部分,主要进行对豆瓣热评中观众观影感受的分析,来实现观众对电视剧喜爱程度的评价。
自定义show_hot_comments()函数,在该函数中,使用pandas库中的read_json()方法对豆瓣热评json文件进行数据提取,得到每个观众的观影感受;使用pyplot函数集合中的pie方法绘制观众喜爱情况的饼状分析图;最后使用savefig方法将折线图进行保存。
(2) 实现代码

# 绘制评论饼状图
def show_hot_comments():
    # 导入数据
    read_path = path + '/电视剧数据文件/hot_comments.json'
    read_path = read_path.replace('\\', '/')
    df = pd.read_json(read_path)
    # 提取需要数据
    feel = list(df['观看感受'])
    # print(feel)
    labels = ['力荐', '推荐', '还行', '很差', '较差', '无']
    values = [feel.count('力荐'), feel.count('推荐'), feel.count('还行'), feel.count('很差'), feel.count('较差'), feel.count('无')]
    # print(values)
    # 绘制
    pie = (
        Pie()
        .add(series_name='', data_pair=[(i, j) for i, j in zip(labels, values)])
        .set_global_opts(title_opts=opts.TitleOpts("热评前100观众评价分析"))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
    )
    pie.render(path + '/电视剧收视率分析图/hot_comments.ht

3.表格存储模块实现
(1) 实现方案
该模块主要实现对主演信息、多卫视收视情况和豆瓣前100热评以Excel表格的形式进行存储。分别自定义write_actor_infos()、write_tvs_ratings()和wirte_hot_comments()函数,在每个函数中,使用pandas库中read_json方法读取特定文件,并使用xlwings库中部分方法进行表格创建。
(2) 实现代码

# 将热评写入execl表
def write_hot_comments():
    file_path = path + '/电视剧数据文件/hot_comments.json'
    file_path = file_path.replace('\\', '/')
    with open(file_path, 'r', encoding='utf8') as f:
        comments = json.load(f)
    # print(comments)
    title = ['评论人', '观看感受', '评论时间', '评论内容', '评论点赞数']
    # 打开Excel
    wb = xw.Book()
    sht = wb.sheets('Sheet1')
    sht.range('A1').value = title
    line = 2
    for comment in comments:  # 循环字典
        # print(list(comment.values()))
        sht.range(f'A{line}').value = list(comment.values())
        line += 1
# 将演员数据存入Excel
def write_actor_infos():
    # 读数据
    file_path = path + '/电视剧数据文件/actor_infos.json'
    file_path = file_path.replace('\\', '/')
    with open(file_path, 'r', encoding='utf8') as f:
        actor_infos = json.load(f)
    # actor_infos = list(actor_infos)
    # 定义Excel表头
    title = ['姓名', '出生地', '出生日期', '星座', '血型', '身高', '体重', '粉丝量']
    # 打开Excel
    wb = xw.Book()
    sht = wb.sheets('Sheet1')
    sht.range('A1').value = title
    # 设置写入行索引,从第2行开始
    line = 2
    # 遍历每个演员数据
    for actor in actor_infos:
        # 获取单个演员字典的key值
        keys = list(actor.keys())
        values = list(actor.values())
        # 设置key值与value值一一对应的索引
        index = 0
        # 遍历key值进行属性匹配
        for key in keys:
            # 如果是姓名存入A列
            if key == '姓名':
                # print(values[index])
                sht.range(f'A{line}').value = values[index]
                index += 1
            if key == '出生地':
                sht.range(f'B{line}').value = values[index]
                index += 1
            if key == '出生日期':
                sht.range(f'C{line}').value = values[index]
                index += 1
            if key == '星座':
                sht.range(f'D{line}').value = values[index]
                index += 1
            if key == '血型':
                sht.range(f'E{line}').value = values[index]
                index += 1
            if key == '身高':
                sht.range(f'F{line}').value = values[index]
                index += 1
            if key == '体重':
                sht.range(f'G{line}').value = values[index]
                index += 1
            if key == '粉丝量':
                sht.range(f'H{line}').value = values[index]
                index += 1
        line += 1
# 将收视率存入Excel
def write_tvs_ratings():
    dongfang = path + '/电视剧数据文件/dongfang.json'
    dongfang = dongfang.replace('\\', '/')
    zhejiang = path + '/电视剧数据文件/zhejiang.json'
    zhejiang = zhejiang.replace('\\', '/')
    with open(dongfang, 'r', encoding='utf8') as f:
        dongfang = json.load(f)
    with open(zhejiang, 'r', encoding='utf8') as f:
        zhejiang = json.load(f)
    title = ['播出日期', '收视率%', '收视份额%', '收拾排名']
    wb = xw.Book()
    sht = wb.sheets('Sheet1')
    sht.range('A1').value = '东方卫视'
    sht.range('E1').value = '浙江卫视'
    sht.range('A2:D2').value = title
    sht.range('E2:H2').value = title
    line = 3
    for d in dongfang:
        sht.range(f'A{line}:D{line}').value = list(d.values())
        line += 1
    line = 3
    for z in zhejiang:
        sht.range(f'E{line}:H{line}').value = list(z.values())
        line += 1

4.模块整合实现
(1) 实现方案
该模块主要实现对数据爬取与存储、数据分析以及数据表格存储模块多个函数进行分类整合。分别自定义get_all()、show_all()和wirte_all()函数,在每个函数中,使用对应模块全部函数。
(2) 实现代码

# 爬取主函数
def get_all():
    get_actors()
    time.sleep(2)
    get_one_actors()
    time.sleep(2)
    get_ratings()
    time.sleep(2)
    get_hot_comments()
    time.sleep(2)
# 绘制分析图
def show_all():
    show_fans()
    show_tv_ratings('dongfang.json')
    show_tv_ratings('zhejiang.json')
    show_tvs_ratings()
    show_hot_comments()
# 数据存入Excel表
def write_all():
    write_actor_infos()
    time.sleep(2)
    write_tvs_ratings()
    time.sleep(2)
    write_hot_comments()
    time.sleep(2)

5 结论

5.1 演员粉丝数量分析

主演粉丝数量分析柱状图:

通过上述柱状图可以看出,除3名未知粉丝数量的演员外,其他6名演员中有4名演员粉丝数量超过1千万,白敬亭粉丝数量最高达到2.7千万。可以得出,该翻拍电视剧主演粉丝基础良好,该翻拍电视剧有较好的观众基础。

5.2卫视收视情况分析

东方卫视收视率变化折线分析图

浙江卫视收视率变化折线分析图

通过上述两个收视率变化折线分析图可以看出,在该翻拍电视剧播出期间,两个卫视收视率呈现稳定上升的趋势,均有一半以上播出时间收视率超过2%,热度良好;且东方卫视在9月27日收视率破3%,热度较高。根据CMS59城收视率评价指标,电视剧收视率到达2%以上,判定收视率良好;收视率达到3%以上,判定收视率较高。可以得出,该翻拍电视剧相对热度正常偏高。

多卫视收视份额变化柱状分析图

通过上述收视份额变化柱状分析图可以看出,在该翻拍电视剧播出期间,两个卫视收视份额大部分时间高于6%,一半左右时间高于7%,部分时间段高达9%或10%。根据收视份额评价指标,电视收视份额达到7%,判定为良好;超过8%,判定为较高。可以得出,该翻拍电视剧在两个卫视的综合热度也正常偏高。
综上,该翻拍电视剧具有正常偏高的热度。

5.3 豆瓣热评分析

豆瓣前100热评观众评价分析图

通过上述观众评价饼形分析图可以看出,中等及以上评价占48%,差评占51%,未评价占1%。可以得出,在前100热评的观众中,该翻拍电视剧观影感受一般。进一步可以推测出,观众对该翻拍电视剧的喜爱程度一般。

5.4 综合分析

通过对上述三个部分的综合分析,可以得出该翻拍电视剧具有良好的演员阵容,观众基础较好。在播出期间,各卫视收视情况较好,有较高的综合热度和相对热度。同时,经过分析也得出,该翻拍电视剧观众喜爱程度一般,可能并未达到观众的心里预期。

三、总结

一个Python爬虫案例,主要对《平凡的荣耀》电视剧相关数据进行爬取和分析,案例相关代码、技术文档、数据分析图、Excel表、json文件等上传在我的csdn下载区中。


转载:https://blog.csdn.net/weixin_45087775/article/details/115799655
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场