利用百度OCR實現驗證碼自動識別


在爬取網站的時候都遇到過驗證碼,那么我們有什么方法讓程序自動的識別驗證碼呢?其實網上已有很多打碼平台,但是這些都是需要money。但對於僅僅爬取點數據而接入打碼平台實屬浪費。所以百度免費ocr正好可以利用。(每天500次免費)

1、注冊百度賬號、百度雲管理中心創建應用、生成AppKey、SecretKey(程序調用接口是要生成access_token)

 

2、利用AppKey、SecretKey生成access_token
向授權服務地址https://aip.baidubce.com/oauth/2.0/token發送請求(推薦使用POST)並在URL中帶上以下參數:
grant_type: 必須參數,固定為client_credentials;
client_id: 必須參數,應用的API Key;
client_secret: 必須參數,應用的Secret Key
代碼如下:

/**
     * 獲取AccessToken
     * 百度開發
     * AppId:
     * APIKey:
     * SecretKey:
     *
     * @return
     */
    public static String getAccessToken() {
        String accessToken = "";
        HttpRequestData httpRequestData = new HttpRequestData();
        HashMap<String, String> params = new HashMap<>();
        params.put("grant_type", "client_credentials");
        params.put("client_id", "xxxxxx");
        params.put("client_secret", "xxxxxx");
        httpRequestData.setRequestMethod("GET");
        httpRequestData.setParams(params);
        httpRequestData.setRequestUrl("https://aip.baidubce.com/oauth/2.0/token");
        HttpResponse response = HttpClientUtils.execute(httpRequestData);
        String json = "";
        try {
            json = IOUtils.toString(response.getEntity().getContent());
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (response.getStatusLine().getStatusCode() == 200) {
            JSONObject jsonObject = JSONObject.parseObject(json);
            if (jsonObject != null && !jsonObject.isEmpty()) {
                accessToken = jsonObject.getString("access_token");
            }
        }
        return accessToken;
    }

 


3、請求百度ocr通用文字識別API(下面以百度通用識別api識別為例)
請求API的URL https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic
請求方法 POST
請求URL參數 access_token
請求頭 (Header) Content-Type application/x-www-form-urlencoded
Body中放置請求參數,主要參數詳情如下:

  •  image : 圖像數據,base64編碼,要求base64編碼后大小不超過4M,最短邊至少15px,最長邊最大4096px,支持jpg/png/bmp格式,當image字段存在時url字段失效
  • url : 圖片完整URL,URL長度不超過1024字節,URL對應的圖片base64編碼后大小不超過4M,最短邊至少15px,最長邊最大4096px,支持jpg/png/bmp格式,當image字段存在時url字段失效
/**
     * 獲取識別驗證碼
     * @param imageUrl
     * @return
     */
    public static String OCRVCode(String imageUrl){
        String VCode = "";

        if (StringUtils.isBlank(ACCESS_TOKEN)) {
            logger.error("accessToken為空");
            return VCode;
        }
        OCRUrl = OCRUrl + "?access_token=" + ACCESS_TOKEN;

        HashMap<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/x-www-form-urlencoded");

        HashMap<String, String> params = new HashMap<>();
        imageUrl = ImageBase64ToStringUtils.imageToStringByBase64(imageUrl);
        params.put("image", imageUrl);

        HttpRequestData httpRequestData = new HttpRequestData();
        httpRequestData.setHeaders(headers);
        httpRequestData.setRequestMethod("post");
        httpRequestData.setParams(params);
        httpRequestData.setRequestUrl(OCRUrl);
        HttpResponse response = HttpClientUtils.execute(httpRequestData);
        String json = "";
        if (response.getStatusLine().getStatusCode() == 200) {
            try {
                json = IOUtils.toString(response.getEntity().getContent());
                JSONObject jsonObject = JSONObject.parseObject(json);
                JSONArray wordsResult = jsonObject.getJSONArray("words_result");
                VCode = wordsResult.getJSONObject(0).getString("words");
            } catch (IOException e) {
                logger.error("請求識別失敗!", e);
            }
        }
        return VCode;
    }

 

對圖片進行base64編碼字符

/**
     * 將本地圖片進行Base64位編碼
     * @param imageFile
     * @return
     */
    public static String encodeImgageToBase64(String imageFile) {
        // 其進行Base64編碼處理
        byte[] data = null;
        // 讀取圖片字節數組
        try {
            InputStream in = new FileInputStream(imageFile);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 對字節數組Base64編碼
        return Base64Util.encode(data);
    }

 

4、返回結果以json方式返回

{
    "log_id": 2471272194,
    "words_result_num": 2,
    "words_result": 
    [
        {"words": " TSINGTAO"},
        {"words": "青島睥酒"}
    ]
}

 


項目github地址:https://github.com/xwlmdd/ipProxyPool
注:ocr圖片識別模塊在這個項目里的一個工具類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM