千家信息网

java中怎么利用jsoup爬取数据并解析

发表于:2024-11-12 作者:千家信息网编辑
千家信息网最后更新 2024年11月12日,java中怎么利用jsoup爬取数据并解析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.首先分析下要爬的数据 :a.
千家信息网最后更新 2024年11月12日java中怎么利用jsoup爬取数据并解析

java中怎么利用jsoup爬取数据并解析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1.首先分析下要爬的数据 :

a.获取到请求考勤的接口 ,网站开发工具就能抓到比较顺利(这里我登录没有搞定,迂回了一下。后面会记录实现方式)

b.分析数据格式,简单的html-table表格 nice!

二 、 获取考勤数据并整理输出到excel

这里爬数据我用了jsoup ,处理数据用了dom4j

maven引入

          org.jsoup      jsoup      1.12.1              dom4j      dom4j      1.6.1    

代码如下:

  /**   * 模拟请求获取数据   *   * @param userId 用户id   * @param date 日期   */  @Override  public List getPunchList(Integer userId, String date) throws Exception {    UserBean user = userMapper.getUser(userId);//拼装请求地址、参数和必要的请求头信息    StringBuilder url = new StringBuilder();    url.append("http://xxxxxx.com/newkaoqin?userid=");    url.append(userId);    url.append("&seldate=");    url.append(date);    Connection con2 = Jsoup.connect(url.toString());    con2.header("User-Agent", USER_AGENT);    con2.header("Host", HOST);    con2.header("Referer", REFERER);    con2.header("Cookie", getCookie());    Response response = con2.ignoreContentType(true).method(Method.GET).execute();//处理返回的数据    String body = response.body();    Document doc = Jsoup.parse(body);//定位到要解析的位置 选择器可以任意选择。    Elements tab2 = doc.getElementsByClass("tab2");//因为后面有很多无用数据,我们只用第一个所以获取第一个数据    Element first = tab2.first();//    first可能为空    Elements tr = first.select("tr");//处理数据  KaoQinData 是考勤数据的实体。统计后返回实体的集合    List kaoQinData = new ArrayList<>();    KaoQinData kaoQin;    for (Iterator cit = tr.iterator(); cit.hasNext(); ) {      Element tr1 = cit.next();      Elements td = tr1.select("td");      if (td.size() > 0) {        Element punchDateEle = td.get(0);        String punchDateStr = punchDateEle.text();        Element punchTimeEle = td.get(4);        String punchTimeStr = punchTimeEle.text();        if (!StringUtils.isEmpty(punchTimeStr)) {          String substring = punchTimeStr.substring(0, punchTimeStr.indexOf(":"));          Integer integer = Integer.valueOf(substring);          if (integer >= 20) {            System.out.println(punchDateStr + "," + punchTimeStr);            kaoQin = new KaoQinData(user.getRealName(), punchDateStr, punchTimeStr);            kaoQinData.add(kaoQin);          }        }      }    }    return kaoQinData;  }

这里基本上就差不多了。输出excel什么的。随便啦 喜欢用什么就用什么;

附:顺便说一下,我因为没有搞定自动登录获取cookie,偷巧迂回了一下,

1.在项目中创建了一个文件专门存放cookie,像这样:

2.因此写了一个接口用来更新cookie的接口,把新的cookie写上去覆盖cookie文件。

3.使用的时候获取cookiefile文件内的cookie。(有点麻烦,后面有空再研究下自动登录)

  /**   * 获取coockie.   * @return   * @throws IOException   */  private String getCookie() throws IOException {    int num;    char[] buf = new char[1024];    File file = new File(COOKIE_FILEPATH);    if (!file.exists()) {      file.createNewFile();    }    FileReader fileReader = new FileReader(file.getPath());    StringBuilder stringBuilder = new StringBuilder();    while ((num = fileReader.read(buf)) != -1) {      stringBuilder.append(buf, 0, num);    }    return stringBuilder.toString();  }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

0