python实验四_实验四:综合设计.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

"""

@ author:konnlee

@ time :2020/6/1 12:46

@ School:BESTI

"""

import os

import sys

import requests

import my_ftp_server as ftp

from bs4 import BeautifulSoup

from PyQt5.QtWidgets import QPushButton, QApplication, QToolTip, QWidget, QMessageBox, QMainWindow

from PyQt5.QtWidgets import QTextEdit, QFileDialog, QFileDialog, QLabel

from PyQt5.QtGui import QIcon, QFont, QPixmap

# 全局变量

string = ""

size_up = 0

size_now = 0

list_show_up = []

list_show_now = []

info_up = []

info_now = []

up_index = 0

now_index = 0

def now_up_playing_get():

global size_up, size_now, list_show_now, list_show_up

"""

爬取豆瓣首页当前即将上映或正在上映的电影信息

:return: Two list,The first one is the info of the movies coming soon,

The second one is the info of the movies playing

"""

url = 'https://movie.douban.com/cinema/nowplaying/beijing/'

headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '

'Chrome/83.0.4103.61 Safari/537.36'

}

re = requests.get(url, headers=headers)

soup = BeautifulSoup(re.text, 'html.parser')

movies = soup.findAll('li', {'class': 'list-item'})

list_now = []

list_up = []

for movie in movies:

dic = {}

status = movie['data-category'] # 上映状态

dic.setdefault('status', status)

if status == 'upcoming':

name = movie['data-title'] # 电影名字

dic.setdefault('name', name)

string_info = "电影名字:" + name

string_info += "\n\n上映状态:即将上映,敬请期待!"

movie_id = movie['id'] # 电影id,方便查看具体信息

dic.setdefault('movie_id', movie_id)

region = movie['data-region'] # 电影产地

dic.setdefault('region', region)

string_info += "\n\n电影产地:" + region

director = movie["data-director"] # 导演

dic.setdefault('director', director)

string_info += "\n\n导演:" + director

actor = movie['data-actors'] # 主演

dic.setdefault('actor', actor)

string_info += "\n\n电影主演:" + actor

time = movie['data-duration'] # 时长

dic.setdefault('time', time)

string_info += "\n\n电影时长:" + time

more_info = movie.find('a', {'target': '_blank'})

img = more_info.find('img')['src'] # 海报地址

dic.setdefault('img', img)

detail = more_info['href'] # 详细信息界面

dic.setdefault('detail', detail)

list_up.append(dic)

info_up.append(string_info)

else:

name = movie['data-title'] # 电影名字

dic.setdefault('name', name)

string_info = "电影名字:" + name

string_info += "\n\n上映状态:正在上映!"

movie_id = movie['id'] # 电影id,方便查看具体信息

dic.setdefault('movie_id', movie_id)

region = movie['data-region'] # 电影产地

dic.setdefault('region', region)

string_info += "\n\n电影产地:" + region

director = movie['data-director'] # 导演

dic.setdefault('director', director)

string_info += "\n\n导演:" + director

actor = movie['data-actors'] # 主演

dic.setdefault('actor', actor)

string_info += "\n\n电影主演:" + actor

time = movie['data-duration'] # 时长

dic.setdefault('time', time)

string_info += "\n\n电影时长:" + time

vote_count = movie['data-votecount'] # 评分人数

dic.setdefault('vote_count', vote_count)

string_info += "\n\n豆瓣评分人数:" + vote_count

more_info = movie.find('a', {'target': '_blank'})

img = more_info.find('img')['src'] # 海报地址

dic.setdefault('img', img)

detail = more_info['href'] # 详细信息界面

dic.setdefault('detail', detail)

if movie.find('span', {'class': 'subject-rate'}) is not None:

star = movie.find('span', {'class': 'subject-rate'}).text # 获取评分

dic.setdefault('star', star)

string_info += "\n\n豆瓣评分:" + star

list_now.append(dic)

info_now.append(string_info)

list_show_now = list_now

list_show_up = list_up

size_up, size_now = len(list_up), len(list_now)

return list_up, list_now

def print_movie_list(a, b):

"""

To print a menu which spider get.

:param a:Movies playing now's info's list.

:param b:Movies playing soon's info's list.

:return: None

"""

global string

string += '\n'

string += "以下电影即将上映!".center(60, '*')

string += '\n'

for i in a:

string = string + str(a.index(i) + 1) + i['name'].center(60, ' ')

string += '\n'

string += '\n'

string += str("以下电影正在热映!".center(60, '*'))

string += '\n'

for i in b:

string = string + str(b.index(i) + 1) + i['name'].center(60, ' ')

string += '\n'

class Frame(QMainWindow):

def __init__(self):

super().__init__()

self.init_MainWin()

self.setFixedSize(self.width(), self.height())

self.init_buttons()

def init_MainWin(self):

self.setGeometry(100, 100, 1600, 900)

self.setWindowTitle("豆瓣爬虫")

