在爬取網站的時候都遇到過驗證碼,那麼咱們有什麼方法讓程序自動的識別驗證碼呢?其實網上已有不少打碼平臺,可是這些都是須要money。但對於僅僅爬取點數據而接入打碼平臺實屬浪費。因此百度免費ocr正好能夠利用。(天天500次免費)
一、註冊百度帳號、百度雲管理中心建立應用、生成AppKey、SecretKey(程序調用接口是要生成access_token)
git
二、利用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
代碼以下:github
/** * 獲取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; }
三、請求百度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中放置請求參數,主要參數詳情以下:json
/** * 獲取識別驗證碼 * @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編碼字符api
/** * 將本地圖片進行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); }
四、返回結果以json方式返回數組
{ "log_id": 2471272194, "words_result_num": 2, "words_result": [ {"words": " TSINGTAO"}, {"words": "青島睥酒"} ] }
項目github地址:https://github.com/xwlmdd/ipProxyPool
注:ocr圖片識別模塊在這個項目裏的一個工具類app