博客主页:小馒头学python
本文专栏: Python爬虫五十个小案例
专栏简介:分享五十个Python爬虫小案例
🪲前言
在这篇博客中,我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用
requests
库来发送HTTP请求,BeautifulSoup
库来解析HTML页面,并将数据存储到CSV文件中。这个爬虫将自动获取豆瓣电影Top250页面的信息,包括电影名称、导演、主演、评分等详细信息
豆瓣电影Top250是一个包含豆瓣评分最高的250部电影的榜单,是电影爱好者查找电影的一大宝库。本博客将指导大家如何通过编写Python爬虫自动获取豆瓣电影Top250的数据
🪲环境准备
首先,我们需要安装一些Python库来完成本次任务。以下是我们将使用的库:
requests
:用来发送HTTP请求并获取网页内容。BeautifulSoup
:用来解析HTML页面,提取我们需要的数据。csv
:将爬取的数据保存到CSV文件中。
因为我们使用的是Python进行爬虫,所以我们使用的命令行是
pip install requests beautifulsoup4 csv
🪲爬虫原理与分析
豆瓣电影Top250的URL是 https://movie.douban.com/top250
。页面内容是分页显示的,每一页展示25部电影,最多5页。我们需要访问这些页面并提取电影数据
数据结构分析
每一部电影的信息在HTML结构中都有相应的标签,我们需要从中提取出以下信息:
- 电影名称
- 电影评分
- 电影导演
- 电影主演
- 电影年份
- 电影类型
通过使用BeautifulSoup
解析HTML,我们可以轻松提取这些信息
🪲代码具体的实现
发送请求获取网页内容
我们首先使用requests
库发送请求来获取网页内容。豆瓣会返回HTML页面,我们将把这些内容传递给BeautifulSoup
进行解析
python
import requests
from bs4 import BeautifulSoup
# 设置请求头,避免被豆瓣屏蔽
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
# 获取豆瓣电影Top250的前五页数据
base_url = "https://movie.douban.com/top250"
movie_list = []
def get_page(url):
response = requests.get(url, headers=headers)
return response.text
解析网页内容
使用BeautifulSoup
解析HTML页面,找到每部电影的信息。每部电影的信息包含在div
标签中,类名为item
python
def parse_page(html):
soup = BeautifulSoup(html, 'html.parser')
movies = soup.find_all('div', class_='item')
for movie in movies:
title = movie.find('span', class_='title').text
rating = movie.find('span', class_='rating_num').text
director, actors = movie.find('div', class_='bd').find('p').text.strip().split("\n")[:2]
year = movie.find('div', class_='bd').find('p').text.strip().split("\n")[0]
movie_type = movie.find('span', class_='genre').text.strip()
movie_info = {
'title': title,
'rating': rating,
'director': director,
'actors': actors,
'year': year,
'type': movie_type
}
movie_list.append(movie_info)
提取电影数据
我们现在可以循环访问每一页的URL并提取数据。豆瓣电影Top250有5页,URL结构为https://movie.douban.com/top250?start=X
,其中X
为每页的起始索引(0, 25, 50, ...)
接下来我们的其他案例也会采取类似的分析方式,同学们可以
Python
def main():
for start in range(0, 250, 25):
url = f"{base_url}?start={start}"
html = get_page(url)
parse_page(html)
# 输出结果
for movie in movie_list:
print(movie)
if __name__ == "__main__":
main()
保存数据到CSV文件或者Excel文件
为了方便后续的数据分析,我们可以将数据保存到CSV文件中
Python
import csv
def save_to_csv():
keys = movie_list[0].keys()
with open('douban_top250.csv', 'w', newline='', encoding='utf-8') as output_file:
dict_writer = csv.DictWriter(output_file, fieldnames=keys)
dict_writer.writeheader()
dict_writer.writerows(movie_list)
save_to_csv()
如果是Excel那么可以参考下面的案例代码
python
import pandas as pd # 导入pandas库
def save_to_excel():
df = pd.DataFrame(movie_list) # 将电影列表转换为DataFrame
df.to_excel('douban_top250.xlsx', index=False, engine='openpyxl') # 保存为Excel文件
🪲完整的代码
python
import csv
import requests
from bs4 import BeautifulSoup
import pandas as pd # 导入pandas库
# 设置请求头,避免被豆瓣屏蔽
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
# 获取豆瓣电影Top250的前五页数据
base_url = "https://movie.douban.com/top250"
movie_list = []
# 发送请求获取网页内容
def get_page(url):
response = requests.get(url, headers=headers)
return response.text
# 解析网页内容并提取电影信息
def parse_page(html):
soup = BeautifulSoup(html, 'html.parser')
movies = soup.find_all('div', class_='item')
for movie in movies:
title = movie.find('span', class_='title').text
rating = movie.find('span', class_='rating_num').text
director_actors = movie.find('div', class_='bd').find('p').text.strip().split("\n")[:2]
director = director_actors[0]
actors = director_actors[1] if len(director_actors) > 1 else ''
# 处理电影类型,避免找不到的情况
genre_tag = movie.find('span', class_='genre')
movie_type = genre_tag.text.strip() if genre_tag else '未知'
# 处理电影年份
year_tag = movie.find('div', class_='bd').find('p').text.strip().split("\n")[0]
# 构建电影信息字典
movie_info = {
'title': title,
'rating': rating,
'director': director,
'actors': actors,
'year': year_tag,
'type': movie_type
}
# 将电影信息添加到列表中
movie_list.append(movie_info)
# 爬取豆瓣电影Top250的所有页面
def main():
# 遍历前5页的豆瓣Top250
for start in range(0, 250, 25):
url = f"{base_url}?start={start}"
html = get_page(url)
parse_page(html)
# 输出结果
for movie in movie_list:
print(movie)
def save_to_csv():
keys = movie_list[0].keys() # 获取电影数据字典的键(即列名)
# 写入CSV文件
with open('douban_top250.csv', 'w', newline='', encoding='utf-8-sig') as output_file:
dict_writer = csv.DictWriter(output_file, fieldnames=keys)
dict_writer.writeheader() # 写入列名
dict_writer.writerows(movie_list) # 写入电影数据
# 主函数
if __name__ == "__main__":
main()
save_to_csv()
print("爬取完成,数据已保存到 douban_top250.csv")
🪲运行效果
运行上述代码后,你将会得到一个名为douban_top250.csv
的文件,文件内容如下所示:
下图是保存为csv文件的格式,这里注意encoding='utf-8-sig',encoding如果等于utf-8,那么直接双击csv文件会乱码的
🪲总结
本文主要介绍了如果使用简单的爬虫进行数据的爬取,这里主要进行豆瓣电影Top250的数据爬取,我们使用的库就是requests、bs4、pandas、csv等库,本节主要重在案例的实践,还想了解更多的爬虫案例可以关注我的专栏