因工作需要考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
,方便傳播,使用教程就不贅述了,網上有很多。
效果也不展示了, 因為我還在漫長的校正步驟中,哪位大神有好的校正方法可以聯系我呀,痛苦如狗!!!!!!!!!