基于Python tkinter的豆瓣电影助手如何实现与使用?
项目简介
这个项目源于大三某课程设计。平常经常需要搜索一些电影,为了方便使用,就将原来的项目重新改写了。由于是基于 python tkinter 进行桌面端开发的,所以相对 WEB 端来说,可能不是特别方便。
配置说明
- 打开 http://phantomjs.org/download.html,根据自己的操作系统下载对应的 phantomjs
- 打开当前面目录下的**<u>getMovieInRankingList.py</u>**,定位到第 86 行,将
executable_path=phantomjs-2.1.1-macosx/bin/phantomjs修改成你自己的路径,如executable_path=xxx/bin/phantomjs - 打开 pycharm,依次安装以下包
- pip install Pillow
- pip install selenium==2.48.0
功能截图


包含功能
- [x] 根据关键字搜索电影
- [x] 根据排行榜(TOP250)搜索电影
- [x] 显示 IMDB 评分及其他基本信息
- [x] 提供多个在线视频站点,无需 vip
- [x] 提供多个云盘站点搜索该视频,以便保存到云盘
- [x] 提供多个站点下载该视频
- [ ] 等待更新
相关技术
- Python tkinter 模块 GUI 可视化
- Python 基本爬虫方式
- Python 正则提取数据
- selenium 模拟浏览器行为
存在问题
目前没有加入反爬虫策略,如果运行出现 403 forbidden 提示,则说明暂时被禁止,解决方式如下:
- 加入 cookies
- 采用随机延时方式
- 采用 IP 代理池方式(较不稳定)
源码地址
https://github.com/shengqiangzhang/doubanMovieTool
基于Python tkinter的豆瓣电影助手如何实现与使用?
1 回复
我来给你一个基于tkinter的豆瓣电影助手的基本实现框架。这个程序可以搜索电影、显示评分和基本信息。
import tkinter as tk
from tkinter import ttk, messagebox
import requests
import json
from threading import Thread
class DoubanMovieHelper:
def __init__(self, root):
self.root = root
self.root.title("豆瓣电影助手")
self.root.geometry("800x600")
# 创建界面组件
self.create_widgets()
def create_widgets(self):
# 搜索框和按钮
search_frame = ttk.Frame(self.root, padding="10")
search_frame.pack(fill=tk.X)
ttk.Label(search_frame, text="搜索电影:").pack(side=tk.LEFT, padx=(0, 10))
self.search_var = tk.StringVar()
self.search_entry = ttk.Entry(search_frame, textvariable=self.search_var, width=40)
self.search_entry.pack(side=tk.LEFT, padx=(0, 10))
self.search_entry.bind('<Return>', lambda e: self.search_movie())
search_btn = ttk.Button(search_frame, text="搜索", command=self.search_movie)
search_btn.pack(side=tk.LEFT)
# 结果显示区域
result_frame = ttk.Frame(self.root, padding="10")
result_frame.pack(fill=tk.BOTH, expand=True)
# 创建Treeview显示结果
columns = ('title', 'rating', 'year', 'directors', 'casts')
self.tree = ttk.Treeview(result_frame, columns=columns, show='headings', height=20)
# 设置列标题
self.tree.heading('title', text='电影名称')
self.tree.heading('rating', text='评分')
self.tree.heading('year', text='年份')
self.tree.heading('directors', text='导演')
self.tree.heading('casts', text='主演')
# 设置列宽
self.tree.column('title', width=200)
self.tree.column('rating', width=80)
self.tree.column('year', width=60)
self.tree.column('directors', width=150)
self.tree.column('casts', width=200)
# 添加滚动条
scrollbar = ttk.Scrollbar(result_frame, orient=tk.VERTICAL, command=self.tree.yview)
self.tree.configure(yscrollcommand=scrollbar.set)
self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# 详情显示区域
detail_frame = ttk.LabelFrame(self.root, text="电影详情", padding="10")
detail_frame.pack(fill=tk.X, padx=10, pady=5)
self.detail_text = tk.Text(detail_frame, height=8, wrap=tk.WORD)
self.detail_text.pack(fill=tk.BOTH, expand=True)
# 绑定选择事件
self.tree.bind('<<TreeviewSelect>>', self.show_detail)
def search_movie(self):
keyword = self.search_var.get().strip()
if not keyword:
messagebox.showwarning("提示", "请输入搜索关键词")
return
# 清空现有结果
for item in self.tree.get_children():
self.tree.delete(item)
# 在新线程中执行搜索,避免界面卡顿
Thread(target=self._do_search, args=(keyword,), daemon=True).start()
def _do_search(self, keyword):
try:
# 豆瓣API(注意:实际使用需要处理反爬虫机制)
url = f"https://api.douban.com/v2/movie/search?q={keyword}"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers, timeout=10)
data = response.json()
if 'subjects' in data:
# 在主线程中更新UI
self.root.after(0, self._update_results, data['subjects'])
else:
self.root.after(0, messagebox.showinfo, "提示", "未找到相关电影")
except Exception as e:
self.root.after(0, messagebox.showerror, "错误", f"搜索失败: {str(e)}")
def _update_results(self, movies):
for movie in movies:
# 提取导演信息
directors = ' / '.join([d['name'] for d in movie.get('directors', [])])
# 提取主演信息(取前3个)
casts = ' / '.join([c['name'] for c in movie.get('casts', [])[:3]])
# 插入到Treeview
self.tree.insert('', tk.END, values=(
movie.get('title', '未知'),
movie.get('rating', {}).get('average', '无'),
movie.get('year', '未知'),
directors,
casts
))
def show_detail(self, event):
selection = self.tree.selection()
if not selection:
return
item = self.tree.item(selection[0])
values = item['values']
detail = f"""电影名称:{values[0]}
评分:{values[1]}分
上映年份:{values[2]}
导演:{values[3]}
主演:{values[4]}
"""
self.detail_text.delete(1.0, tk.END)
self.detail_text.insert(1.0, detail)
def main():
root = tk.Tk()
app = DoubanMovieHelper(root)
root.mainloop()
if __name__ == "__main__":
main()
使用说明:
- 安装依赖:
pip install requests - 运行程序后,在搜索框输入电影名称
- 按回车或点击搜索按钮
- 搜索结果会显示在表格中
- 点击某行可以查看电影详情
核心功能:
- 电影搜索:通过豆瓣API搜索电影
- 结果显示:以表格形式展示搜索结果
- 详情查看:点击查看电影详细信息
注意事项:
- 豆瓣API有访问限制,实际使用时可能需要添加延迟或使用代理
- 可以扩展功能:收藏电影、评分统计、导出数据等
这个基础版本可以直接运行,后续可以根据需要添加更多功能。
建议:先跑起来这个基础版本,再根据需求逐步扩展功能。