self.setToolTip("这是一个由

konnlee
编写的程序")

self.setWindowIcon(QIcon("无标题.jpg"))

self.statusBar().showMessage('准备就绪!')

def init_buttons(self):

# 退出按钮

ex_button = QPushButton("按下退出程序", self)

ex_button.setToolTip("按下此按钮退出程序")

ex_button.sizeHint()

ex_button.move(900, 800)

ex_button.clicked.connect(self.close)

# 开始爬取按钮

get_button = QPushButton("按下开始爬取", self)

get_button.setToolTip("按下此按钮开始从豆瓣爬取即将上映和正在上映的电影")

get_button.sizeHint()

get_button.move(700, 800)

get_button.clicked.connect(self.start_get)

# 查看详细信息按钮

detail_look = QPushButton("查看详细信息", self)

detail_look.setToolTip("按下此按钮查看更多信息")

detail_look.sizeHint()

detail_look.move(1050, 100)

detail_look.clicked.connect(self.detail)

# 写入文件按钮

write_file = QPushButton("结果写入文件", self)

write_file.setToolTip("按下此按钮将爬取到的结果写入文件")

write_file.sizeHint()

write_file.move(1200, 100)

write_file.clicked.connect(self.openfile)

# 打开文件

open_file = QPushButton("打开文件", self)

open_file.setToolTip("按下此按钮打开文件")

open_file.sizeHint()

open_file.move(1350, 100)

open_file.clicked.connect(self.readfile)

def start_get(self):

"""

开始按钮绑定的自定义事件,启动爬虫爬取电影信息

:return:None

"""

list_up, list_now = now_up_playing_get()

print_movie_list(list_up, list_now)

self.init_text(string)

QMessageBox.information(self, "提示", "院线电影信息爬取完毕!")

self.statusBar().showMessage("爬取完毕!")

def init_text(self, string=' '):

"""

这个函数更新在文本框中显示的内容,同时限定此文本框为只读模式,不允许用户修改查询到的地方

:param string: 想在文本框中显示的内容

:return: None

"""

mo_text = QTextEdit(self)

mo_text.setFont(QFont("fangsong", 12))

mo_text.clear()

mo_text.setPlainText(string)

mo_text.setToolTip("这个文本框显示了爬虫爬取的即将上映或正在上映的电影信息")

mo_text.setGeometry(100, 100, 800, 450)

mo_text.setReadOnly(True)

mo_text.show()

summary = QTextEdit(self)

summary.setFont(QFont("Microsoft YaHei", 11))

summary.setText("统计信息:\t\t即将上映:" + str(size_up) + "\t\t\t正在上映:" + str(size_now))

summary.setGeometry(100, 550, 800, 35)

summary.setReadOnly(True)

summary.show()

def detail(self):

"""

查看详细信息的函数,询问用户要查看的信息的种类

:return: None

"""

choose = QLabel(self)

choose.setGeometry(1050, 150, 100, 30)

choose.setText("查看电影信息?:")

choose.show()

up = QPushButton("即将上映", self)

up.sizeHint()

up.move(1170, 150)

up.show()

up.clicked.connect(self.show_detail_up)

now = QPushButton("正在上映", self)

now.sizeHint()

now.move(1270, 150)

now.show()

now.clicked.connect(self.show_detail_now)

def show_detail_up(self):

"""

展示即将上映的电影的详细信息

:return: None

"""

detail_text = QTextEdit(self)

detail_text.setGeometry(950, 200, 600, 500)

detail_text.setToolTip("这个文本框显示了即将上映电影的详细信息")

detail_text.setReadOnly(True)

detail_text.show()

try:

detail_text.setText(info_up[up_index])

except:

QMessageBox.information(self, "警告", "请先点击按钮爬取信息再查看具体信息")

last = QPushButton("上一个", self)

last.sizeHint()

last.move(1100, 700)

last.show()

last.clicked.connect(self.last)

next1 = QPushButton("下一个", self)

next1.sizeHint()

next1.move(1250, 700)

next1.show()

next1.clicked.connect(self.next)

look_picture = QPushButton("查看海报", self)

look_picture.sizeHint()

look_picture.show()

look_picture.move(950, 700)

look_picture.clicked.connect(self.show_picture_up)

ftp_button = QPushButton("上传服务器", self)

ftp_button.sizeHint()

ftp_button.move(1400, 700)

ftp_button.show()

ftp_button.clicked.connect(self.ftp_push)

def next(self):

"""

改变查看索引值

:return: None

"""

global up_index

if up_index < len(list_show_up) - 1:

up_index += 1

else:

QMessageBox.information(self, "提示", "当前已经是最后一个结果!")

up_index = 5

def last(self):

"""

改变查看索引值

:return: None

"""

global up_index

if up_index > 0:

up_index -= 1

else:

QMessageBox.information(self, "提示", "当前已经是第一个结果!")

up_index = 0

def show_picture_up(self):

"""

展示即将上映的电影的海报

:return: None

"""

headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '

'Chrome/83.0.4103.97 Safari/537.36 Edg/83.0.478.45 '

}

try:

res = requests.get(list_show_up[up_index]['img'], headers=headers)

root = "F://python全栈//python程序设计大实验//"

