Python爬取豆瓣top100信息和电影图片并做出可视化数据,每行代码都要注释,并写出程序设计思路,代码完整可运行
时间: 2023-06-24 07:07:25 浏览: 99
Python实现的爬取豆瓣电影信息功能案例
程序设计思路:
1. 导入需要的模块:requests、beautifulsoup4、pandas、matplotlib、PIL
2. 使用requests模块获取豆瓣电影Top250的网页源代码
3. 使用beautifulsoup4模块解析网页源代码,获取电影名称、评分、图片链接等信息
4. 使用pandas模块将获取的信息整合为DataFrame格式
5. 使用matplotlib模块绘制电影评分的柱状图
6. 使用PIL模块下载电影海报图片并保存在本地
完整代码如下:
```python
import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
from PIL import Image
import io
# 定义获取网页源代码函数
def get_html(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "Error"
# 定义获取电影信息函数
def get_movie_info(html):
soup = BeautifulSoup(html, 'html.parser')
data = []
for item in soup.find_all('div', class_='item'):
title = item.find('span', class_='title').string
rating_num = item.find('span', class_='rating_num').string
img_url = item.find('img')['src']
data.append([title, rating_num, img_url])
return data
# 定义生成DataFrame函数
def generate_dataframe(data):
df = pd.DataFrame(data, columns=['Title', 'Rating', 'Img_url'])
return df
# 定义绘制柱状图函数
def draw_rating_bar(df):
# 按评分排序
df = df.sort_values(by='Rating', ascending=False)
# 绘制柱状图
plt.bar(df['Title'], df['Rating'])
plt.xticks(rotation=90)
plt.xlabel('Movie Title')
plt.ylabel('Rating')
plt.title('Top 100 Movies on Douban')
plt.show()
# 定义下载图片函数
def download_image(img_url, file_path):
img_data = requests.get(img_url).content
img = Image.open(io.BytesIO(img_data))
img.save(file_path)
# 主函数
if __name__ == '__main__':
url = 'https://movie.douban.com/top250'
html = get_html(url)
data = get_movie_info(html)
df = generate_dataframe(data)
draw_rating_bar(df.head(10))
for i in range(10):
download_image(df.loc[i, 'Img_url'], f'{i+1}.png')
```
注释详解:
1. 导入需要的模块:requests、beautifulsoup4、pandas、matplotlib、PIL
```python
import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
from PIL import Image
import io
```
2. 使用requests模块获取豆瓣电影Top250的网页源代码
```python
def get_html(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "Error"
url = 'https://movie.douban.com/top250'
html = get_html(url)
```
3. 使用beautifulsoup4模块解析网页源代码,获取电影名称、评分、图片链接等信息
```python
def get_movie_info(html):
soup = BeautifulSoup(html, 'html.parser')
data = []
for item in soup.find_all('div', class_='item'):
title = item.find('span', class_='title').string
rating_num = item.find('span', class_='rating_num').string
img_url = item.find('img')['src']
data.append([title, rating_num, img_url])
return data
data = get_movie_info(html)
```
4. 使用pandas模块将获取的信息整合为DataFrame格式
```python
def generate_dataframe(data):
df = pd.DataFrame(data, columns=['Title', 'Rating', 'Img_url'])
return df
df = generate_dataframe(data)
```
5. 使用matplotlib模块绘制电影评分的柱状图
```python
def draw_rating_bar(df):
# 按评分排序
df = df.sort_values(by='Rating', ascending=False)
# 绘制柱状图
plt.bar(df['Title'], df['Rating'])
plt.xticks(rotation=90)
plt.xlabel('Movie Title')
plt.ylabel('Rating')
plt.title('Top 100 Movies on Douban')
plt.show()
draw_rating_bar(df.head(10))
```
6. 使用PIL模块下载电影海报图片并保存在本地
```python
def download_image(img_url, file_path):
img_data = requests.get(img_url).content
img = Image.open(io.BytesIO(img_data))
img.save(file_path)
for i in range(10):
download_image(df.loc[i, 'Img_url'], f'{i+1}.png')
```
程序运行后,会生成一张柱状图和前十部电影的海报图片。你也可以根据自己的需求修改代码,如获取更多电影信息或绘制不同的图表类型。
阅读全文