爬取豆瓣Top250电影,获取电影的电影名、导演和演员、评分、排名及图片; 数据存储到films.csv或名为films的记事本中或名为films的数据库中,存储以下内容:电影名、导演和演员、评分、排名; 将电影图片获取后存储到films_pic文件夹中; 对存储数据进行检查处理,实现以电影名评价数及评分生成折线图的可视化操作。
时间: 2024-04-06 21:33:21 浏览: 174
好的,这是一个比较完整的爬虫项目,需要涉及到数据抓取、数据存储、数据处理和数据可视化等多个方面。下面是具体的实现步骤。
1. 发送请求获取网页源代码
首先,我们需要发送 GET 请求获取豆瓣电影 Top250 的网页源代码。可以使用 Python 的 requests 库来实现,代码如下:
```
import requests
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/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
html = response.text
```
2. 解析网页源代码
接下来,我们需要使用 Python 的 BeautifulSoup 库来解析网页源代码,代码如下:
```
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
movies = soup.find_all('div', class_='item')
```
3. 提取数据
在解析网页源代码后,我们可以通过提取特定的 HTML 标签来获取需要的数据,例如提取电影名、导演和演员、评分、排名及图片:
```
import re
import csv
import os
# 创建CSV文件
if not os.path.exists('films.csv'):
with open('films.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['电影名', '导演和演员', '评分', '排名'])
# 创建图片文件夹
if not os.path.exists('films_pic'):
os.mkdir('films_pic')
for movie in movies:
title = movie.find('span', class_='title').get_text() # 电影名
info = movie.find('div', class_='bd').p.get_text().strip() # 导演和演员
rating = movie.find('span', class_='rating_num').get_text() # 评分
rank = movie.find('em').get_text() # 排名
img_url = movie.find('img')['src'] # 图片链接
# 保存电影信息到CSV文件
with open('films.csv', 'a', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow([title, info, rating, rank])
# 下载电影图片
img_path = 'films_pic/{}.jpg'.format(re.sub(r'[\\/:\*\?"<>|]', '', title))
if not os.path.exists(img_path):
with open(img_path, 'wb') as f:
f.write(requests.get(img_url).content)
```
在上述代码中,我们使用了 re 模块来去掉电影名中的非法字符,并将电影信息保存到了名为 films.csv 的 CSV 文件中,将电影图片保存到了名为 films_pic 的文件夹中。
4. 数据可视化
最后,我们可以使用 Python 的 pandas 和 matplotlib 库来对存储的数据进行处理和可视化。首先,我们需要读取 CSV 文件并进行处理,代码如下:
```
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('films.csv', encoding='utf-8-sig')
# 按电影名分组,计算评价数和平均评分
df_grouped = df.groupby('电影名').agg({'评分': 'mean', '排名': 'max', '导演和演员': 'first', '电影名': 'count'})
df_grouped.columns = ['平均评分', '排名', '导演和演员', '评价数']
df_grouped = df_grouped.sort_values('评价数', ascending=False)
```
上述代码中,我们首先使用 pandas 的 read_csv 方法读取了 CSV 文件,然后使用 groupby 方法按电影名进行分组,计算了评价数和平均评分,并对评价数进行了降序排序。
接下来,我们可以使用 matplotlib 库来绘制折线图,代码如下:
```
# 绘制折线图
plt.plot(df_grouped['评价数'], df_grouped['平均评分'], 'b-o')
plt.xlabel('评价数')
plt.ylabel('平均评分')
plt.title('电影评价数与平均评分的关系')
plt.show()
```
上述代码中,我们使用 matplotlib 的 plot 方法绘制了评价数与平均评分的关系折线图,并使用 xlabel、ylabel 和 title 方法设置了 X 轴、Y 轴和标题的标签,最后使用 show 方法显示了图形。
至此,一个完整的爬虫项目就完成了,我们成功地抓取了豆瓣电影 Top250 的数据,并将数据存储到了 CSV 文件中,同时也将电影图片下载到了本地文件夹中,最后还对数据进行了处理和可视化。
阅读全文