数据可视化豆瓣电影 TOP250

栏目: 数据库 · 发布时间: 5年前

内容简介:我平时喜欢看电影,也会习惯性参考豆瓣电影评分,而豆瓣对于爬虫爱好者是很友好的,没有太多反爬措施,对新手是很友好的。本文将爬取豆瓣电影 TOP 250榜单的数据进行可视化,主要用了首先打开页面,进入调试模式,我们会看到如下页面:

我平时喜欢看电影,也会习惯性参考豆瓣电影评分,而豆瓣对于爬虫爱好者是很友好的,没有太多反爬措施,对新手是很友好的。

本文将爬取豆瓣电影 TOP 250榜单的数据进行可视化,主要用了 BeautifulSoup , pandas , Matplotlib 等数据分析常用的库。

数据爬取

首先打开页面,进入调试模式,我们会看到如下页面:

数据可视化豆瓣电影 TOP250

如图所示,我们可以很直观的看到数据,图示信息就是我们本次要爬取的信息。

接下来,点击页面最下面的翻页,我们注意到第 2 页的地址为: movie.douban.com/top250?star… 第 3 页的地址为: movie.douban.com/top250?star…

不难发现其规律,那就开始写代码吧。

import os
 
 import matplotlib.pyplot as plt
 import pandas as pd
 import requests
 from bs4 import BeautifulSoup
 
 def movies_spider():
    records = []
    for start in (range(250)[::25]):
        url = f"https://movie.douban.com/top250?start={start}"
        response = requests.get(url).text
        soup = BeautifulSoup(response, 'html.parser')
        movie_list = soup.find_all(class_='item')
        for item in movie_list:
            rank = int(item.find('em').string)  # 排名
            pic = item.find(class_='pic')
            href = pic.find('a')['href']  # 链接

            info = item.find(class_='info')
            name = info.find(class_='title').string  # 电影名称
            rating_num = info.find(class_='rating_num').string  # 评分
            total = info.find(
                class_='rating_num').find_next_sibling().find_next_sibling().string[:-3]  # 评价人数
            inq = info.find(class_='inq')  # 简评
            try:
                quote = inq.get_text()
            except AttributeError:
                quote = None
                print("Type error")
            bd_div = item.find(class_='bd')
            infos = bd_div.find('p').get_text().strip().split('\n')
            # infos = ['导演: 弗兰克·德拉邦特 Frank Darabont\xa0\xa0\xa0主演: 蒂姆·罗宾斯 Tim Robbins /...',
            #          '                            1994\xa0/\xa0美国\xa0/\xa0犯罪 剧情']
            info1 = infos[0].split('\xa0\xa0\xa0')
            director = info1[0][4:]  # 导演
            info2 = infos[1].lstrip().split('\xa0/\xa0')
            year = info2[0][:4]
            area = info2[1]
            movie_type = info2[2]

            movie = {
                'rank': rank,
                'name': name,
                'director': director,
                'year': year,
                'area': area,
                'type': movie_type,
                'rating_num': rating_num,
                'comment_num': total,
                'quote': quote,
                'url': href
            }
            records.append(movie)
    return records
复制代码

代码配合前面的源代码,还是很好理解的,接下来先将数据保存为 csv 文件,然后再利用 pandas 分析处理

headers = ['rank', 'name', 'director', 'year', 'area', 'type', 'rating_num', 'comment_num',
           'quote', 'url']
df = pd.DataFrame(rows, columns=headers)
df.to_csv('top250.csv')
复制代码

我们来看一下数据:

数据可视化豆瓣电影 TOP250

数据分析和可视化

国家地区

先分析制片的国家地区,可以看到,有的电影不止一个国家地区,比如霸王别姬的制片国家地区是:中国大陆 香港,因此我们可以用 split 进行处理

area_split = df['area'].str.split(' ').apply(pd.Series)
复制代码

可以看到电影最多有5个国家地区,我们进行统计,求和,最后绘图

a = area_split.apply(pd.value_counts)
area_count = a.sum(axis=1)
area_df = pd.DataFrame(area_count, columns=['count'], dtype=int).sort_values(by='count')
area_df.plot.barh()
复制代码
数据可视化豆瓣电影 TOP250

美国以 144 部遥遥领先,香港 25 部排名第 4,中国大陆 17 部位居第 7

  • 美国:144

  • 日本:34

  • 英国:34

  • 香港:25

  • 法国:21

电影类型

我们以同样的方法分析分析电影类型

数据可视化豆瓣电影 TOP250

