自制多肉查询工具

2024-08-24 10:44
文章标签 工具 查询 自制 多肉

本文主要是介绍自制多肉查询工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景:

复习python qt、网页解析的常用操作

准备:

  1. 多肉信息网站
  2. 涉及python的第三方库:
    • lxml
    • PyQt5

实现效果:

在这里插入图片描述

功能:

  1. 随机读取:从本地加载已存储的多肉信息
  2. 数据更新:从多肉信息网站更新5条多肉数据
  3. 查询:根据多肉的名字,查询本地存储的多肉信息
  4. 展示内容:
    • 多肉名称
    • 多肉介绍
    • 多肉图片

实现过程:

  1. 多肉信息爬取:

    1. 首页爬取多肉科目信息
      在这里插入图片描述

    2. 不同科目的多肉信息
      在这里插入图片描述

    3. 不同属的多肉信息获取
      在这里插入图片描述

    4. 实现代码:

      # -*- coding:UTF-8 -*-"""@ProjectName  : pyExamples@FileName     : crawler@Description  : 爬取多肉信息@Time         : 2023/8/21 下午2:28@Author       : Qredsun"""
      import os
      import time
      import random
      import pickle
      import requests
      from lxml import etree
      from loguru import logger'''多肉数据爬虫'''
      class SucculentCrawler():DEFAULT_UPDATE_NUM = 5 # 每次更新的多肉信息数量def __init__(self, **kwargs):self.__url = 'https://www.drlmeng.com/'self.referer_list = ["http://www.google.com/", "http://www.bing.com/", "http://www.baidu.com/", "https://www.360.cn/"]self.ua_list = ['Mozilla/5.0 (Linux; Android 5.1.1; Z828 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Mobile Safari/537.36','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22','Mozilla/5.0 (iPad; CPU OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/47.0.2526.107 Mobile/12F69 Safari/600.1.4','Mozilla/5.0 (iPad; CPU OS 11_2_5 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) CriOS/64.0.3282.112 Mobile/15D60 Safari/604.1','Mozilla/5.0 (Linux; Android 7.1.1; SM-T350 Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Safari/537.36','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.98 Safari/537.36','Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36','Mozilla/5.0 (Linux; Android 6.0.1; SM-G610F Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36','Mozilla/5.0 (Linux; Android 5.1.1; 5065N Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/46.0.2490.76 Mobile Safari/537.36','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36','Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36']self.page_urls = self.__getAllPageUrls()self.savedir = 'resources/succulents'self.page_pointer = 0'''爬取下一页数据'''def next(self):data = self.__parse_drlmeng_subject()self.__saveItem(data)time.sleep(random.random())return False'''多肉科目'''def __parse_drlmeng_subject(self):drlmeng_title = ''drlmeng_category_desc = []drlmeng_img_url = ''# 获取链接page_url = self.page_urls[self.page_pointer]# 提取该页中多肉的图片+详情页链接res = requests.get(page_url, headers=self.__randomHeaders())html = etree.HTML(res.text)archive_head = html.xpath('//*[@id="archive-head"]')if not len(archive_head):logger.debug('解析多肉所属科失败')return drlmeng_title, drlmeng_img_url, drlmeng_category_descarchive_head = archive_head[0]drlmeng_subject = archive_head.xpath('.//h1')if len(drlmeng_subject):drlmeng_subject = drlmeng_subject[0].text.strip()logger.debug(f'科:{drlmeng_subject}')drlmeng_category_desc.append(drlmeng_subject)drlmeng_type_description = archive_head.xpath('.//div/p')if len(drlmeng_type_description):drlmeng_type_description = drlmeng_type_description[0].text.strip()logger.debug(f'科介绍:{drlmeng_type_description}')drlmeng_category_desc.append(drlmeng_type_description)drlmengs = html.xpath('//ul[@class="posts-ul"]/li')drlmengs = drlmengs if drlmengs else html.xpath('//li[@class="row-thumb"]')if len(drlmengs):random_index = random.randint(0, len(drlmengs))drlmeng_info = drlmengs[random_index].xpath('.//a[@class="post-thumbnail"]')if len(drlmeng_info):drlmeng_info = drlmeng_info[0]drlmeng_title = drlmeng_info.attrib.get('title')drlmeng_title = drlmeng_title.replace('/','_')drlmeng_desc_url = drlmeng_info.attrib.get('href')drlmeng_category_desc.append(self.__parse_drlmeng_category(drlmeng_desc_url))drlmeng_img_urls = drlmeng_info.xpath('.//img')if len(drlmeng_img_urls):drlmeng_img_url = drlmeng_img_urls[0].attrib.get('lazydata-src')self.page_pointer += 1return drlmeng_title, drlmeng_img_url, drlmeng_category_desc'''多肉属'''def __parse_drlmeng_category(self, drlmeng_desc_url):content = ''# # 提取该页中多肉的图片+详情页链接res = requests.get(drlmeng_desc_url, headers=self.__randomHeaders())html = etree.HTML(res.text)entry = html.xpath('//div[@class="entry"]')if len(entry):entry = entry[0]line_content = entry.xpath('.//p/text()')for line in line_content:line = line.replace('\u3000', '')line = line.strip()content += linelogger.debug(f'解析多肉详细介绍:{content}')return content'''数据保存'''def __saveItem(self, data):if not os.path.exists(self.savedir):os.mkdir(self.savedir)if not data[0]:returnsavepath = os.path.join(self.savedir, data[0])if not os.path.exists(savepath):os.mkdir(savepath)f = open(os.path.join(savepath, 'show.jpg'), 'wb')f.write(requests.get(data[1], headers=self.__randomHeaders()).content)f.close()f = open(os.path.join(savepath, 'info.pkl'), 'wb')pickle.dump(data, f)f.close()'''获得所有链接'''def __getAllPageUrls(self):res = requests.get(self.__url, headers=self.__randomHeaders())html = etree.HTML(res.text)# html = etree.parse('/home/redsun/Downloads/pycharm-2020.2/run/config/scratches/scratch.html', etree.HTMLParser())ul_list = html.xpath('//ul[@class="sub-menu"]')page_urls = []for ul in ul_list:page_urls.extend(ul.xpath('.//a/@href'))if page_urls.__len__() >= self.DEFAULT_UPDATE_NUM:page_urls = page_urls[:self.DEFAULT_UPDATE_NUM]breakreturn page_urls'''随机请求头'''def __randomHeaders(self):return {'user-agent': random.choice(self.ua_list), 'referer': random.choice(self.referer_list)}if __name__ == '__main__':c = SucculentCrawler()c.next()
      
  2. 窗口交互:

    # -*- coding:UTF-8 -*-"""@ProjectName  : pyExamples@FileName     : SucculentQuery@Description  : 多肉信息查询工具外壳@Time         : 2023/8/21 下午2:28@Author       : Qredsun"""
    import io
    import os
    import sys
    import random
    import threading
    from PIL import Image
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    from PyQt5 import QtGui
    from crawler import *'''多肉数据'''
    class SucculentQuery(QWidget):def __init__(self, parent=None, **kwargs):super(SucculentQuery, self).__init__(parent)self.setWindowTitle('多肉数据查询-微信公众号:Qredsun')self.setWindowIcon(QIcon('resources/icon/icon.jpg'))# 定义组件self.label_name = QLabel('多肉名称: ')self.line_edit = QLineEdit()self.button_find = QPushButton()self.button_find.setText('查询')self.label_result = QLabel('查询结果:')self.show_label = QLabel()self.show_label.setFixedSize(300, 300)self.showLabelImage('resources/icon/icon.png')self.text_result = QTextEdit()self.button_random = QPushButton()self.button_random.setText('随机读取')self.button_update = QPushButton()self.button_update.setText('数据更新')self.tip_label = QLabel()self.tip_label.setText('数据状态: 未在更新数据, 数据更新进度: 0/0')# 排版self.grid = QGridLayout()self.grid.addWidget(self.label_name, 0, 0, 1, 1)self.grid.addWidget(self.line_edit, 0, 1, 1, 30)self.grid.addWidget(self.button_find, 0, 31, 1, 1)self.grid.addWidget(self.button_random, 0, 32, 1, 1)self.grid.addWidget(self.button_update, 0, 33, 1, 1)self.grid.addWidget(self.tip_label, 1, 0, 1, 31)self.grid.addWidget(self.label_result, 2, 0)self.grid.addWidget(self.text_result, 3, 0, 1, 34)self.grid.addWidget(self.show_label, 3, 34, 1, 1)self.setLayout(self.grid)self.resize(600, 400)# 事件绑定self.button_find.clicked.connect(self.find)self.button_random.clicked.connect(self.randomRead)self.button_update.clicked.connect(lambda _: threading.Thread(target=self.update).start())'''数据查询'''def find(self):datadir = os.path.join('resources/succulents/', self.line_edit.text())if os.path.exists(datadir):self.showLabelImage(os.path.join(datadir, 'show.jpg'))intro = pickle.load(open(os.path.join(datadir, 'info.pkl'), 'rb'))[-1]self.showIntroduction(intro)'''随机读取'''def randomRead(self):datadir = random.choice(os.listdir('resources/succulents/'))self.line_edit.setText(datadir)datadir = os.path.join('resources/succulents/', self.line_edit.text())if os.path.exists(datadir):self.showLabelImage(os.path.join(datadir, 'show.jpg'))intro = pickle.load(open(os.path.join(datadir, 'info.pkl'), 'rb'))[-1]self.showIntroduction(intro)'''数据更新'''def update(self):crawler_handle = SucculentCrawler()while True:self.tip_label.setText('数据状态: 正在在更新数据, 数据更新进度: %s/%s' % (crawler_handle.page_pointer + 1, len(crawler_handle.page_urls)))crawler_handle.next()if crawler_handle.page_pointer == len(crawler_handle.page_urls):breakself.tip_label.setText('数据状态: 未在更新数据, 数据更新进度: 0/0')'''在文本框里显示多肉介绍'''def showIntroduction(self, intro):self.text_result.setText('\n\n'.join(intro))'''在Label对象上显示图片'''def showLabelImage(self, imagepath):image = Image.open(imagepath).resize((300, 300), Image.ANTIALIAS)fp = io.BytesIO()image.save(fp, 'JPEG')qtimg = QtGui.QImage()qtimg.loadFromData(fp.getvalue(), 'JPEG')qtimg_pixmap = QtGui.QPixmap.fromImage(qtimg)self.show_label.setPixmap(qtimg_pixmap)'''run'''
    if __name__ == '__main__':app = QApplication(sys.argv)query_demo = SucculentQuery()query_demo.show()sys.exit(app.exec_())
    
  3. 项目结构:
    在这里插入图片描述

这篇关于自制多肉查询工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1102257

相关文章

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过