zoukankan      html  css  js  c++  java
  • 学信网 学籍、学历在线验证

    声明:本博客纯属技术学习,由于是用爬虫形式实现的,不确定是否违反相关法律,若进行商用请自行咨询学信网,学信网网址: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


      

  • 相关阅读:
    如何用正确的方法写出高质量软件的75条体会(转)
    使用javascript动态添加onclick事件,
    签名和重载
    C#文件后缀名详解
    配置SQL Server 2005 Express的身份验证方式,以及如何启用sa登录名。
    CSS选择符及优先级计算
    关于软件版本的解释
    数据结构形象解释
    CSS属性选择符
    [转载]Repeater三层嵌套
  • 原文地址:https://www.cnblogs.com/betterwgo/p/11918711.html
Copyright © 2011-2022 走看看