爬虫案例-豆瓣Top250
数据获取
- 网址 : https://movie.douban.com/top250?start=
- 相关库 :
requests
bs4解析
re正则表达式
- 数据分析及可视化:
pandas
matplotylib
wordcloud
- 存储 :
csv
request获取网页内容
1 | import requests |
1 | 418]> <Response [ |
1.信息响应 (100–199)
2.成功响应(200–299)
3.重定向消息(300–399)
4.客户端错误响应 (400–499)
5.服务端错误响应(500–599)
如何获取 user-agent
:
在网页中,按 F12
打开开发者模式,选网络,按F5刷新页面,点击标头,即可查到 User-Agent
通过设置合理的 User-Agent 来模拟真实用户的请求,从而降低被网站封禁或识别为爬虫的风险,合理即可,网上有很多。
设置好 User-Agent
后:
1 | # 设置请求头 |
1 | 200]> <Response [ |
响应状态码200表示服务器已成功处理了请求.
requests库的相关函数 :
函数 | 说明 |
---|---|
requests.get() | 发送 GET 请求,获取指定 URL 的内容 |
requests.post() | 发送 POST 请求,向指定 URL 提交数据 |
requests.put() | 发送 PUT 请求,更新指定 URL 的内容 |
requests.delete() | 发送 DELETE 请求,删除指定 URL 的资源 |
requests.head() | 发送 HEAD 请求,获取指定 URL 的响应头信息 |
requests.options() | 发送 OPTIONS 请求,获取指定 URL 支持的请求方法和头部信息 |
requests.request() | 通用接口,发送自定义请求方法(GET/POST/PUT/DELETE 等) |
requests.session() | 创建一个 Session 对象,用于发送多个请求并保持会话状态 |
response.text | 获取响应内容(以文本形式返回) |
response.json() | 获取响应内容,并将 JSON 字符串转换为 Python 字典或列表 |
response.status_code | 获取响应的状态码 |
response.headers | 获取响应的头部信息 |
response.cookies | 获取响应的 Cookie 信息 |
response.raise_for_status() | 如果响应状态码不是 200,抛出异常 |
response.content | 获取响应内容的原始字节流 |
response.url | 获取响应的 URL |
response.request | 获取与响应相关的请求对象 |
电影相关信息的定位和获取
如图所示,我们接下来要定位的是 电影名称
、 导演
、主演
、 上映年份
、 制片国家
、 类型
、 评分
、 影评
.
F12,查看网页源代码可以发现,每部电影的信息全部在 **
**里定位相关信息位置
1 | from bs4 import BeautifulSoup |
1 | bs4.element.ResultSet |
定位电影名称,评分数据,影评
由上述 soup.find_all('div', class_='info')
返回一个列表,for 循环迭代即可:
1 | for item in soup.find_all('div', class_='info'): |
1
2
3
4
5
6 >out[]:
># 肖申克的救赎 霸王别姬 阿甘正传 泰坦尼克号 这个杀手不太冷
># 千与千寻 美丽人生 星际穿越 辛德勒的名单 盗梦空间
># 楚门的世界 忠犬八公的故事 海上钢琴师 三傻大闹宝莱坞 放牛班的春天
># 机器人总动员 疯狂动物城 无间道 控方证人 大话西游之大圣娶亲
># 熔炉 教父 触不可及 当幸福来敲门 末代皇帝
1
2
3
4
5
6 >out[]:
># 9.7 9.6 9.5 9.5 9.4
># 9.4 9.6 9.4 9.6 9.4
># 9.4 9.4 9.3 9.2 9.3
># 9.3 9.2 9.3 9.6 9.2
># 9.4 9.3 9.3 9.2 9.3
已经成功获取到电影名称,评分数据,影评.
获取导演,主演,上映年份,制片国家,类型
由于这些信息,在一个标签下,虽然依旧可以用bs4,不过我在这里用正则表达式来定位具体信息。
1 | # 正则表达式 |
1 | for item in soup.find_all('div', class_='info'): |
获取所有页电影信息
至此,我们现在已经获取到了所有与电影相关的信息,不过是其中一页的。
我们来分析一下 url
第一页:https://movie.douban.com/top250?start=0&filter=
可以看到,网页在只在 start=
有变化,我们只需要写一个循环,来更迭url
1 | for start in range(0, 250 + 1, 25): |
好了,再将之前代码跟在后边,就能获取所有的电影数据
数据存储
1 | for start in range(0, 250 + 1, 25): |
movie.csv
文件格式如:
至此,我们已经成功爬取到豆瓣Top250的电影数据
数据分析及可视化
1 | import pandas as pd |
Top | 电影名称 | 导演 | 主演 | 上映年份 | 制片国家 | 类型 | 评分 | 影评 | |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 肖申克的救赎 | 弗兰克·德拉邦特 | 蒂姆·罗宾斯 Tim Robbins / | 1994 | 美国 | 犯罪 剧情 | 9.7 | 希望让人自由。 |
1 | 2 | 霸王别姬 | 陈凯歌 | 张国荣 Leslie Cheung / 张丰毅 Fengyi Zha | 1993 | 中国大陆 中国香港 | 剧情 爱情 同性 | 9.6 | 风华绝代。 |
2 | 3 | 阿甘正传 | 罗伯特·泽米吉斯 | 汤姆·汉克斯 Tom Hanks / | 1994 | 美国 | 剧情 爱情 | 9.5 | 一部美国近现代史。 |
3 | 4 | 泰坦尼克号 | 詹姆斯·卡梅隆 | 莱昂纳多·迪卡普里奥 Leonardo | 1997 | 美国 墨西哥 | 剧情 爱情 灾难 | 9.5 | 失去的才是永恒的。 |
4 | 5 | 这个杀手不太冷 | 吕克·贝松 | 让·雷诺 Jean Reno / 娜塔莉·波特曼 | 1994 | 法国 美国 | 剧情 动作 犯罪 | 9.4 | 怪蜀黍和小萝莉不得不说的故事。 |
1 | # 获取数据的基本信息 |
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 250 entries, 0 to 249
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Top 250 non-null int64
1 电影名称 250 non-null object
2 导演 250 non-null object
3 主演 248 non-null object
4 上映年份 250 non-null int64
5 制片国家 250 non-null object
6 类型 250 non-null object
7 评分 250 non-null float64
8 影评 250 non-null object
dtypes: float64(1), int64(2), object(6)
memory usage: 17.7+ KB
1 | # 统计数值列的统计信息 |
count | mean | std | min | 25% | 50% | 75% | max | |
---|---|---|---|---|---|---|---|---|
Top | 250.0 | 125.50 | 72.31 | 1.0 | 63.25 | 125.5 | 187.75 | 250.0 |
上映年份 | 250.0 | 2000.53 | 15.76 | 1931.0 | 1994.00 | 2004.0 | 2011.00 | 2021.0 |
评分 | 250.0 | 8.93 | 0.27 | 8.4 | 8.70 | 8.9 | 9.10 | 9.7 |
1 | # 计算评分的平均值 |
平均评分: 8.932799999999999
接下来分析:
- 分析出电影中出现次数最多的导演(前5个);
- 分析出电影中出现次数最多的主演(以首个主演为准,前5个);
- 分析出电影中上映年份出现过的年份;
- 分析出电影中出现次数最多的制片国家(前5个);
- 分析出电影中出现次数最多的电影类型(前5个);
- 查找评分最高的5部电影,并获取它们的影评。
1 | import pandas as pd |
导演: ['宫崎骏', '克里斯托弗·诺兰', '史蒂文·斯皮尔伯格', '李安', '王家卫']
主演: ['丹尼尔·雷德克里夫', '周星驰', '马特·达蒙', '汤姆·汉克斯', '莱昂纳多·迪卡普里奥']
上映年份: [2004, 2010, 1994, 2013, 2014, 2008, 2009, 2003, 2016, 2001, 1997, 1993, 2015, 1995, 2002, 2011, 2006, 2018, 2012, 2000, 1991, 2017, 1999, 2005, 1987, 2007, 1998, 1990, 1988, 1984, 2019, 1992, 1989, 1986, 1957, 1974, 1954, 1940, 2021, 1950, 1966, 1931, 2020, 1968, 1952, 1960, 1982, 1961, 1979, 1972, 1996, 1939, 1953, 1936, 1975, 1965, 1971]
制片国家: ['美国', '日本', '中国香港', '英国 美国', '韩国']
电影类型: ['剧情', '爱情', '喜剧', '冒险', '犯罪']
影评: ['希望让人自由。', '最美的谎言。', '比利·怀德满分作品。', '风华绝代。', '拯救一个人,就是拯救整个世界。']
1 | import pandas as pd |
1 | import matplotlib.pyplot as plt |
1 | # 绘制主演频率分布的饼图 |
1 | wordcloud = WordCloud(width=800, height=400, |
总结
以上就是爬取豆瓣Top250的介绍,和数据分析以及可视化。
相关文件
[爬虫源码] 做了修改和优化,这里就不再讲解了。
[movies.csv] 爬取数据的csv文件
[Bean_Data_Analytics_section.ipynb] 数据分析及可视化部分
有问题的话,可以在评论区评论,也可以联系我。
备注:
本文仅供学习交流,对于爬虫浅尝辄止,以免对服务器造成负担
🆗,今天的分享就到这里啦!!!