【源碼】某度貼吧驗證碼識別

【某度貼吧】驗證碼識別

首先採集使用了【自研簡易驗證碼爬蟲框架】

一般的驗證碼獲取流程分爲三大步驟

  1. 前置請求, 獲取驗證碼相關參數
  2. 驗證碼請求, 獲取驗證碼
  3. 校驗請求, 通過官網判定驗證碼是否正確

通過繼承 Project 類實現具體的流程 utils.Project

  1. def before_process()-> dict, 返回其他流程需要的參數字典, 通過 self.before_params訪問
  2. def captcha_process() -> Tuple[bytes, str], 返回驗證碼圖片bytes和識別後的內容
  3. 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"
}

編寫流程:

  1. 補充const.json
  2. 在spiders包下面新建自己的爬蟲可以參考demo.py
  3. 在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章