目标网站:https://movie.douban.com/; 从该网站中找到电影排名的链接; 仔细分析排名网站页面发生变更时的信息; 列出详细分析页面的步骤; 编写代码,模仿浏览器人为操作,获取电影的电影名、导演和演员、评分、排名及图片; 数据存储到films.csv或名为films的记事本中或名为films的数据库中,存储以下内容:电影名、导演和演员、评分、排名; 将电影图片获取后存储到films_pic文件夹中; 对存储数据进行检查处理,实现以电影名评价数及评分生成折线图的可视化操作。
时间: 2024-04-02 18:33:05 浏览: 111
分析页面的步骤:
1. 从目标网站中找到电影排名的链接,即https://movie.douban.com/chart。
2. 使用浏览器开发者工具,查看该页面中需要爬取的信息所在的HTML元素及其CSS选择器。
3. 确定需要爬取的信息包括:电影名、导演和演员、评分、排名及图片。
4. 确定使用Python爬虫框架进行爬取,同时需要使用第三方库进行解析和存储数据。
代码实现:
```python
import requests
from bs4 import BeautifulSoup
import csv
import re
import os
import matplotlib.pyplot as plt
# 创建保存电影图片的文件夹
if not os.path.exists('films_pic'):
os.mkdir('films_pic')
# 定义请求头
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'
}
# 发送请求并获取网页内容
url = 'https://movie.douban.com/chart'
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 解析页面获取电影信息
films = soup.select('div[class="pl2"]')
with open('films.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerow(['电影名', '导演和演员', '评分', '排名'])
for index, film in enumerate(films):
film_name = film.select('a')[0].text.strip() # 电影名
film_url = film.select('a')[0]['href'] # 电影链接
film_pic = film.select('a img')[0]['src'] # 电影图片
film_info = film.select('p')[0].text.strip() # 导演和演员
film_rating = film.select('div[class="star clearfix"] span[class="rating_num"]')[0].text.strip() # 评分
film_ranking = re.findall(r'\d+', film.select('div[class="pl2"] span[class="rating_num"]')[0].next_sibling.strip())[0] # 排名
writer.writerow([film_name, film_info, film_rating, film_ranking])
# 下载电影图片
response = requests.get(film_pic, headers=headers)
with open('films_pic/{}.jpg'.format(film_name), 'wb') as pic:
pic.write(response.content)
# 数据可视化
with open('films.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
film_names = []
film_ratings = []
film_rankings = []
for row in reader:
film_names.append(row['电影名'])
film_ratings.append(float(row['评分']))
film_rankings.append(int(row['排名']))
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(film_names, film_ratings, 'g-')
ax2.plot(film_names, film_rankings, 'b-')
ax1.set_xlabel('电影名')
ax1.set_ylabel('评分', color='g')
ax2.set_ylabel('排名', color='b')
plt.xticks(rotation=90)
plt.title('豆瓣电影排行榜')
plt.show()
```
注意:由于网站页面可能会发生变更,以上代码仅供参考,具体实现需要根据实际情况进行调整。
阅读全文