当前位置:   article > 正文

电影抓取(分类选电影)并在GUI展示使用

电影抓取

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,
如有侵权,请告知删除,谢谢!本人纯粹技术爱好,若侵犯贵公司的权益,请告知

1.选电影页面,每次筛选都会触发请求

在这里插入图片描述

2.解析URL及参数变化并代码测试

1> 全部选择的URL

sort=U&range=0,10&tags=短片&start=0&genres=动画&countries=中国台湾&year_range=2010,2019
  • 1

2>全部不选择的URl

sort=U&range=0,10&tags=&start=0
  • 1

很明显,选择什么类型直接带上文字就可以了,返回的也是json数据,所以非常好处理
3>代码测试一下,数据返回正常没有问题
在这里插入图片描述

4>参数解析
F12打开调试,搜索任意可选择的关键词,我搜索的是<近期热门>
在这里插入图片描述

将此js的这段复制下来就可以了,全部的类型及年份请求的格式,
5>,替换url参数,依旧可以请求成功,并没有什么问题

3.设计GUI页面

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

注: 这里还是和上面的一样,选中哪个哪个高亮, 评分是和网站不一样,网站是区间轴的样式,我是选择用了两个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()))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3>最终全部的UI展示效果
在这里插入图片描述
4>至此,所有的UI已经基本完成 只剩下了数据展示的UI…影视展示的内容主要是图片\名字\评分三个种重要的信息,
由于数据展示和翻页需要更改数据,所以采用循环展示数据,每个影视展示用QGroupBox包裹,

里面的数值是根据我的主页面的长度宽度计算出来的
  • 1
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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

链接拿到数据之后,循环数据,排列显示位置

 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

拿一组数据测试结果
在这里插入图片描述

4 数据加载

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]}'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

在线程处理中,发现并不能更新页面,测试(原始数据启动和请求数据启动)发现原本的数据就要把页面渲染完毕才可以打开,后者是先打开页面,很显然,不能成功加载数据显示,
解决办法: 使用QLabel 包裹QGridLayout网格布局展示数据,不知道还有没有更好更简便的方法,
在这里插入图片描述
其实页面的下面还有10条数据,没做滚动…哈哈哈哈哈

如有错误,大哥谅解

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/687038
推荐阅读
相关标签
  

闽ICP备14008679号