利用爬虫和Tkinter控件实现电影展示与收藏

电影展示与收藏

系统结构

系统整体结构介绍

  1. 系统结构
    在这里插入图片描述2.系统原理
    当程序启动时就开始执行爬虫,从豆瓣爬取所需数据,爬取完毕后实例化Tkinter控件,生成一个窗口,实例化Listbox控件来显示电影数据,给Listbox绑定点击事件,双击后进入电影详情界面,可收藏;显示的收藏界面入口在菜单里,菜单绑定于最开始的界面。

系统相关模块介绍

1.爬虫模块
先对网址进行初步处理,要先模拟真人搜索,要对headers参数进行处理,还有访问网站的证书获取问题,这些问题解决后可以获取该网站的json格式的数据,这时就要利用正则表达式来截取自己想要的数据,把数据存放于列表中以便使用。
2.电影列表界面
把获取到的数据中的电影名用Listbox控件显示出来,该界面还有菜单和搜索功能;
通过鼠标左键双击电影名可弹出该电影的详细信息;
可通过菜单进入电影收藏界面和退出程序。搜索成功后会进入该电影的详细界面,失败弹出警告
3.电影详情界面
主要显示电影的海报、导演、主演和其它信息;
有一个收藏按钮,可对电影进行收藏,也可取消收藏
4.电影收藏界面
展示收藏的电影,双击电影也可进入该电影的详情界面

实现代码

1.程序开始后,先调用爬虫模块获取数据,一开始有解决证书问题,只要忽略证书的验证问题就行:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.爬虫的初始化:

def __init__(self):
	self.page = 1
    self.cur_url = "http://movie.douban.com/top250?start={page}&filter=&type="
    self.datas = []					#存储电影的名字
    self.photo = []					#存储电影的海报
    self.bd = []					#存储电影的相关信息(导演、主演…)
    self.grade = []					#存储电影的评分
	print("豆瓣电影爬虫准备就绪, 准备爬取数据...")

3.获取网站的json数据:

def get_page(self, cur_page):
	url = self.cur_url
    time.sleep(1)

    try:
    	page = (cur_page - 1) * 25
    	url = url.format(page=page)
		headers = {
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}                   
        request = urllib.request.Request(url, headers=headers)
        my_page = urllib.request.urlopen(request).read().decode('utf-8')
	except :
		print("爬取失败")
	return my_page

4.对json进行处理,利用正则表达式得到有用的数据:

def find_title(self, my_page):
	temp_data = []
    temp_photo = []
	temp_bd = []
	temp_grade = []
	#获取电影名字的正则表达式
	movie_items = re.findall(r'<span.*?class="title">(.*?)</span>', my_page, re.S)
	#获取电影海报的正则表达式								
	movie_photo = re.findall(r'<img.*?src="(.*?)".*?>', my_page, re.S)
	#获取电影信息的正则表达式
	movie_bd = re.findall(r'<p class="">(.*?)</p>', my_page, re.S)
	#获取评分的正则表达式
	movie_grade = re.findall(r'<div.*?class="star">.*?"v:average">(.*?)</span>', my_page,re.S)
	#获取评分人数的正则表达式
	movie_gradeNum = re.findall(r'<div.*?class="star">.*?<span>(.*?)</span>', my_page, re.S)
	#把电影海报的干扰项移除
    movie_photo.pop()
    movie_photo.pop(0)
        
    for index, item in enumerate(movie_items):
    	if item.find("&nbsp") == -1:
		temp_data.append(item)
    for index, photo in enumerate(movie_photo):
        temp_photo.append(photo)
	for index, bd in enumerate(movie_bd):
		#对电影信息进行再处理
        bd = bd.replace("&nbsp;&nbsp;&nbsp;","\n").
		replace("<br>","").replace("..."," ").strip()
        bd = bd.replace("&nbsp;"," ").replace("                            ","")
        temp_bd.append(bd)
	for index, grade in enumerate(movie_grade):
        temp_grade.append(grade+"分("+movie_gradeNum[index]+")")
        
    self.datas.extend(temp_data)
    self.photo.extend(temp_photo)
    self.bd.extend(temp_bd)
	self.grade.extend(temp_grade)

5.爬虫的开始代码如下:

def start_spider(self):
    while self.page <= 4:    #每循环一次就获取25部电影的信息
    	my_page = self.get_page(self.page)
        self.find_title(my_page)
        self
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值