java使用jsoup爬取数据并解析

首先这边文章只为记录简单的jsoup 和 dom4j的基本使用,并且爬虫是爬自己公司的数据也有一定局限性。参考性很有限,只给自己做个记录。

 

因为公司每月会统计加班到晚上8点之后的考勤次数,根据这个会象征性的发一些补助。然而每次都得盯着,搞的烦不剩烦(也可能是我懒),就想着直接爬整个部门的符合规定的考勤次数。

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

0c30e05220c20a856a77c38c4c0c65710da.jpg

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

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

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

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

    maven引入

    <dependency>
      <groupId>org.jsoup</groupId>
      <artifactId>jsoup</artifactId>
      <version>1.12.1</version>
    </dependency>
    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
    </dependency>

代码如下: 

  /**
   * 模拟请求获取数据
   *
   * @param userId 用户id
   * @param date 日期
   */
  @Override
  public List<KaoQinData> 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> kaoQinData = new ArrayList<>();
    KaoQinData kaoQin;
    for (Iterator<org.jsoup.nodes.Element> 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,像这样:

f12aa392b6e71b13e9ddb53d01c3cc660f2.jpg

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();
  }

 

转载于:https://my.oschina.net/u/3532010/blog/3070184

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值