因工作需要考HCIP云架构(HCIP-Cloud Service Solution Architect
)证书, 特意在淘宝上买了题库, 考过了。
事后得知自己被坑了, 多花了几十大洋。
所以想着在授权期内将题库“爬”下来, 共享给大家。
因为整个过程蛮有意思, 所以简单记录下。
思路
题库是以微信小程序的形式出现, 我不会真正的网络爬虫, 也不知道微信小程序怎么爬,所以想着通过截图+OCR的方式将其转换成文字,整理成markdown
形式, 再通过mkdoc
转换成网页。
题库有答题模式和背题模式,也有按照题型进行分类,我们选择背题模式, 以单选题为例。
实现
自动截图
import glob
import os.path
import time
import pyautogui
tx_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 os
from 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)) < threshold
origin_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.size
for 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
,方便传播,使用教程就不赘述了,网上有很多。
效果也不展示了, 因为我还在漫长的校正步骤中,哪位大神有好的校正方法可以联系我呀,痛苦如狗!!!!!!!!!