剧情片 191 部同样遥遥领先,爱情、冒险、喜剧和犯罪,也是大家喜欢的类型。

  • 剧情:192

  • 爱情:57

  • 冒险:47

  • 喜剧:47

  • 犯罪:44

导演

前5的导演是:

  • 克里斯托弗·诺兰:7

  • 宫崎骏:6

  • 王家卫:5

  • 史蒂文·斯皮尔伯格:5

  • 李安:5

这几位导演真是实至名归

评分

首先看一下排名前 10 的电影

排名 电影 评分
1 肖申克的救赎 9.6
33 控方证人 9.6
2 霸王别姬 9.6
5 美丽人生 9.5
8 辛德勒的名单 9.5
3 这个杀手不太冷 9.4
4 阿甘正传 9.4
32 十二怒汉 9.4
14 放牛班的春天 9.3
217 城市之光 9.3

注意到《城市之光》以 9.3 分排名 217,那么我们就会有疑问,评分与排名之间有什么关系呢,我们通过绘制散点图和直方图来分析

df.plot.scatter(x='rating_num', y='rank')
plt.title('评分与排名关系')
plt.xlabel('评分')
plt.ylabel('排名')
plt.gca().invert_yaxis()

df['rating_num'].plot.hist(bins=10, rwidth=0.9)
plt.title('评分分布')
复制代码
数据可视化豆瓣电影 TOP250
数据可视化豆瓣电影 TOP250

从上图分析,随着评分升高,排名也基本靠前,评分主要集中在 8.4~9.2 之间。同时可以通过 pandas 计算平均数,众数和相关系数,平均分为 8.83 分,众数为 8.7 分,而相关系数为 -0.6882 ,评分与排名强相关。

评价人数

评价人数前 10 电影

数据可视化豆瓣电影 TOP250

用之前同样的方法,我们来分析评价人数的分布情况以及评价人数和排名之间的关系

数据可视化豆瓣电影 TOP250
数据可视化豆瓣电影 TOP250

与评分不同的是,随着评价人数的增多,电影排名有提前的趋势,评价人数主要分布在 10w-50w 之间,平均值为 34.36w ,相关系数为 -0.6865 ,评价人数与排名强相关。

年份

数据可视化豆瓣电影 TOP250
数据可视化豆瓣电影 TOP250

电影主要集中在 1990 年以后,相关系数为 0.0173 ,年份与排名没有相关性。

最早的电影是在 1931 年,卓别林的《城市之光》

最近的电影是在 2017 年,三部

  • 《请以你的名字呼唤我》:117

  • 《三块广告牌》:191

  • 《寻梦环游记》:63

电影数量前三的年份分别是:

  • 2010:14

  • 2004:12

  • 1994:11

没想到贡献了三部前 5 的电影大年 1994 也只能屈居第 3 位,最后我们来看看贡献数量最多的 2010 年都有哪些佳作

排名 电影
9 盗梦空间
24 怦然心动
68 让子弹飞
86 禁闭岛
99 告白
118 驯龙高手
123 神偷奶爸
125 借东西的小人阿莉埃蒂
128 岁月神偷
142 黑天鹅
155 玩具总动员3
163 你看起来好像很好吃
214 初恋这件小事
237 国王的演讲

结语

本文仅对数据进行简单的爬取分析和可视化,目的在于学习这些库的基本使用,你还可以进行深度挖掘分析,比如可以进一步分析评价人数,评分,排名的关系,分析演员,语言以及时长等等,一个好的思路可能比技术更重要。

最后上一个 TOP250 全家福

数据可视化豆瓣电影 TOP250

愿你在电影中遇见另一个世界

愿你在编码中感受学习的快乐

如果你对 Python 开发以及全栈工程师感兴趣,欢迎关注微信公众号,这里不止 Python 哦

数据可视化豆瓣电影 TOP250

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

移动风暴

移动风暴

[美]弗雷德·沃格尔斯坦 / 朱邦芊 / 中信出版社 / 2014-1-1 / 39

也许,除了伟大的乔布斯,每一位奋力改变世界的硅谷英雄,都值得我们肃然起敬。苹果与谷歌十年博弈,关于这场移动平台战争的报道早已铺天盖地,而这是第一次,我们能听到幕后工程师的真实声音。两大科技巨人用智能手机和平板电脑颠覆了电脑产业。它们位处变革的中心,凭借各自的经营哲学、魅力领袖和商业敏感度,把竞争变成了残酷对决。商业记者沃格尔斯坦报道这场对抗已逾十载,在《移动风暴》中,他带领我们来到一间间办公室和会......一起来看看 《移动风暴》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具