path = root + '1.jpg'

if not os.path.exists(root):

os.mkdir(root)

with open(path, 'wb') as f:

f.write(res.content)

f.close()

except:

QMessageBox.information(self, "提示", "海报资源请求错误")

pix = QPixmap('1.jpg')

picture_lab = QLabel(self)

picture_lab.setGeometry(950, 400, 600, 300)

picture_lab.setPixmap(pix)

picture_lab.setStyleSheet("border: 2px solid red")

picture_lab.setScaledContents(True)

picture_lab.show()

def show_detail_now(self):

"""

展示正在上映的电影的详细信息

:return: None

"""

detail_text = QTextEdit(self)

detail_text.setGeometry(950, 200, 600, 500)

detail_text.setToolTip("这个文本框显示了正在上映电影的详细信息")

detail_text.setReadOnly(True)

detail_text.show()

try:

detail_text.setText(info_now[now_index])

except:

QMessageBox.information(self, "警告", "请先点击按钮爬取信息再查看具体信息")

last2 = QPushButton("上一个", self)

last2.sizeHint()

last2.move(1150, 700)

last2.show()

last2.clicked.connect(self.last2)

next2 = QPushButton("下一个", self)

next2.sizeHint()

next2.move(1350, 700)

next2.show()

next2.clicked.connect(self.next2)

look_picture2 = QPushButton("查看海报", self)

look_picture2.sizeHint()

look_picture2.show()

look_picture2.move(950, 700)

look_picture2.clicked.connect(self.show_picture_now)

ftp_button = QPushButton("上传服务器", self)

ftp_button.sizeHint()

ftp_button.move(1400, 700)

ftp_button.show()

ftp_button.clicked.connect(self.ftp_push)

def ftp_push(self):

"""

调用自定义模块上传文件

:return:布尔值,上传成功为True,上传失败为False

"""

bool1 = ftp.push(sys.argv)

if bool1:

QMessageBox.information(self, "提示", "文件上传成功")

else:

QMessageBox.information(self, "提示", "文件上传失败")

def next2(self):

"""

改变查看索引值

:return: None

"""

global now_index

if now_index < len(list_show_now) - 1:

now_index += 1

else:

QMessageBox.information(self, "提示", "当前已经是最后一个结果!")

now_index = 5

def last2(self):

"""

改变查看索引值

:return: None

"""

global now_index

if now_index > 0:

now_index -= 1

else:

QMessageBox.information(self, "提示", "当前已经是第一个结果!")

def show_picture_now(self):

"""

展示正在上映的电影的海报

:return: None

"""

headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '

'Chrome/83.0.4103.97 Safari/537.36 Edg/83.0.478.45 '

}

try:

res = requests.get(list_show_now[now_index]['img'], headers=headers)

root = "F://python全栈//python程序设计大实验//"

path = root + '1.jpg'

if not os.path.exists(root):

os.mkdir(root)

with open(path, 'wb') as f:

f.write(res.content)

f.close()

except:

QMessageBox.information(self, "提示", "海报资源请求错误")

pix = QPixmap('1.jpg')

picture_lab2 = QLabel(self)

picture_lab2.setGeometry(950, 400, 600, 300)

picture_lab2.setPixmap(pix)

picture_lab2.setStyleSheet("border: 2px solid blue")

picture_lab2.setScaledContents(True)

picture_lab2.show()

def openfile(self):

"""

选择并打开文件,将爬取到的结果写入文件

:return: None

"""

global string

filename = QFileDialog.getOpenFileName(self, '打开文件', './', "txt(*.txt)")

if filename[0]:

with open(filename[0], 'w', encoding="utf-8") as f:

f.write(string)

QMessageBox.information(self, "提示", "院线电影信息成功写入指定文件>_<")

def readfile(self):

"""

让用户选择并打开.txt文件并将其内容显示到文本栏中

:return: None

"""

filename = QFileDialog.getOpenFileName(self, '打开文件', './', "txt(*.txt)")

if filename[0]:

with open(filename[0], 'r', encoding='utf-8') as f:

read_info = f.read()

detail_text = QTextEdit(self)

detail_text.setGeometry(950, 200, 600, 500)

detail_text.setToolTip("这个文本框显示了读取到的文件的内容")

detail_text.setReadOnly(False)

detail_text.show()

detail_text.setText(read_info)

def closeEvent(self, event):

"""

退出事件确认,更新状态栏状态

:param event: 退出事件

:return: None

"""

self.statusBar().showMessage("退出确认!")

reply = QMessageBox.question(self, "警告", "您确定要退出吗,未保存的修改将不被保存!",

QMessageBox.Yes | QMessageBox.No, QMessageBox.No)

if reply == QMessageBox.Yes:

event.accept()

else:

event.ignore()

self.statusBar().showMessage("准备就绪!")

def Win_build():

"""

GUI构建主函数

:return: None

"""

app = QApplication(sys.argv)

frame = Frame()

frame.init_text()

frame.show()

sys.exit(app.exec_())

if __name__ == "__main__":

Win_build()

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值