低级爬虫实现-记录HCIP云架构考试

因工作需要考HCIP云架构(HCIP-Cloud Service Solution Architect)证书, 特意在淘宝上买了题库, 考过了。

事后得知自己被坑了, 多花了几十大洋。

所以想着在授权期内将题库“爬”下来, 共享给大家。
因为整个过程蛮有意思, 所以简单记录下。

思路

题库是以微信小程序的形式出现, 我不会真正的网络爬虫, 也不知道微信小程序怎么爬,所以想着通过截图+OCR的方式将其转换成文字,整理成markdown形式, 再通过mkdoc转换成网页。

题库有答题模式和背题模式,也有按照题型进行分类,我们选择背题模式, 以单选题为例。

在这里插入图片描述

实现

自动截图

import glob
import os.path
import timeimport pyautoguitx_dict = {'1': '单选','2': '多选','3': '判断','4': '填空',
}
tx = input("输入题型编号(1.单选 2.多选 3.判断 4.填空):\n")lx = tx_dict.get(tx)
if not lx:raise Exception()
output_dir = f'output/{lx}'
os.makedirs(output_dir, exist_ok=True)# 计算翻页次数
nums = int(input('输入题目数量:\n'))def next_page():"""模拟滑动到下一页:return:"""pyautogui.moveTo(560, 1000)pyautogui.dragTo(60, 1000, 0.2, button='left')time.sleep(1)if __name__ == '__main__':for i in range(0, nums):pyautogui.screenshot(f"{output_dir}/{i}.png", region=(32, 266, 750, 1310))next_page()

看下效果:
在这里插入图片描述

去水印

采集水印色素, 对相似度接近的色素进行白色替换处理:

import glob
import osfrom PIL import Image# 设置一个颜色差异阈值,这里以50为例
threshold = 50
# 水印色素
watermark_rgb = (232, 232, 232)def abs_delta(r1, g1, b1, target):return (abs(target[0] - r1) + abs(target[1] - g1) + abs(target[2] - b1)) < thresholdorigin_file_pattern = f"output/单选/*.png"
target_dir = f"output/单选/water"
os.makedirs(target_dir, exist_ok=True)
pngs = glob.glob(origin_file_pattern)
for png in pngs:img = Image.open(png)# 获取图片的宽度和高度width, height = img.sizefor y in range(height):for x in range(width):r, g, b = img.getpixel((x, y))if abs_delta(r, g, b, watermark_rgb):img.putpixel((x, y), (255, 255, 255))  # 将接近白色的像素改为白色,也可改为背景色近似值# 保存处理后的图片,将输出路径替换为实际想要保存的地方output_path = f"{target_dir}/{os.path.basename(png)}"img.save(output_path)

效果如下:

在这里插入图片描述

OCR

由于图片较多,对批量处理和准确度要求较高, 通过比较各种工具, 最终选择了Umi-OCR

使用比较简单, 截个图示意一下就行了:

在这里插入图片描述

校正

输出文字后就是漫长的文字校正过程了, 包括识别错误、换行处理等等

生成文档

我选择的是mkdocs,主要用来生成静态网页,类似于gitbook,方便传播,使用教程就不赘述了,网上有很多。

效果也不展示了, 因为我还在漫长的校正步骤中,哪位大神有好的校正方法可以联系我呀,痛苦如狗!!!!!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QGroundControl之5-AppSettings.cc

介绍 应用程序设置 Application Settings &#xff0c;这里看下语言选择功能&#xff0c;它是怎么和json文件关联起来的&#xff0c;刚刚看的时候&#xff0c;很是奇怪这么多的json文件作用。 1.AppSettings.cc 文件怎么和App.SettingsGroup.json关联 在AppSettings.cc文件没…

jenkins邮件的配置详解

Jenkins邮件的配置涉及多个步骤和细节,以下是详细的配置指南: 一、前期准备 确定邮件服务:明确Jenkins将要使用的邮件服务,如QQ邮箱、163邮箱、公司邮箱(基于Microsoft 365或Exchange Server)等。获取SMTP配置信息:根据邮件服务类型,获取相应的SMTP服务器地址、端口号…

【ArcGIS微课1000例】0134:ArcGIS Earth实现二维建筑物的三维完美显示

文章目录 一、加载数据二、三维显示三、三维符号化一、加载数据 加载配套实验数据(0134.rar中的建筑物,2d或3d都可以),方法如下:点击添加按钮。 点击【Add Files】,在弹出的Open对话框中,选择建筑物,点击确定,完成添加。 默认二维显示: 二、三维显示 右键建筑物图层…

jupyterlab 增加多个kernel,正确做法

1、背景 需要增加一个kernel然后相当于隔离一个环境 juypterlab Version 3.0.14 2、用conda 安装 例如&#xff0c;你在conda下有一个python 3.12 的环境 py312 ipython kernel install --user --namepy312 如果保持的话&#xff0c;用pip安装相应的包就好 3、检查是否配置好 …

案例-商品列表(组件封装)

标签组件封装 1.双击显示&#xff0c;自动聚焦 2.失去焦点&#xff0c;隐藏输入框 标签一列&#xff0c;不同行的标签内容不同&#xff0c;但是除此之外其他基本一致&#xff0c;所以选择用 标签组件 将这一部分封装为一个组件&#xff0c;需要时组件标签展示。 首先标签处一进…

Python 基础学习(一)

