电影展示与收藏
系统结构
系统整体结构介绍
- 系统结构
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(" ") == -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(" ","\n").
replace("<br>","").replace("..."," ").strip()
bd = bd.replace(" "," ").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