【某度貼吧】驗證碼識別
首先採集使用了【自研簡易驗證碼爬蟲框架】
一般的驗證碼獲取流程分爲三大步驟
- 前置請求, 獲取驗證碼相關參數
- 驗證碼請求, 獲取驗證碼
- 校驗請求, 通過官網判定驗證碼是否正確
通過繼承 Project 類實現具體的流程 utils.Project
def before_process()-> dict
, 返回其他流程需要的參數字典, 通過self.before_params
訪問def captcha_process() -> Tuple[bytes, str]
, 返回驗證碼圖片bytes和識別後的內容def feedback_process() -> bool
, 返回驗證碼反饋情況,是否正確
在 const.json 文件中補充自己的 聯衆賬號 和 百度API 以及樣本保存的路徑
{
"baidu": {
"app_id": "app_id",
"api_key": "api_key",
"secret_key": "secret_key"
},
"lianzhong": {
"username": "username",
"password": "password"
},
"target_dir": "D:/Samples"
}
編寫流程:
- 補充const.json
- 在spiders包下面新建自己的爬蟲可以參考demo.py
- 在app.py中執行
其中spiders/demo.py是採集某度貼吧的驗證碼例子:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Author: kerlomz <[email protected]>
import json
from typing import Tuple
from utils import Project, ServiceType, ProxyType
class Baidu(Project):
"""
定義自己的類
"""
def __init__(self):
super().__init__()
# 選擇識別服務 [MuggleOCR, BaiduOCR, LianZhong]
self.service_type = ServiceType.MuggleOCR
# 聯衆的驗證碼類型
self.captcha_type = "1105"
# 前置頁面 (驗證碼出現的頁面,用於獲取相關參數)
self.before_url = "https://tieba.baidu.com/f/commit/commonapi/getVcode"
# 驗證碼頁面 用於獲取驗證碼
self.captcha_url = "https://tieba.baidu.com/cgi-bin/genimg"
# 提交頁面 用於校驗驗證碼是否準確
self.feedback_url = "https://tieba.baidu.com/f/commit/commonapi/checkVcode"
def before_process(self, retry=0) -> dict:
"""
前置頁面,獲取驗證碼需要 captcha_vcode_str 參數,return 參數字典提供後面流程調用
:param retry: 重試計數
:return: 參數字典
"""
payload = {
"content": "1",
"tid": "6716233397",
"lm": "2539781",
"word": "\u5b9d\u9a6cx3",
"rs10": "0",
"rs1": "0",
"t": "0.8048427376809806"
}
r = self.session.post("https://tieba.baidu.com/f/commit/commonapi/getVcode", data=payload)
resp = r.text
resp_json: dict = json.loads(resp)
if 'captcha_vcode_str' in resp_json.keys():
captcha_vcode_str = resp_json.get('captcha_vcode_str')
return {"captcha_vcode_str": captcha_vcode_str}
else:
print(resp_json)
return {}
def captcha_process(self) -> Tuple[bytes, str]:
"""
:return: 返回兩個參數:驗證碼bytes內容, 返回驗證碼標籤
"""
if not self.before_params.get('captcha_vcode_str'):
raise ValueError('captcha_vcode_str is miss')
captcha_bytes = self.session.get(
self.captcha_url + "?{}".format(self.before_params['captcha_vcode_str'])
).content
captcha_text = self.platform.request(captcha_bytes)
return captcha_bytes, captcha_text
def feedback_process(self, captcha_text: str) -> bool:
"""
:param captcha_text: 驗證碼識別結果
:return: 返回驗證狀態 [驗證碼正確, 驗證碼錯誤]
"""
if not captcha_text:
return False
if len(captcha_text) != 4:
return False
if not self.before_params['captcha_vcode_str']:
raise ValueError('miss captcha_vcode_str')
payload = {
"captcha_vcode_str": self.before_params['captcha_vcode_str'],
"captcha_code_type": "1",
"captcha_input_str": captcha_text,
"fid": "2539781"
}
r = self.session.post(self.feedback_url, data=payload)
if '{"anti_valve_err_no":0}' in r.text:
return True
else:
r.encoding = "gbk"
print(r.text)
return False
if __name__ == '__main__':
pass
上面的採集框架源碼:https://github.com/kerlomz/captcha_spider
填充完三大步驟之後,使用百度OCR識別即可採集hhhhh,但是吧,這個api字符集不多,需要結合其他的api,可以在service.py中自行添加,採集了驗證碼圖片之後如圖:
其次使用Captcha Trainer框架訓練
筆者採集了19w,輕鬆訓練到97.8%識別率,使用的訓練框架是:
https://www.jiqizhixin.com/articles/2020-06-11-13 介紹的框架。
名爲【captcha_trainer】算是業內比較成熟的企業級框架了。
GitHub地址:https://github.com/kerlomz/captcha_trainer
使用到的採集框架的源碼:https://github.com/kerlomz/captcha_spider
配置的參數如圖:
有問題可以聯繫作者:27009583