学信网 学籍、学历在线验证
聲明:本博客純屬技術學習,由于是用爬蟲形式實現的,不確定是否違反相關法律,若進行商用請自行咨詢學信網,學信網網址:https://www.chsi.com.cn/
1.添加依賴
外部依賴有jsoup,taip,fastjson。
jsoup用來解析html; taip是騰訊AI的java 非官方api包,碼云網址為:https://gitee.com/xshuai/taip, 用于做 ocr識別,因為部分數據在圖片中,需要做ocr才能獲得,因此這部分數據的可靠性與騰訊的ocr識別率相關;fastjson是用來解析json字符串的。
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
<dependency>
<groupId>cn.xsshome</groupId>
<artifactId>taip</artifactId>
<version>4.3.5</version>
</dependency>
<!-- fastjson依賴 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
2.根據 在線驗證碼 獲取學信網html
這部分用的是RestTemplate來獲取
public static StuInfo parseUrl(String vcode) {
RestTemplate restTemplate = new RestTemplate();
String url = "https://www.chsi.com.cn/xlcx/bg.do?vcode=" + vcode + "&srcid=bgcx";
String html = restTemplate.getForObject(url, String.class);
return parseHtml(html);
}
這部分得到的是html,vcode可以是 學籍的,也可以是學歷的
3.學籍和學歷信息解析
一個vcode只能對應學籍或者學歷解析
/**
* 這里建議添加異常捕捉操作,
* 這是一個爬蟲方式來獲取的,一旦網頁發生變化,解析的部分沒做非空檢查,可能會拋出異常
*/
private static StuInfo parseHtml(String strHtml) {
Document doc = Jsoup.parse(strHtml, "UTF-8");
Elements eleDiv2 = doc.getElementsByClass("tableTitle");
if (eleDiv2.text().contains("學歷")) {
return parseXueLi(strHtml);
} else if (eleDiv2.text().contains("學籍")) {
return parseXueJi(strHtml);
}
return null;
}
學籍解析:
/**
* 學籍解析
*/
private static StuInfo parseXueJi(String strHtml) {
Document doc = Jsoup.parse(strHtml, "UTF-8");
Elements eleDiv2 = doc.getElementsByClass("div2");
if (eleDiv2 != null && !eleDiv2.isEmpty()) {
Elements eleTd = eleDiv2.get(0).getElementsByTag("td");
if (eleTd != null && !eleTd.isEmpty()) {
StuInfo stuInfo = new StuInfo();
// 姓名是圖片,調用騰訊API實現ocr識別
String nameImg = eleTd.get(1).getElementsByTag("img").get(0).attr("src");
stuInfo.setName(aiOcr(nameImg));
stuInfo.setGender(eleTd.get(4).text());
stuInfo.setIdCard(eleTd.get(6).text());
stuInfo.setNation(eleTd.get(8).text());
stuInfo.setBirthDay(eleTd.get(10).text());
stuInfo.setUniversity(eleTd.get(12).text());
stuInfo.setLevel(eleTd.get(14).text());
stuInfo.setDepartment(eleTd.get(16).text());
stuInfo.setSClass(eleTd.get(18).text());
stuInfo.setDomain(eleTd.get(20).text());
stuInfo.setStuNum(eleTd.get(22).text());
stuInfo.setForm(eleTd.get(24).text());
stuInfo.setEntranceDate(eleTd.get(26).text());
stuInfo.setLenOfSchooling(eleTd.get(28).text());
stuInfo.setType(eleTd.get(30).text());
String[] status = eleTd.get(32).text().split("\(");
stuInfo.setStatus(status[0]);
stuInfo.setGraduationDate(status[1].substring(0, status[1].length() - 1));
return stuInfo;
}
}
return null;
}
學歷解析:
/**
* 學歷解析
*/
private static StuInfo parseXueLi(String strHtml) {
Document doc = Jsoup.parse(strHtml, "UTF-8");
Elements eleDiv2 = doc.getElementsByClass("div2");
if (eleDiv2 != null && !eleDiv2.isEmpty()) {
Elements eleTd = eleDiv2.get(0).getElementsByTag("td");
if (eleTd != null && !eleTd.isEmpty()) {
StuInfo stuInfo = new StuInfo();
// 姓名是圖片,調用騰訊API實現ocr識別
String nameImg = eleTd.get(0).getElementsByTag("img").get(0).attr("src");
stuInfo.setName(aiOcr(nameImg));
stuInfo.setGender(eleTd.get(2).text());
stuInfo.setBirthDay(eleTd.get(3).text());
stuInfo.setEntranceDate(eleTd.get(4).text());
stuInfo.setGraduationDate(eleTd.get(5).text());
stuInfo.setType(eleTd.get(6).text());
stuInfo.setLevel(eleTd.get(7).text());
stuInfo.setUniversity(eleTd.get(8).text());
stuInfo.setLenOfSchooling(eleTd.get(9).text());
stuInfo.setDomain(eleTd.get(10).text());
stuInfo.setForm(eleTd.get(11).text());
stuInfo.setCertificateNum(eleTd.get(12).text());
// 狀態是圖片,調用騰訊API實現ocr識別
String statusImg = eleTd.get(13).getElementsByTag("img").get(0).attr("src");
stuInfo.setStatus(aiOcr(statusImg));
stuInfo.setPresident(eleTd.get(14).text());
return stuInfo;
}
}
return null;
}
注意:本部分代碼中均沒有添加非空檢查,一般而言要先做非空檢查再獲取值,防止可能出現的異常。這里只是個人娛樂,為了代碼簡單易讀所以省了這部分。
學籍和學歷解析中有部分數據是再圖片中的,需要做 ocr識別才能獲取,aiOcr()函數就是做ocr識別的,下一步再說。
具體網頁有變化時,解析需要按照網頁變化進行對應調整。
4. 圖片信息獲取
圖片內信息的獲取調用的騰訊的OCR識別,依賴的taip客戶端接口。taip接口包含了騰訊AI的所有功能,很強大,感興趣的話可以玩玩,但需要先注冊騰訊AI開放平臺,飛機票:https://ai.qq.com/product/nlpchat.shtml
/**
* 這個地方可能需要調用多次,騰訊 ocr 并不是每次都會正確返回結果,有時候會報系統繁忙請稍后再試
*/
private static String aiOcr(String imgUrl) {
String url = "https://www.chsi.com.cn" + imgUrl;
TAipOcr aipOcr = new TAipOcr(APP_ID, APP_KEY);
try {
String result = aipOcr.handWritingOcrByUrl(url);
// fastjson 解析的時候也可能報錯
OcrResult ocrResult = JSONObject.parseObject(result, OcrResult.class);
return ocrResult.getData().getItem_list().get(0).getItemstring();
} catch (Exception e) {
System.out.println("ocr 識別出錯");
return "";
}
}
這個地方的異常處理也有待補充,邏輯也有待補充。
完整代碼:https://gitee.com/betterwgo/chsi_api
總結
以上是生活随笔為你收集整理的学信网 学籍、学历在线验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: settype COM_LOCAT_AD
- 下一篇: 欢乐西游普通副本17金兜山打法攻略