内容简介:我平时喜欢看电影,也会习惯性参考豆瓣电影评分,而豆瓣对于爬虫爱好者是很友好的,没有太多反爬措施,对新手是很友好的。本文将爬取豆瓣电影 TOP 250榜单的数据进行可视化,主要用了首先打开页面,进入调试模式,我们会看到如下页面:
我平时喜欢看电影,也会习惯性参考豆瓣电影评分,而豆瓣对于爬虫爱好者是很友好的,没有太多反爬措施,对新手是很友好的。
本文将爬取豆瓣电影 TOP 250榜单的数据进行可视化,主要用了 BeautifulSoup
, pandas
, Matplotlib
等数据分析常用的库。
数据爬取
首先打开页面,进入调试模式,我们会看到如下页面:
如图所示,我们可以很直观的看到数据,图示信息就是我们本次要爬取的信息。
接下来,点击页面最下面的翻页,我们注意到第 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') 复制代码
我们来看一下数据:
数据分析和可视化
国家地区
先分析制片的国家地区,可以看到,有的电影不止一个国家地区,比如霸王别姬的制片国家地区是:中国大陆 香港,因此我们可以用 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() 复制代码
美国以 144 部遥遥领先,香港 25 部排名第 4,中国大陆 17 部位居第 7
-
美国:144
-
日本:34
-
英国:34
-
香港:25
-
法国:21
电影类型
我们以同样的方法分析分析电影类型
剧情片 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('评分分布') 复制代码
从上图分析,随着评分升高,排名也基本靠前,评分主要集中在 8.4~9.2
之间。同时可以通过 pandas 计算平均数,众数和相关系数,平均分为 8.83
分,众数为 8.7
分,而相关系数为 -0.6882
,评分与排名强相关。
评价人数
评价人数前 10 电影
用之前同样的方法,我们来分析评价人数的分布情况以及评价人数和排名之间的关系
与评分不同的是,随着评价人数的增多,电影排名有提前的趋势,评价人数主要分布在 10w-50w
之间,平均值为 34.36w
,相关系数为 -0.6865
,评价人数与排名强相关。
年份
电影主要集中在 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 全家福
愿你在电影中遇见另一个世界
愿你在编码中感受学习的快乐
如果你对 Python 开发以及全栈工程师感兴趣,欢迎关注微信公众号,这里不止 Python 哦
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Python数据可视化:豆瓣电影TOP250
- 编写豆瓣相册下载器(python爬虫)
- Scrapy教程--豆瓣电影图片爬取
- 基于 Pytest 豆瓣自动化测试(一)
- 如何 5 分钟零代码实现豆瓣小组爬虫
- 周志华教授力作,豆瓣10分好评
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。