禅道api调用(爬虫方式)

2023-11-04

目录

获取所有进行中的项目信息

url

postman

Java代码

实体类

逻辑处理

根据项目id获取指定项目下所有未关闭的任务id

url

postman

Java代码

总结


在Java中,我们可以使用各种库和框架来创建自己的爬虫程序,我们先来了解一下目前常见的Java爬虫库和框架:

  1. Jsoup:Jsoup是一个非常流行的Java HTML解析器,可以用于解析和处理HTML页面。它提供了简单而灵活的API,可以方便地从HTML页面中提取所需的数据。

  2. HttpClient:HttpClient是Apache提供的一个强大的HTTP客户端库,可以用于发送HTTP请求和处理响应。你可以使用HttpClient来模拟浏览器行为,发送GET或POST请求,并获取网页内容。

  3. Selenium:Selenium是一个用于Web应用程序测试的工具,也可以用于爬虫。它可以模拟用户在浏览器中的操作,自动化地加载网页、填写表单、点击按钮等。通过Selenium,你可以爬取那些需要JavaScript渲染的页面。

  4. WebMagic:WebMagic是一个基于Java的开源爬虫框架,提供了丰富的功能和灵活的扩展性。它支持多线程、分布式爬取,提供了强大的页面解析和数据抽取功能。

  5. Apache Nutch:Apache Nutch是一个开源的Web爬虫框架,用于构建大规模的网络搜索引擎。它基于Java编写,提供了丰富的功能和可配置性,可以用于爬取大量的网页数据。

注意:无论使用哪种方式,在使用第三方数据时,你可能还需要考虑数据的合法性、可靠性和安全性等方面的问题,并遵守相关法规和规定!!!


获取所有进行中的项目信息

url

http://禅道地址xxx/zentao/project-all-doing-项目ID-order_desc-0.html

postman

Java代码

关于禅道登录的业务实现大家可以参考这篇博客:http://t.csdn.cn/I2uPU

实体类

package com.example.zentaoaibackend.entity;

import lombok.Data;
import java.util.Date;
import java.io.Serializable;

public class ProjectInfoEntity extends BaseAttribute {
    /**
     * 项目ID
     */
    private Integer projectId;

    /**
     * 项目名称
     */
    private String name;
    /**
     * 项目代号
     */
    private String code;
    /**
     * 项目负责人
     */
    private String director;
    /**
     * 项目截止日期
     */
    private Date endtime;
    /**
     * 是否参与消息推送
     */
    private int joinStatus;
    /**
     * 钉钉群id
     */
    private String dingGroupId;
    /**
     * 钉钉群名称
     */
    private String dingGroupName;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDirector() {
        return director;
    }

    public void setDirector(String director) {
        this.director = director;
    }

    public Date getEndtime() {
        return endtime;
    }

    public void setEndtime(Date endtime) {
        this.endtime = endtime;
    }

    public int getJoinStatus() {
        return joinStatus;
    }

    public void setJoinStatus(int joinStatus) {
        this.joinStatus = joinStatus;
    }

    public String getDingGroupId() {
        return dingGroupId;
    }

    public void setDingGroupId(String dingGroupId) {
        this.dingGroupId = dingGroupId;
    }

    public String getDingGroupName() {
        return dingGroupName;
    }

    public void setDingGroupName(String dingGroupName) {
        this.dingGroupName = dingGroupName;
    }

    public void setProjectId(Integer projectId) {
        this.projectId = projectId;
    }

    public Integer getProjectId() {
        return projectId;
    }

}

逻辑处理

通过爬取返回的html页面格式如下图,我们根据给出的结构进行解析

import com.example.zentaoaibackend.entity.ProjectInfoEntity;
import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;