一.基础语法 注释 Python中单行注释以 # 开头&#xff0c;如下&#xff1a; #!/usr/bin/python3# 第一个注释 print ("Hello, Python!") # 第二个注释多行注释可以用多个 # 号&#xff0c;还有 ‘’’ 和 “”"&#xff1a; #!/usr/bin/python3# 第一个注释…

TIM输入捕获---STM

一、简介 IC输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存在CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器和通用定时器都拥有4个输入捕获通道 可配置为PWMI模…

【Android Studio】学习——网络连接

实验&#xff1a;Android网络连接 文章目录 实验&#xff1a;Android网络连接[toc]实验目标和实验内容&#xff1a;1、掌握Android联网的基本概念&#xff1b;2、能够使用URL connection实现网络连接&#xff1b;3、掌握第三方库的基本概念4、需实现的具体功能 实验结果功能说明…

5G中什么是ATG网络?

有人问Air to Ground Networks for NR是怎么回事&#xff1f;这个是R18 NR才引入的。 ATG很多部分和NTN类似中的内容类似。比较明显不同的是&#xff0c;NTN的RF内容有TS 38.101-5单独去讲&#xff0c;而ATG则会和地面网络共用某些band&#xff0c;ATG可以工作在N1/N3/N34/N39…

基础算法--双指针

两数之和 点击&#xff1a;题目链接 解法一&#xff1a;暴力解法 时间复杂度&#xff1a;O(N^2) 算法思路&#xff1a;两层for循环即可列出所有两个数字的组合&#xff0c;判断是否等于目标值 算法流程&#xff1a; 两层 for 循环&#xff1a; 外层 for 循环依次枚举第⼀个…

什么是Linux系统架构?

​ Linux系统架构是指Linux操作系统的整体结构和工作层次&#xff0c;它定义了系统组件如何交互、如何管理硬件资源&#xff0c;以及用户如何通过不同的层次与系统进行交互。Linux架构通常有两种划分方法&#xff1a;系统层次架构和功能层次架构&#xff0c;两者都可以很好地描…

不是“我应该做什么”,而是“我想做什么”

1. 识别内心的渴望 首先&#xff0c;我们需要识别自己真正的愿望和激情所在。这可能需要一些时间和自我反思。问自己&#xff1a;在没有任何外界压力的情况下&#xff0c;我真正想做的是什么&#xff1f;是赚钱、生活、旅行、追星&#xff0c;还是其他什么&#xff1f;识别这些…

React第十七章(useRef)

useRef 当你在React中需要处理DOM元素或需要在组件渲染之间保持持久性数据时&#xff0c;便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 访问ref的值 类似于vue的ref,Vue的ref是.value&#xff0c;其次就是vu…

【C++】内存分布、new、delete、 operator new、operator delete

内存分布 在C语言和C中&#xff0c;程序内存被划分成六个部分&#xff1a; 内核空间、栈、内存映射段、堆、数据段、代码段 栈&#xff1a;又称堆栈&#xff0c;主要为非静态局部变量、函数参数、返回值等&#xff0c;栈的生长方向是向下生长的 内存映射段&#xff1a;高效的…

混合云策略在安全领域受到青睐

Genetec 发布了《2025 年物理安全状况报告》&#xff0c;该报告根据超过 5,600 名该领域领导者&#xff08;其中包括 100 多名来自澳大利亚和新西兰的领导者&#xff09;的回应&#xff0c;揭示了物理安全运营的趋势。 报告发现&#xff0c;澳大利亚和新西兰的组织采用混合云策…

FastAPI解决跨域报错net::ERR_FAILED 200 (OK)

目录 一、跨域问题的本质 二、FastAPI中的CORS处理 1. 安装FastAPI和CORS中间件 2. 配置CORS中间件 3. 运行FastAPI应用 三、解决跨域报错的步骤 四、案例:解决Vue.js与FastAPI的跨域问题 1. Vue.js前端应用 2. FastAPI后端API 3. 配置CORS中间件 4. 运行和测试 五…

霍尔效应电流传感器

适用于大电流&#xff0c;低功耗的电流检测&#xff1a; TVS选型: RS232的隔离电路: 单片机采集200伏高压 如何做隔离电路&#xff1a; 采用线性光电耦合器HCNR200实现高压直流母线电压的精确采样。还是用电阻分压&#xff0c;只是在ADC检测阶段加上隔离芯片&#xff1a;

【计网笔记】习题

物理层 不属于物理层接口规范定义范畴的是&#xff08;C&#xff09; A. 接口形状 B. 引脚功能 C. 物理地址 D. 信号电平 【2023-912】光网络只能通过导向型介质传播。&#xff08;&#xff09; 【2017-408】若信道在无噪声情况下的极限数据传输速率不小于信噪比为30dB条件下的…

最新 AI 编程工具全面对比:v0、Bolt.new、Cursor、Windsurf

随着人工智能的快速发展&#xff0c;越来越多的 AI 驱动的开发工具应运而生&#xff0c;旨在提升开发效率、优化开发流程&#xff0c;并减轻开发者的工作负担。在这个背景下&#xff0c;四款新兴的 AI 编程工具&#xff1a;v0、Bolt.new、Cursor 和 Windsurf&#xff0c;各具特…

【C++算法】35.位运算_两整数之和

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a; 题目链接&#xff1a; 371. 两整数之和 题目描述&#xff1a; 解法 笔试的话直接 return ab&#xff1b; 接下来讲一下这题的解法&#xff1a; 位运算&#xff08;异或运算-无进位相加&#xff…