基于Python tkinter的豆瓣电影助手如何实现与使用?

项目简介

这个项目源于大三某课程设计。平常经常需要搜索一些电影,为了方便使用,就将原来的项目重新改写了。由于是基于 python tkinter 进行桌面端开发的,所以相对 WEB 端来说,可能不是特别方便。

配置说明

  1. 打开 http://phantomjs.org/download.html,根据自己的操作系统下载对应的 phantomjs
  2. 打开当前面目录下的**<u>getMovieInRankingList.py</u>**,定位到第 86 行,将executable_path=phantomjs-2.1.1-macosx/bin/phantomjs修改成你自己的路径,如executable_path=xxx/bin/phantomjs
  3. 打开 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

https://github.com/shengqiangzhang/doubanMovieTool

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()

使用说明:

  1. 安装依赖:pip install requests
  2. 运行程序后,在搜索框输入电影名称
  3. 按回车或点击搜索按钮
  4. 搜索结果会显示在表格中
  5. 点击某行可以查看电影详情

核心功能:

  • 电影搜索:通过豆瓣API搜索电影
  • 结果显示:以表格形式展示搜索结果
  • 详情查看:点击查看电影详细信息

注意事项:

  • 豆瓣API有访问限制,实际使用时可能需要添加延迟或使用代理
  • 可以扩展功能:收藏电影、评分统计、导出数据等

这个基础版本可以直接运行,后续可以根据需要添加更多功能。

建议:先跑起来这个基础版本,再根据需求逐步扩展功能。

回到顶部