利用tkinter设计系统界面,爬取豆瓣top250,并用matplotlib实现数据绘图,数据保存在数据库中,代码注释,给出设计思路
时间: 2024-03-04 08:50:30 浏览: 127
豆瓣Top250数据爬取及可视化
好的,我会尽力回答您的问题。
本系统涉及到的主要技术点有:Tkinter、爬虫、matplotlib、数据库以及注释。
1. 界面设计
首先,我们需要使用Tkinter来设计系统的用户界面。Tkinter是Python的标准GUI库,使用它可以方便地创建GUI程序。我们可以使用Tkinter的各种部件(按钮、标签、输入框等)来构建我们的界面。
具体实现方法如下:
```python
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.pack()
self.create_widgets()
def create_widgets(self):
self.quit = tk.Button(self, text="QUIT", fg="red",
command=root.destroy)
self.quit.pack(side="bottom")
root = tk.Tk()
app = Application(master=root)
app.mainloop()
```
以上代码创建了一个简单的Tkinter窗口。其中,Application是我们自定义的一个类,继承自Tkinter的Frame类,用于创建GUI界面。在类的构造函数中,我们通过调用父类的构造函数,来初始化窗口。之后,我们通过调用create_widgets()函数,创建了一个名为“QUIT”的按钮,并将它放置在窗口的底部。
2. 爬虫
接下来,我们需要编写爬虫程序,从豆瓣网站上爬取Top250电影的数据。具体实现方法如下:
```python
import requests
from bs4 import BeautifulSoup
def get_html(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def parse_html(html):
soup = BeautifulSoup(html, 'html.parser')
movie_list = []
for item in soup.find_all('div', class_='item'):
rank = item.find('em').text
title = item.find('span', class_='title').text
rating_num = item.find('span', class_='rating_num').text
movie_list.append([rank, title, rating_num])
return movie_list
def main():
url = 'https://movie.douban.com/top250'
movie_list = []
for i in range(10):
page_url = url + '?start=' + str(i*25) + '&filter='
html = get_html(page_url)
movie_list += parse_html(html)
print(movie_list)
if __name__ == '__main__':
main()
```
以上代码定义了4个函数,分别用于获取网页内容、解析网页内容、爬取Top250电影列表以及主函数。其中,get_html()函数用于获取网页内容,parse_html()函数用于解析网页内容,get_movie_list()函数用于爬取Top250电影列表,main()函数用于调用以上3个函数,并输出结果。
3. 数据库
在爬取到Top250电影数据之后,我们需要将数据保存到数据库中。Python中常用的数据库有MySQL、SQLite等。这里我们使用SQLite作为示例。
具体实现方法如下:
```python
import sqlite3
def create_table():
conn = sqlite3.connect('movie.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE movie
(rank INT PRIMARY KEY NOT NULL,
title TEXT NOT NULL,
rating_num REAL NOT NULL);''')
conn.commit()
conn.close()
def insert_data(movie_list):
conn = sqlite3.connect('movie.db')
cursor = conn.cursor()
for movie in movie_list:
cursor.execute("INSERT INTO movie (rank,title,rating_num) \
VALUES (?,?,?)", movie)
conn.commit()
conn.close()
def main():
create_table()
url = 'https://movie.douban.com/top250'
movie_list = []
for i in range(10):
page_url = url + '?start=' + str(i*25) + '&filter='
html = get_html(page_url)
movie_list += parse_html(html)
insert_data(movie_list)
if __name__ == '__main__':
main()
```
以上代码定义了3个函数,create_table()函数用于创建数据库表,insert_data()函数用于向数据库中插入数据,main()函数用于调用以上2个函数,并将数据保存到数据库中。
4. 数据可视化
在将数据保存到数据库后,我们可以使用matplotlib对数据进行可视化。具体实现方法如下:
```python
import sqlite3
import matplotlib.pyplot as plt
def draw_chart():
conn = sqlite3.connect('movie.db')
cursor = conn.cursor()
cursor.execute("SELECT rating_num FROM movie")
data = cursor.fetchall()
data = [d[0] for d in data]
plt.hist(data, bins=20)
plt.show()
conn.close()
if __name__ == '__main__':
draw_chart()
```
以上代码定义了一个draw_chart()函数,该函数从数据库中获取评分数据,并使用matplotlib绘制评分直方图。
5. 注释
最后,我们需要为代码添加注释。注释是一个好习惯,可以帮助他人更好地理解我们的代码。在编写注释时,我们应该尽量简洁明了,注释应该说明代码的作用、参数、返回值等信息。
以上就是本系统的设计思路,希望对您有所帮助。
阅读全文