使用爬虫,爬取豆瓣前250,电影名称导演和演员列表、电影的评分、电影在排行榜中的排名、对电影进行评价的人数,并存储在一个名为"films.csv"的CSV文件中,将评分和人数分别绘制成折线图进行可视化,封面图片被下载保存在一个名为"films_pic"的文件夹中。
时间: 2024-04-04 14:35:09 浏览: 153
好的,这是一个比较复杂的任务,需要涉及到爬虫、数据处理和可视化等方面。我会尽力为您提供详细的步骤和代码,但是由于篇幅限制和技术细节,可能无法涵盖所有情况。如果您在实现过程中遇到问题,可以随时向我提问。
首先,我们需要安装一些必要的库,包括 requests、beautifulsoup4、pandas、matplotlib、Pillow 等。您可以使用 pip 安装它们:
```
pip install requests beautifulsoup4 pandas matplotlib Pillow
```
接下来,我们可以编写爬虫代码。以下是一个简单的示例,您可以根据需要进行修改和完善:
```python
import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
from PIL import Image
import os
# 定义请求头
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'}
# 爬取页面的 URL
url = 'https://movie.douban.com/top250'
# 发送 GET 请求并获取响应
response = requests.get(url, headers=headers)
html = response.text
# 解析 HTML
soup = BeautifulSoup(html, 'html.parser')
# 获取电影列表
movies = []
for item in soup.find_all('div', class_='item'):
movie = {}
movie['rank'] = item.find('em').text
movie['title'] = item.find('span', class_='title').text
movie['director'] = item.find('div', class_='bd').p.text.split('\n')[1].strip().split(':')[1]
movie['actors'] = item.find('div', class_='bd').p.text.split('\n')[2].strip()[3:]
movie['score'] = float(item.find('span', class_='rating_num').text)
movie['votes'] = int(item.find('span', class_='rating_num').next_sibling.next_sibling.text[:-3])
movie['cover_url'] = item.find('img')['src']
movies.append(movie)
# 存储数据到 CSV 文件
df = pd.DataFrame(movies)
df.to_csv('films.csv', index=False)
# 下载封面图片并保存
if not os.path.exists('films_pic'):
os.mkdir('films_pic')
for movie in movies:
img_url = movie['cover_url']
img_title = movie['title']
img_path = os.path.join('films_pic', f"{img_title}.jpg")
response = requests.get(img_url, headers=headers)
with open(img_path, 'wb') as f:
f.write(response.content)
# 可视化评分和人数
plt.plot(df['rank'], df['score'], label='Score')
plt.plot(df['rank'], df['votes'], label='Votes')
plt.xlabel('Rank')
plt.legend()
plt.savefig('score_votes.png')
plt.show()
```
以上代码中,我们首先定义了请求头和目标 URL,然后发送 GET 请求获取 HTML 页面。接着,使用 BeautifulSoup 解析 HTML,提取出需要的电影信息,并存储到一个字典列表中。然后,使用 pandas 将数据保存到 CSV 文件。接下来,我们遍历电影列表,下载封面图片,并保存到一个名为 "films_pic" 的文件夹中。最后,使用 matplotlib 绘制评分和人数的折线图,并保存为 PNG 文件。
需要注意的是,由于豆瓣网站的反爬虫机制比较严格,可能会出现验证码等问题。您可以尝试设置请求头、使用代理 IP 等方式来规避这些问题。
希望以上代码对您有所帮助!
阅读全文