利用 Python 爬取豆瓣电影数据+数据可视化
前言
今天通过 Python 的 Beautiful Soup4
库爬取豆瓣电影 Top 250 的数据,包括电影名称、描述、评分和评价人数等信息。通过这个项目,大家会学会如何使用爬虫技术来获取和分析网页数据。
1. 爬取目标
本次爬取的目标是豆瓣电影网站的 Top 250 排行榜,我们具体希望从每个电影条目中提取出以下信息:
电影名称:每部影片的标题。
电影描述:影片的简短描述或影响力语句。
评分:影片的评分(通常在 10 分制中)。
评价人数:对每部影片进行评分的用户人数。
这些信息对于后续的电影分析、大数据处理或个人兴趣研究具有重要的意义。通过这个爬虫,我们不仅能够获取结构化数据,还能为之后的可视化和机器学习应用打基础。
2. 所涉及知识点
在本项目中,我们将涉及以下几个重要知识点:
HTTP 请求和响应:使用 requests
库读取网页数据。
HTML 解析:利用 Beautiful Soup
库处理 HTML 内容。
XPath 和 CSS 选择器:选择器在数据提取中的应用。
数据存储:使用 csv
库将爬取到的数据保存到本地。
基本的 Python 编程:编写、调试和运行 Python 程序的基础知识。
3. 步骤分析
3.1 安装必要的库
首先,确保你的 Python 环境已经安装了 requests
和 Beautiful Soup4
。可以在命令行中运行以下命令来安装这些库:
pip install requests beautifulsoup4
3.2 发送 HTTP 请求
我们首先需要向目标网站发送一个 HTTP GET 请求,获取网页内容。以下是实现这一功能的代码:
import requests # 定义请求的 URL 和 headers url = "https://movie.douban.com/top250" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } # 发送 GET 请求 response = requests.get(url, headers=headers) response.encoding = 'utf-8' # 设置编码方式 html_content = response.text # 获取网页的 HTML 内容 print("网页内容加载成功!")
这段代码中,我们设置了请求头中的 User-Agent,确保请求不会因为缺乏浏览器信息而被目标网站拒绝。
3.3 解析 HTML 内容
获得网页内容后,我们使用 Beautiful Soup
对其进行解析,并提取所需的数据。以下是解析 HTML 的相关代码:
from bs4 import BeautifulSoup # 使用 Beautiful Soup 解析 HTML soup = BeautifulSoup(html_content, 'html.parser') # 提取电影名称、描述、评分和评价人数 movies = [] for item in soup.find_all('div', class_='item'): title = item.find('span', class_='title').get_text() # 电影名称 description = item.find('span', class_='inq') # 电影描述 rating = item.find('span', class_='rating_num').get_text() # 评分 votes = item.find('div', class_='star').find_all('span')[3].get_text() # 评价人数 # 如果没有描述,将其置为空字符串 if description: description = description.get_text() else: description = '' movie = { "title": title, "description": description, "rating": rating, "votes": votes.replace('人评价', '').strip() } movies.append(movie) print("数据提取成功!")
3.4 数据存储
接下来,将提取到的数据存储到 CSV 文件中。这样我们就可以方便地进行数据分析了。以下是保存数据的相关代码:
import csv # 将数据保存到 CSV 文件 with open('douban_top250.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['title', 'description', 'rating', 'votes'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() # 写入表头 for movie in movies: writer.writerow(movie) # 写入每一行数据 print("数据已成功保存到 douban_top250.csv")
在这段代码中,我们利用 csv.DictWriter
将提取到的电影信息写入 CSV 文件中,使其便于后续查看和分析。
3.5 逐步总结
到这里,我们的爬虫基本上已经完成核心功能。从发送请求到解析网页,再到数据存储,每一步都有每一步的重点和技术要点。
对于复杂网页结构,提取数据时可以灵活使用 soup.find
或 soup.select
等方法。
在处理描述、评分等数据时需要加以注意,有些字段可能不存在。
4. 爬取结果
成功运行上述代码后,在项目目录下会生成一个名为 douban_top250.csv
的文件,内容示例如下:
title | description | rating | votes |
---|---|---|---|
霸王别姬 | 一部关于爱与痛的电影 | 9.6 | 233438 |
肖申克的救赎 | 一场关于自由的斗争 | 9.5 | 235210 |
这个杀手不太冷 | 一部关于爱情与孤独的故事 | 9.4 | 212343 |
在 CSV 文件中,每一行对应一部电影,包含其名称、描述、评分和评价人数。这些数据为后续的分析和可视化提供了基础。
5. 完整代码
下面是整合前面所有步骤的完整代码,方便大家直接复制并运行:
import requests from bs4 import BeautifulSoup import csv # 定义请求的 URL 和 headers url = "https://movie.douban.com/top250" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } # 发送 GET 请求 response = requests.get(url, headers=headers) response.encoding = 'utf-8' # 设置编码方式 html_content = response.text # 获取网页的 HTML 内容 # 使用 Beautiful Soup 解析 HTML soup = BeautifulSoup(html_content, 'html.parser') # 提取电影名称、描述、评分和评价人数 movies = [] for item in soup.find_all('div', class_='item'): title = item.find('span', class_='title').get_text() # 电影名称 description = item.find('span', class_='inq') # 电影描述 rating = item.find('span', class_='rating_num').get_text() # 评分 votes = item.find('div', class_='star').find_all('span')[3].get_text() # 评价人数 # 如果没有描述,将其置为空字符串 if description: description = description.get_text() else: description = '' movie = { "title": title, "description": description, "rating": rating, "votes": votes.replace('人评价', '').strip() } movies.append(movie) # 将数据保存到 CSV 文件 with open('douban_top250.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['title', 'description', 'rating', 'votes'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() # 写入表头 for movie in movies: writer.writerow(movie) # 写入每一行数据 print("数据已成功保存到 douban_top250.csv")
关于Python技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
👉Python学习路线汇总👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉Python必备开发工具👈
👉Python学习视频合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉实战案例👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉Python副业兼职路线&方法👈
学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。
作者:bug鸭陆