标签:blank end 客户 sid jsoup art alibaba 注意 lse
外部依赖有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>
这部分用的是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可以是 学籍的,也可以是学历的
一个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识别的,下一步再说。
具体网页有变化时,解析需要按照网页变化进行对应调整。
图片内信息的获取调用的腾讯的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
标签:blank end 客户 sid jsoup art alibaba 注意 lse
原文地址:https://www.cnblogs.com/betterwgo/p/11918711.html