利用tkinter设计系统界面,爬取豆瓣top250,并用matplotlib实现数据绘图,数据保存在数据库中,代码注释,给出设计思路,给出一份完整代码
时间: 2024-03-04 17:50:29 浏览: 75
豆瓣Top250数据爬取及可视化
好的,下面是一个完整的代码示例,包括界面设计、数据爬取、数据库存储和数据可视化:
```python
import tkinter
import requests
from bs4 import BeautifulSoup
import sqlite3
import matplotlib.pyplot as plt
# 爬取豆瓣电影Top250的网页地址
URL = 'https://movie.douban.com/top250'
# 创建窗口和控件
window = tkinter.Tk()
window.title('豆瓣电影Top250')
window.geometry('500x500')
label = tkinter.Label(window, text='点击按钮开始爬取', font=('Arial', 18))
label.pack()
button = tkinter.Button(window, text='开始爬取', font=('Arial', 16), bg='green', fg='white')
button.pack()
text = tkinter.Text(window, height=20, font=('Arial', 14))
text.pack()
# 爬取数据的函数
def crawl():
# 显示提示信息
label.config(text='正在爬取数据,请稍候...')
# 爬取网页内容
response = requests.get(URL)
soup = BeautifulSoup(response.text, 'html.parser')
# 获取电影信息
movie_list = []
for item in soup.select('.item'):
name = item.select_one('.title').text.strip()
rating = item.select_one('.rating_num').text.strip()
rating_num = item.select_one('.rating_num + span').text.strip('(人评价)')
director = item.select_one('.bd p:first-child').text.strip().split(' ')[1]
actors = item.select_one('.bd p:nth-child(3)').text.strip().split(' ')[1:]
movie_list.append((name, rating, rating_num, director, actors))
# 显示结果
text.delete('1.0', tkinter.END)
for movie in movie_list:
text.insert(tkinter.END, f'{movie[0]} {movie[1]} {movie[2]} {movie[3]} {",".join(movie[4])}\n')
# 将数据存储到数据库
conn = sqlite3.connect('movies.db')
cursor = conn.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS movies (name TEXT, rating FLOAT, rating_num INTEGER, director TEXT, actors TEXT)')
cursor.execute('DELETE FROM movies')
cursor.executemany('INSERT INTO movies VALUES (?, ?, ?, ?, ?)', movie_list)
conn.commit()
conn.close()
# 显示完成信息
label.config(text='数据爬取完成!')
# 绘制评分分布图
conn = sqlite3.connect('movies.db')
cursor = conn.cursor()
cursor.execute('SELECT rating FROM movies')
ratings = cursor.fetchall()
conn.close()
ratings = [float(x[0]) for x in ratings]
plt.hist(ratings, bins=20)
plt.xlabel('评分')
plt.ylabel('电影数量')
plt.title('豆瓣电影Top250评分分布')
plt.show()
# 绑定按钮点击事件
button.config(command=crawl)
# 运行窗口
window.mainloop()
```
这个代码实现了以下功能:
1. 创建了一个GUI窗口,包含一个标签、一个按钮和一个文本框;
2. 用户点击按钮时,程序会爬取豆瓣电影Top250的数据,并将结果显示在文本框中;
3. 程序将数据存储到SQLite数据库中;
4. 程序绘制了豆瓣电影Top250的评分分布图。
这个代码中用到的库包括:
1. tkinter:Python自带的GUI库,用于创建窗口和控件。
2. requests:用于发送HTTP请求,获取网页内容。
3. BeautifulSoup:用于解析HTML文档,提取数据。
4. sqlite3:Python自带的轻量级数据库,用于存储数据。
5. matplotlib:用于绘制数据可视化图表。
希望这个代码对你有所帮助!
阅读全文