【源码+文档】爬虫检索系统

2023-11-20

②实验内容

从Top250电影榜单上爬取所有电影的相关信息(包括影片海报、影片海报链接、影片中外文名、影片评分、影片评价人数、影片概况、影片缩略信息,例如:导演,部分演员,上映时间,电影类型等等),将海报以.jpg形式、将其他信息以excel文件的形式存在本地,数据量足够支撑现场演示的检索需求;在爬取信息的同时产生了一个字典,以排名为键,中文名为值,将其存在本地,方便爬虫完毕后的查找。

以榜单中的排名为键,以待查电影存在本地的图片路径和excel路径组成的元组为值,建立B+树,为了扩充查找功能,建立一个hash表,键为豆瓣排名,值为中文名和评分人数,以及评分组成的列表。当要查找排名时,通过键的比对可以迅速定位磁盘路径,减少对磁盘的读取次数,提高查找效率,查找其他信息时通过hash表映射,将在磁盘中的搜索转化为在内存中的搜索,大大提高检索效率。

在GUI界面提供了豆瓣榜单排名准确查找,电影名准确查找,评分区间模糊查找,评分人数区间模糊查找(即查找符合要求区间的所有电影,由于数量过多此时不呈现电影海报)。

为查找的过程提供了异常处理,提高了该查找软件的用户友好度。

设计方案与设计思路

本爬虫检索系统分为六个部分:爬取信息,数据结构建立,建立B+树,GUI设计,检索,异常处理。

爬取信息(spider.py)

对Top250电影榜单上所有电影的相关信息进行了爬取,并将相关信息进行数据结构建模后存储到本地,以便之后的搜索。

在爬取信息的过程中使用了urllib库,进行了request_headers的伪装。使用了第三方库fake_uesragent,频繁更换UA,同时采用了IP代理(IP资源来源于网络),build_opener加入到headers中,每次发送请求时,从UA和IP池中随机选择进行headers的伪装(使用random库);在爬取图片时,由于豆瓣电影榜有防盗链,所以还需要在headers中加入Referer进行深层伪装,除此之外,每爬取一定数量的图片,还要暂停一定的时间(time库),进一步模拟用户行为。

由于信息最初请求到的信息是字节流,所以需要以utf-8编码的形式获取相应体内容,返还html形式的文件,然后进行html解析。在解析过程中,选择Beautifulsoup进行第三方库进行处理,生成字符串,最后用re库中的正则表达式匹配提取目的信息。

数据结构建模(spider.py)

在爬取的过程中,以list作为容器储存所有文字信息,并使用第三方库xlwt,对list中的信息进行写入并以excel的形式保存在本地,图片采用jpg形式保存在本地;同时对扩展检索功能的字典进行维护,生成键值对,爬取完毕后,将字典存在本地,当需要进行中文名、评分、评价人数的查找时,先读取hash表,再配合排名B+树为多种查找提供支持。

建立B+树(BPlus.py)

建立了叶子节点类和非叶子节点类,叶子结点中存储的数据为KeyValue型,键为排名,值为包含图片和excel路径的元组),非叶子节点中存储豆瓣排名作为Key。

GUI设计(UI.py,UIdesign.py)

GUI设计使用了PyQt5库,先用QTdesigner进行前端界面的设置,产生.ui的文件。然后将.ui文件转化为.py文件。此外GUI设计采用界面交互逻辑和界面设计分离的形式,界面py文件保存在UI.py中,界面逻辑保存在UIdesign.py文件中,方便之后的维护。

当用户点击相应查询框的search按钮之后,触发对应函数,查询结束之后,将结果在label中呈现。

同时为了使用的舒适度与流畅度,在细节上也进行了处理。比如单个电影信息呈现完之后,下一个电影的信息呈现之前要清空所有搜索框和信息框;异常发生时也要进行相应的清除,提高使用舒适度。

检索(BPlus.py)

在进行排名的搜索时,通过B+树的键值比对得到目标图片,excel文件的路径,读取图片并呈现在label中采用第三方库QtGUI,excel信息的读取采用第三方库xlrd。

在进行中文名检索时,通过之前建立的字典(hash表),将中文名映射到排名,再通过排名查找对应文件的地址。

在进行给定区间的评分,和评价人数的模糊查找时,根据区间,通过检索hash表,实现快速将所有符合要求的电影信息进行呈现,由于数量过多,不进行图片展示。

异常处理(UI.py)

由于用户可能在排名中输入250以后的数字或者小数或者负数,在评价人数中输入负数,小数,或者在评分中输入大于10的数(10分制),甚至没有输入搜索内容就开始搜索,可能导致程序崩溃,为了提高友好性,增强了程序的异常处理,对可能情况进行异常分析与维护。

源码和文档都托管在了【WRITE-BUG数字空间】上面了,有需要的可自取~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【源码+文档】爬虫检索系统 的相关文章

