前言
Python爬虫+GUI界面实训作业 标题写的很清楚
之前就感兴趣爬虫,也了解、实操过
但一旦涉及作业、实训,自己最近就做的很烂,但还是记录一下,可能有人用得到
确实水
参考:
Python3 网络爬虫 2 小时简单入门 实战 1—— 爬取豆瓣 Top250
本来是生成csv文件,GPT又写了一个GUI的py文件
介绍
Python爬虫程序的实现:完成豆瓣电影TOP250网站(豆瓣电影 Top 250 (douban.com))的内容爬取,首先保存为csv文件,其次设计GUI程序,使用户直接运行程序即可查看豆瓣电影列表。
可以直接忽略下面的,因为自己实际上是copy的网上爬虫代码,然后让GPT加上GUI而已。
- 使用 requests 库发送 HTTP 请求,获取豆瓣电影 TOP250 页面的 HTML 文档;
- 使用 lxml 库解析 HTML 文档,提取电影排名、名称、演员信息、评分、评论数、经典台词和详情页链接等数据;
- 将提取到的数据保存到字典中,并使用 pandas 库将字典转换为 DataFrame;
- 将 DataFrame 保存为 CSV 文件;
- 使用 tkinter 库创建 GUI 程序,显示 CSV 文件的数据;
- 在 GUI 程序中使用 ttk.Treeview 控件显示 CSV 文件的数据,并添加滚动条和样式;
- 使用 CsvViewer 类封装 GUI 程序的相关操作,包括显示 CSV 文件数据、设置样式等;
- 在主程序中创建 CsvViewer 对象,并传入 CSV 文件名,启动 GUI 程序。
示例截图
代码
import requests
import tkinter as tk
from tkinter import ttk
#csv美化程序
class CsvViewer:
def __init__(self, window, filename):
self.window = window
self.window.title('CSV Viewer')
self.window.geometry('800x500')
# 设置样式
style = ttk.Style()
style.configure('My.Treeview', font=('Microsoft YaHei', 14))
self.frame_top = tk.Frame(self.window)
self.frame_top.pack(side='top')
self.label_filename = tk.Label(self.frame_top, text=f'豆瓣电影TOP250爬取: {filename}')
self.label_filename.pack(side='left', padx=10, pady=10)
self.frame_bottom = tk.Frame(self.window)
self.frame_bottom.pack(side='bottom', padx=10, pady=10)
self.scrollbar_y = tk.Scrollbar(self.frame_bottom)
self.scrollbar_y.pack(side='right', fill='y')
# 使用样式创建控件
self.treeview_data = ttk.Treeview(self.frame_bottom, columns=[], yscrollcommand=self.scrollbar_y.set, style='My.Treeview')
self.treeview_data.heading('#0', text='')
self.treeview_data.column('#0', width=0, stretch=False)
self.treeview_data.config(height=10)
self.treeview_data.configure(yscrollcommand=self.scrollbar_y.set)
self.treeview_data.pack(side='left', fill='both', expand=True)
self.scrollbar_y.config(command=self.treeview_data.yview)
self.load_data(filename)
def load_data(self, filename):
try:
df = pd.read_csv(filename)
columns = list(df.columns)
self.treeview_data['columns'] = columns
for col in columns:
self.treeview_data.heading(col, text=col)
self.treeview_data.column(col, width=120)
for i, row in df.iterrows():
values = [str(row[col]) for col in columns]
self.treeview_data.insert('', i, values=values)
except Exception as e:
tk.messagebox.showerror('Error', str(e))
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62',
}
res = requests.get(url='https://movie.douban.com/top250',headers=headers)
# res.text
from lxml import etree
html = etree.HTML(res.text) # 使用 lxml 库解析 HTML 文档
rank_num = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/em/text()')# 提取电影排名
movie_name = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')# 提取电影名称
actors = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/p[1]/text()[1]') # 提取电影演员信息
actors = [i.strip() for i in actors]# 去除演员信息中的空格
scores = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[2]/text()') # 提取电影评分
comments = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/div/span[4]/text()')# 提取电影评论数
comments = [i.strip('人评价') for i in comments] # 去除评论数中的“人评价”字样
inq = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/p[2]/span/text()')# 提取电影经典台词
details_url = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/@href')# 提取电影详情页链接
datas = {
'rank_num': rank_num,
'movie_name': movie_name,
'actors': actors,
'scores': scores,
'comments': comments,
'inq': inq,
'details_url': details_url
} # 将提取到的数据保存到字典中
# datas
import pandas as pd
df = pd.DataFrame(datas)# 将字典转换为 DataFrame
# df
df.to_csv('datas.csv', index=False) #将 DataFrame 保存为 CSV 文件,不保留行索引
if __name__ == '__main__':
filename = 'datas.csv'
window = tk.Tk()
viewer = CsvViewer(window, filename)# 创建 CsvViewer 对象,并传入文件名
window.mainloop()# 进入主循环,等待用户操作界面