public List<ProjectInfoEntity> GetDoingProjectInfo() {
        List<ProjectInfoEntity> doingProjectList = new ArrayList<>();
        try {
            //登录禅道
            zentaoLogin();

            //url地址
            String url = "http://127.0.0.1/zentao/project-all-doing-422-order_desc-0.html";
            //执行url,并传入cookie
            Document doc = Jsoup.connect(url).cookie("zentaosid", Constant.ZENTAOID).get();
            //解析html页面,获取tr标签
            Elements tfElements = doc.select("table").select("tbody").select("tr");

            //遍历tr标签,根据任务状态获取对应的任务id,并放入到集合中
            for (Element element : tfElements) {
                //获取td标签
                Elements tdElements = element.select("td");
                //用于解析后的数据信息存储
                ProjectInfoEntity projectInfo = new ProjectInfoEntity();

                //遍历td标签
                for (Element tdElement : tdElements) {
                    //判断当前遍历的标签中class元素是否包含text-left
                    //包含:获取项目id
                    //不包含:继续下一次遍历
                    if (tdElement.attr("class").equals("text-left")) {
                        //获取项目ID
                        String attr = element.attr("data-id");
                        //将项目ID传入到实体中
                        projectInfo.setProjectId(Integer.valueOf(attr));

                        //因为返回的有多个td标签中都包含了class='text-left'的元素,我们不能直接获取项目信息,需要进行判断
                        //包含title元素:为项目代码;否则:为项目名称
                        if (tdElement.attr("title").equals("")) {
                            //项目代号
                            projectInfo.setCode(tdElement.text());
                        } else {
                            //项目名称
                            projectInfo.setName(tdElement.attr("title"));
                        }
                    }
                }
                doingProjectList.add(projectInfo);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
        return doingProjectList;
    }


根据项目id获取指定项目下所有未关闭的任务id

url

http://禅道地址xxx/zentao/project-task-439-unclosed.html

postman

Java代码

package com.example.zentaoaibackend.utils.zentaoAPI;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import static com.example.zentaoaibackend.utils.zentaoAPI.DoGet.doGet;
import static com.example.zentaoaibackend.utils.zentaoAPI.login.ZentaoLogin.zentaoLogin;


/**
 * @BelongsProject: zentaoai-backend
 * @BelongsPackage: com.example.zentaoaibackend.utils.zentaoAPI
 * @Author: author
 * @CreateTime: 2022-11-26  11:14
 * @Description: 根据项目id获取指定项目下所有任务
 * @Version: 1.0
 */
@Component
public class GetProjectTask extends IJobHandler {
    public List<String> GetTaskByProjectId(String projectId) throws IOException {
        List<String> unClosedList = new ArrayList<>();
        try {
            zentaoLogin();
            //url地址
            String url = "http://127.0.0.1/zentao/project-task-" + projectId + "-unclosed.html";
            //执行接口调用,并传入cookie
            Document doc = Jsoup.connect(url).cookie("zentaosid", Constant.ZENTAOID).get();
            //解析html页面,获取tr标签
            Elements select = doc.select("table").select("tbody").select("tr");
            //遍历tr标签,根据任务状态获取对应的任务id,并放入到集合中
            for (Element element : select) {
                unClosedList.add(element.attr("data-id"));
            }

        } catch (Exception e) {
            System.out.println(e);
        }
        return unClosedList;
    }

    @Override
    public ReturnT<String> execute(String s) throws Exception {
        return null;
    }
}

总结

注意:个别信息比较私密模糊展示不便于公开,请见谅!!

如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞、收藏脚印支持一下博主哦~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

禅道api调用(爬虫方式) 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • 和小伙伴们一起学Unity3D(五)让角色更鲜活——刚体

    在现实生活中 我们无时无刻都在受着力的作用 小伙伴们推一下 我们会往前走一小段 想不开跳楼的时候我们会被重力摔的妈都不认识 脸被拳头打中的时候 身体会旋转180 然后倒地 因为我们生活在物理世界 会受力的作用做出相应的反映 那么在游戏世界里
  • 在什么情况下析构函数要定义成虚函数

    先说结论 一个类作为基类时 最好把析构函数定义成虚函数 否则 当用基类指针指向派生类情况下 释放基类指针 派生类的析构函数不会被调用 这样就有可能造成资源或者内存泄漏等问题 include
  • Qt事件分发及过滤

    Qt事件分发及过滤 当我们的程序发现一个事件的时候 并不是立即调用事件函数 而是全部交由分发器event 处理 event 返回的数据类型是bool类型 如果event 返回的结果是true表示用户要自己处理事件 event 就不会向下分发
  • gcc的使用方法

    gcc 在x86平台ubuntu应用程序下编译 和arm linux gcc 在arm裸机下编译 的常用选项 注 vc6 0 在x86平台windows应用程序下编译 gcc的使用方法 gcc 选项 文件名 gcc常用选项 v 查看gcc编
  • C语言实现数据结构代码(四)-图-图的遍历

    一 深度优先搜索遍历 DFS 1 基本思想 类似于树的先序遍历 首先访问出发点v 并将其标记为已访问过 选取与v邻接的未被访问的任意一个顶点w 访问w 选取与w邻接的未被访问的任一顶点访问 以此重复进行 当一个顶点所有的邻接顶点都被访问过时
  • 取服务器视频文件,视频从云服务器获取视频文件

    视频从云服务器获取视频文件 内容精选 换一换 支持将华为云服务器上的音视频文件通过内网方式上传到与服务器在同一区域的视频点播服务中 但您需要先将服务器当前使用的DNS切换为华为云的内网DNS 具体请参见怎样切换内网DNS 然后使用视频点播服
  • MATLAB 文件及文件夹操作

    1 matlab中读取一行多个字符的文本 fid fopen while feof fid tline fgetl fid row col size tline print findstr tline print vein findstr
  • 代码保护软件VMProtect用户手册主窗口之主菜单

    VMProtect是一种很可靠的工具 可以保护应用程序代码免受分析 但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下 才能实现最好的效果 下载VMProtect最新试用版 接下来为大家介绍关于VMProtect中主
  • PerfView专题 (第十二篇):对 C# 下的 SDK 类库进行监控(大结局)

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • 计算机拒绝访问移动硬盘,移动硬盘拒绝访问怎么办

    在有些时候我们的移动硬盘拒绝访问了 这该怎么办呢 那么下面就由学习啦小编来给你们说说移动硬盘拒绝访问的解决方法吧 希望可以帮到你们哦 移动硬盘拒绝访问的解决方法一 第一线不宜太长 要插在主机后面的USB插口 插上移动硬盘 2 桌面右键单击
  • iOS 打包出错, 编译出错,证书问题,上传AppStore

    1 ERROR ITMS 90046 90085 Invalid Code Signing Entitlements Your application bundle s signature contains code signing ent
  • 利用gitlab pages和hexo搭建一个个人博客

    AI boy原创 转载请注明出处 1 使用github pages存在的问题 目前网上有很多利用github pages和hexo搭建个人博客的教程 但是github目前拒绝了百度蜘蛛的爬取 因此如果希望自己的博客能够被百度收录 就需要采用
  • 前端开发中的 json 和 xml 还有JavaScript的异步加载

    1 xml XML文档中的数据采用元素像 HTML 的段落一样展现
  • 基于Golang和WebSocket打造自已的反向代理

    当我们在开发的时候 有时想要把自已开发的接口暴露给其他开发者或者第三方的服务 方便我们调试和排查问题 那就需要某种机制把我们本地的服务接口暴露到互联网上 本文将要介绍如何通过Golang和WebSocket来实现这一功能 为什么我们需要开发
  • 1032 挖掘机技术哪家强python3无超时

    改进后的代码成功率在90 文章目录 1 最初代码 2 改进代码 1 最初代码 usr bin env python coding utf 8 File 1032 py Time 2020 04 08 17 02 03 Author Schi
  • nginx 之 pcre 安装

    1 下载pcre wget https nchc dl sourceforge net project pcre pcre 8 43 pcre 8 43 tar gz 2 解压 3 进入解压目录 4 执行如下命令 configure ena
  • 【pytorch】pytorch使用记录(持续更新)

    1 找不到moule xxx 当训练模型在重新加载用于评估的时候出现少了一个module前缀 这个问题通常是由于训练的时候采用了数据并行操作 而评估模型的时候却没有用到 因此 只需要在训练代码中补充 net nn DataParallel
  • 深入理解Java中的字符串驻留机制

    引言 在Java编程中 字符串是最常用的数据类型之一 而Java的字符串驻留 intern 机制则是字符串处理中一个重要且经常被忽视的话题 本文将带您深入探讨Java中字符串驻留机制的原理和影响因素 什么是字符串驻留机制 字符串驻留机制是指
  • VAF Variance Accounted For(方差贡献率)

    VAF是指方差贡献率 是一种用于衡量 评估 模型预测能力的指标 即模型的预测结果与实际结果的相关程度 VAF越高 说明模型对实际数据的解释能力越好 模型预测结果越接近实际结果 计算公式 V A F 1
  • 禅道api调用(爬虫方式)

    目录 获取所有进行中的项目信息 url postman Java代码 实体类 逻辑处理 根据项目id获取指定项目下所有未关闭的任务id url postman Java代码 总结 在Java中 我们可以使用各种库和框架来创建自己的爬虫程序