赞
踩
声明:本文只作学习研究,禁止用于非法用途,否则后果自负,
如有侵权,请告知删除,谢谢!本人纯粹技术爱好,若侵犯贵公司的权益,请告知
1> 全部选择的URL
sort=U&range=0,10&tags=短片&start=0&genres=动画&countries=中国台湾&year_range=2010,2019
2>全部不选择的URl
sort=U&range=0,10&tags=&start=0
很明显,选择什么类型直接带上文字就可以了,返回的也是json数据,所以非常好处理
3>代码测试一下,数据返回正常没有问题
4>参数解析
F12打开调试,搜索任意可选择的关键词,我搜索的是<近期热门>
将此js的这段复制下来就可以了,全部的类型及年份请求的格式,
5>,替换url参数,依旧可以请求成功,并没有什么问题
1>页面的布局和颜色还是选择和db一样的UI布局, 使用pyqt5设计UI,大致的选择区域,如下:
按钮点击的逻辑代码完成后的效果:
2> 增加排序选择按钮和评分选择
# ..... # 省略99行代码 # ..... self.order_button_1 = QPushButton('近期热门', self) self.order_button_1.setGeometry(QRect(20, index_y + 20, 60, 25)) self.order_button_1.setFont(self.set_text_size(10, False)) self.order_button_1.clicked.connect(self.c_click) self.order_button_1.setStyleSheet('background-color:#51A4D7;border: 1px solid #4e6ef2;') self.order_button_2 = QPushButton('标记最多', self) self.order_button_2.setGeometry( QRect(self.order_button_1.x() + self.order_button_1.width() + 5, self.order_button_1.y(), 60, 25)) self.order_button_2.setFont(self.set_text_size(10, False)) self.order_button_2.clicked.connect(self.c_click) self.order_button_2.setStyleSheet('border: 1px solid #4e6ef2;') self.order_button_3 = QPushButton('评分最高', self) self.order_button_3.setGeometry( QRect(self.order_button_2.x() + self.order_button_2.width() + 5, self.order_button_1.y(), 60, 25)) self.order_button_3.setFont(self.set_text_size(10, False)) self.order_button_3.clicked.connect(self.c_click) self.order_button_3.setStyleSheet('border: 1px solid #4e6ef2;') self.order_button_4 = QPushButton('最新上映', self) self.order_button_4.setGeometry( QRect(self.order_button_3.x() + self.order_button_3.width() + 5, self.order_button_1.y(), 60, 25)) self.order_button_4.setFont(self.set_text_size(10, False)) self.order_button_4.clicked.connect(self.c_click) self.order_button_4.setStyleSheet('border: 1px solid #4e6ef2;') self.to_text = QLabel('评分', self) self.to_text.setGeometry( QRect(self.order_button_4.x() + self.order_button_4.width() + 60, self.order_button_1.y(), 35, 25)) self.to_text.setFont(self.set_text_size(12, False)) self.score_min = QSpinBox(self) self.score_min.setGeometry(QRect(self.to_text.x() + self.to_text.width(), self.order_button_1.y(), 40, 25)) self.score_min.setFont(self.set_text_size(10, False)) self.score_min.setRange(1, 10) self.score_min.setStyleSheet('border: 1px solid #4e6ef2;') self.score_min.valueChanged.connect(self.score_click) self.to_text = QLabel('~', self) self.to_text.setGeometry(QRect(self.score_min.x() + self.score_min.width() + 5, self.order_button_1.y(), 25, 25)) self.to_text.setFont(self.set_text_size(12, False)) self.score_max = QSpinBox(self) self.score_max.setGeometry(QRect(self.score_min.x() + self.score_min.width() + 20, self.order_button_1.y(), 40, 25)) self.score_max.setFont(self.set_text_size(10, False)) self.score_max.setRange(1, 10) self.score_max.setValue(10) self.score_max.setStyleSheet('border: 1px solid #4e6ef2;') self.score_max.valueChanged.connect(self.score_click)
注: 这里还是和上面的一样,选中哪个哪个高亮, 评分是和网站不一样,网站是区间轴的样式,我是选择用了两个QSpinBox,设置最大最小值, 但是在处理上做了优化,当最小值被加到比最大值大的时候,就会改变最大值
def score_click(self):
if self.sender() == self.score_min:
if int(self.score_min.text()) > int(self.score_max.text()):
self.score_max.setValue(int(self.score_min.text()))
elif self.sender() == self.score_max:
if int(self.score_min.text()) > int(self.score_max.text()):
self.score_min.setValue(int(self.score_max.text()))
3>最终全部的UI展示效果
4>至此,所有的UI已经基本完成 只剩下了数据展示的UI…影视展示的内容主要是图片\名字\评分三个种重要的信息,
由于数据展示和翻页需要更改数据,所以采用循环展示数据,每个影视展示用QGroupBox包裹,
里面的数值是根据我的主页面的长度宽度计算出来的
defbox_group(self, x, y, w, h, title, image_url, rate): """ :param x: x位置 :param y: y位置 :param w: 宽度 :param h: 高度 :param title: 名字 :param image_url: 图片链接 :param rate: 评分 :return: """ self.box_1 = QGroupBox(self) self.box_1.setGeometry(QRect(x, y, w, h)) self.box_1.setFont(self.set_text_size(10, False)) self.box_1.setStyleSheet("QGroupBox {border: 1px solid #7A7A7A;}") self.image_ui = QLabel(self.box_1) self.image_ui.setGeometry(QRect(0, 0, w, 170)) image_content = requests.get(image_url).content img_io = io.BytesIO(image_content) img = Image.open(img_io) pix = img.toqpixmap() self.image_ui.setScaledContents(True) # 自适应QLabel大小 self.image_ui.setPixmap(pix) self.title_ui = QLabel(f"<h4 style='font-weight:100'>{title}<font color=#FFAC8C > {rate}</h4>", self.box_1) self.title_ui.setGeometry(QRect(0, 170, w, 30))
链接拿到数据之后,循环数据,排列显示位置
box_x = 20
box_y = 270
box_w = 130
box_h = 200
for da in data:
if data.index(da) != 0:
box_x = box_x + box_w + 27
if data.index(da) == 5:
box_y += box_h + 20
box_x = 20
title = da.get('title')
rate = da.get('rate')
cover = da.get('cover')
self.box_group(box_x, box_y, box_w, box_h, title, cover, rate)
拿一组数据测试结果
1> 根据按钮选择拼接url
tags = self.b_1_text if self.b_5_text: tags += ',' + self.b_5_text url = f'https://movie.*****.com/j/new_search_subjects?sort={self.sort_text}&range=0,10&tags={tags}&start=0' if self.b_2_text: url += '&genres=' + self.b_2_text if self.b_3_text: url += '&countries=' + self.b_3_text year_dict = { "2018年以后": [2019, 9999], "2022": [2022, 2022], "2021": [2021, 2021], "2020": [2020, 2020], "2019": [2019, 2019], "2010年代": [2010, 2019], "2000年代": [2e3, 2009], "90年代": [1990, 1999], "80年代": [1980, 1989], "70年代": [1970, 1979], "60年代": [1960, 1969], "更早": [1, 1959] } if self.b_4_text: year_list = year_dict.get(self.b_4_text) url += f'&year_range={year_list[0]},{year_list[1]}'
2> 由于数据加载填充需要耗时,影响界面的流畅性,所以选择线程请求数据并用信号处理数据展示
class DATAThread(QThread): _signal = pyqtSignal(list) def __init__(self, url): self.url = url super(DATAThread, self).__init__() def run(self): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36', } response = requests.get(self.url, headers=headers) data = response.json().get('data') def get_image(data): image_content = requests.get(data.get('cover')).content return { 'title': data.get('title'), 'cover': image_content, 'rate': data.get('rate'), } # 加载图片 from multiprocessing.dummy import Pool as ThreadPool pool = ThreadPool(20) result = pool.map(get_image, data) self._signal.emit(result)
在线程处理中,发现并不能更新页面,测试(原始数据启动和请求数据启动)发现原本的数据就要把页面渲染完毕才可以打开,后者是先打开页面,很显然,不能成功加载数据显示,
解决办法: 使用QLabel 包裹QGridLayout网格布局展示数据,不知道还有没有更好更简便的方法,
其实页面的下面还有10条数据,没做滚动…哈哈哈哈哈
如有错误,大哥谅解
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。