数据可视化豆瓣电影 TOP250

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

内容简介:我平时喜欢看电影,也会习惯性参考豆瓣电影评分,而豆瓣对于爬虫爱好者是很友好的,没有太多反爬措施,对新手是很友好的。本文将爬取豆瓣电影 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

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

查看所有标签

猜你喜欢:

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

Rework

Rework

Jason Fried、David Heinemeier Hansson / Crown Business / 2010-3-9 / USD 22.00

"Jason Fried and David Hansson follow their own advice in REWORK, laying bare the surprising philosophies at the core of 37signals' success and inspiring us to put them into practice. There's no jarg......一起来看看 《Rework》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具