随机推荐

  • 指标体系建设

    1 背景 结合业务场景将多个不同指标和维度进行组合 从而针对某一真实业务场景进行数据分析和决策导向 并能在整体业务变化中发现和定位问题 2 概念理解与示例分析 2 1 指标体系 指标体系 名称 分类 解析 作用 示例 指标 结果型指标 时机
  • 汉诺塔问题 java

    汉诺塔问题 public class HanoiTower 编写一个main方法 public static void main String args Tower t1 new Tower t1 move 5 A B C 汉诺塔问题的解决
  • React事件处理及事件流

    React事件处理 React事件处理是通过将事件处理器绑定到组建上处理事件 事件触发的同时更新组建的内部状态 内部状态更新会触发组件的重绘 React 元素的事件处理和 DOM 元素的事件处理很相似 但语法上的略有区别 在React中事件
  • 如何删除gitee仓库下的文件

    有时我们可能在上传项目到github或者gitee时 忘记忽略了某个文件 就直接push上去了 最后发现上传多了 如何删除掉远程仓库中的文件呢 注 在github上我们只能删除仓库 无法删除文件夹或文件 所以只能通过命令 2 打开GitBa
  • Python 程序设计习题(4) —— 列表与元组

    目录 1 Python 习题部分 2 Python 习题讲解 列表 元组 其他 1 Python 习题部分 要想学习一门语言 便少不了练习 故附上部分 Python 习题 供大家学习参考 如有错误之处 还望指正 1 二年级一班举行了数学考试
  • springboot项目中application.properties无法变成小树叶问题解决

    1 检查我们的resources目录的状态 看看是不是处在普通文件夹的状态 如果是的话 我们需要重新mark一下 右键点击文件夹 选择mark directory as resources root 此时我们发现配置文件变成了小树叶 2 如
  • ScheduledThreadPoolExecutor周期定时任务异常处理踩坑的问题!!

    问题原因 在公司写项目的时候 有一个周期定时任务的需求 就想着阿里巴巴开发手册里不是说不能用Executors去创建线程池 因为存在如下问题 FixedThreadPool和SingleThreadPool 允许的请求队列长度为 Integ
  • NVME Format Command 个人笔记

    Format NVM command NVM Command Set Specific This command is used by the host to change the LBA data size and or metadata
  • 【图像压缩】QOI图像格式详解

    最近听说一种图像格式比较流行 想起我曾经是做图像压缩的emmmm 就来研究一下 QOI Quite OK Image Format 很好的图像格式 git链接 能快速地无损压缩图像 原理也非常简单 没有各种变换 直接空域处理 而无损压缩 自
  • linux入门系列20--Web服务之LNMP架构实战

    作为本入门系列最后一篇文章 将演示如何在CentOS7环境下搭建LNMP环境来构建个人博客网站 常见搭建网站的方式有LAMP LNMP IIS Nginx Tomcat等等 本文演示比较流行的基于LNMP方式来搭建动态WEB网站 正如前文
  • VScode配置C++(win11)以及Vscode的一些使用问题

    目录 一 下载VScode 省略 二 下载编译器 mingw 三 配置 vscode 四 补充 配置好后 输出中文会乱码 五 文件参数讲解 六 多文件编译 修改task json 七 中文问题 一 下载VScode 省略 二 下载编译器 m
  • 测试设计提升之路

    当前软件行业中有很多职位 其中开发与测试可以说是TOP2热门 测试相对开发来说入门容易 但要快速达到巅峰 我们需要掌握一些方法与套路 测试工作是一个繁琐的工作 一个人的精气神有限 在规定的时间内需要掌握多种技术 而且要达到精通非常困难 就测
  • java 使用匿名内部类的方式创建线程并设置和获取线程名字

    有些方法需要传入接口的实例或者抽象类的实例对象 比如Thread有一个构造方法 Thread Runnable target 这时可以可以自定义类实现Runnable接口 重写接口中的方法 将自定义类的对象传入构造方法中 也可以使用匿名内部
  • K8S学习--Kubeadm-7--Ansible二进制部署

    K8S学习 Kubeadm 安装 kubernetes 1 组件简介 K8S学习 Kubeadm 安装 kubernetes 2 安装部署 K8S学习 Kubeadm 3 dashboard部署和升级 K8S学习 Kubeadm 4 测试运
  • C++ 智能指针详解

    点击蓝字 关注我们 参考资料 C Primer中文版 第五版 我们知道除了静态内存和栈内存外 每个程序还有一个内存池 这部分内存被称为自由空间或者堆 程序用堆来存储动态分配的对象即那些在程序运行时分配的对象 当动态对象不再使用时 我们的代码
  • 查找数组中第二大的数

    快速找出一个数组中的最大数 第二大数 思路 如果当 前元素大于最大数 max 则让第二大数等于原来的最大数 max 再把当前元素的值赋给 max 如果当前的元素大于等于第二大数secondMax的值而小于最大数max的值 则要把当前元素的值
  • 第6天-[21天学Python]-面向对象编程以及类的属性和方法

    本章的主要内容有 对象概述 类与对象 定义与使用类 类的属性与方法 类的继承 类的方法重载 1 面向对象编程 1 1 万物皆对象 程序对现实中的事物进行有目的的抽象 面向对象编程就是通过面向对象分析与设计 建立模型 类或对象 并完成最终程序
  • java代码上传本地图片返回地址

    有时候我也很迷这个到底是怎么上传的 写这篇为了给自己看的 大家可参照 Value constantvalue uploadPath private String uploadPath Value constantvalue hostname
  • 极大似然估计详解

    极大似然估计 以前多次接触过极大似然估计 但一直都不太明白到底什么原理 最近在看贝叶斯分类 对极大似然估计有了新的认识 总结如下 贝叶斯决策 首先来看贝叶斯分类 我们都知道经典的贝叶斯公式 其中 p w 为先验概率 表示每种类别分布的概率
  • 【源码+文档】爬虫检索系统

    实验内容 从Top250电影榜单上爬取所有电影的相关信息 包括影片海报 影片海报链接 影片中外文名 影片评分 影片评价人数 影片概况 影片缩略信息 例如 导演 部分演员 上映时间 电影类型等等 将海报以 jpg形式 将其他信息以excel文