Kettle实战案例:拉取CSDN博客列表数据至Excel文件【详细教程】

这篇具有很好参考价值的文章主要介绍了Kettle实战案例:拉取CSDN博客列表数据至Excel文件【详细教程】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Kettle 实战案例

上篇文章对 Kettle 的查询、连接、统计、脚本算子进行了介绍,对 Kettle 的大部分算子都应该有了相应的了解,下面我们基于 Kettle 实战案例,拉取 CSDN 博客列表的全部数据,存放至 Excel 文件中。

实验之前先看下 CSDN 列表调用的哪个接口:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

就是这个

https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_43692950


其中 page 参数也就是当前页,size 一页的大小,如果我们要获取全部的数据,肯定需要对这两个参数进行修改。

下面看下返回的结构:

{
    "code": 200,
    "message": "success",
    "traceId": "b1e8ccb0-2e39-4834-bacd-b52a260bb521",
    "data": {
        "list": [
            {
                "articleId": 130450076,
                "title": "ETL工具 - Kettle 查询、连接、统计、脚本算子介绍",
                "description": "连接算子一般将多个数据集通过关键字进行连接,类似 `SQL` 中的连接操作,统计算子可以提供数据的采样和统计功能,脚本算子可以通过程序代码完成一些复杂的操作",
                "url": "https://xiaobichao.blog.csdn.net/article/details/130450076",
                "type": 1,
                "top": false,
                "forcePlan": false,
                "viewCount": 313,
                "commentCount": 0,
                "editUrl": "xxx",
                "postTime": "2023-04-30 23:12:13",
                "diggCount": 1,
                "formatTime": "前天 23:12",
                "picList": [
                    "xxx"
                ]
            }
        ],
        "total": 287
    }}


先不考虑分页的话我们怎么拿到数据呢,首先第一步可以通过 REST client 工具访问该接口获取到数据,然后根据拿到的结果使用 JSON input 进行解析,最后就可以输出到 Excel 文件中了。

那接口是分页的设计,我们怎么获取全部数据呢,下面有三个方案:

  • 直接给个很大的 size ,数据少的情况可以实现不灵活。

  • 每次都获取下一页,递归的形式直到获取的数据为空时停止。

  • 根据接口中的 total 参数,计算出总页数,然后递归的形式对页数进行 +1 ,直到等于最大页。

第一种方案不太灵活,下面我们对二三两个方案进行实践下:

二、递归直到获取数据为空时停止 方案

这里我们定义四个变量,分别如下:

变量初始值说明
page1第几页
flagtrue是否获取数据不为空
urlhttps://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_43692950每次请求的url
baseUrlhttps://blog.csdn.net/community/home-api/v1/get-business-list?size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_43692950去除分页参数后的url

先看一下总的作业设计图:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

转换设计图:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

2.1 作业设计过程

使用设置变量添加上面几个变量信息:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

这里我们主要通过 flag 判断是否需要进行下一步,所以使用检验字段的值判断 flag 是否为 true :

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

如果为 true 的话就执行转化进行具体的获取数据写数据的操作,这里转换返回的结果把接口返回的 $.data.list 值返回出来:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

如果转换的结果是 [] 就表示获取不到数据了,下面使用 JS 脚本将 flag 的值更新为 false ,下面流转到检验字段的值由于 flagfalse 直接流转到成功结束作业了。

如果转换的结果不是 [] ,那表示还有数据,对 page 进行 +1 操作,然后通过 baseUrl 拼接一个完整的访问接口,替换到原来的 url 变量,实现逻辑如下:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

var log= new org.pentaho.di.core.logging.LogChannel("My Log ");var preRows=previous_result.getRows();log.logMinimal('打印日志:'+preRows.size());log.logMinimal('打印日志:'+preRows.get(0));var list = preRows.get(0).getString("list", "");log.logMinimal('打印日志:'+list);if (list == '[]'){
	parent_job.setVariable('flag', false);
	false}else{
	var page=parent_job.getVariable('page');
	var baseUrl=parent_job.getVariable('baseUrl');
	page++;
	var url = baseUrl+"&page="+page;
	parent_job.setVariable('page', page);
	parent_job.setVariable('url', url);
	true;}


2.2 转换设计过程

在转换中首先获取到作业中设定的 url 变量:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

下面使用 REST client 请求接口获取到 JSON 结果集:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

下面使用 JSON input 对结果集进行解析,这里分了两个链路,上面的解析 $.data.list 中具体的字段信息,然后存入到 Excel 中,下面的直接将 $.data.list 值作为转换的结果给到作业:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

2.2.1 存入 Excel 的过程

首先对结果数据进行解析:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

字段这里就对 articleId、title、url、type、postTime 这几个字段进行存储:

名称路径
articleId$.data.list…articleId
title$.data.list…title
content_url$.data.list…url
type$.data.list…type
postTime$.data.list…postTime

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件
解析出关键字段后,使用字段选择过滤下字段:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

最后写入 Excel 中:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件
Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

2.2.2 返回作业结果的过程

解析出 $.data.list 的值:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

选择字段信息:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

2.2.3 运行结果

运行作业:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

从日志中可以看到迭代的效果,下面看下输出的结果:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

可以看到已经获取到了全部的数据。

三、计算出总页数,递归对页数进行 +1 直到等于最大页 方案

这种方案相较于上一个方案多一步计算总页数的操作,这里需要定义四个变量,分别如下:

变量初始值说明
page1第几页
totalPage10总页数
urlhttps://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_43692950每次请求的url
baseUrlhttps://blog.csdn.net/community/home-api/v1/get-business-list?size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_43692950去除分页参数后的url

先看一下总的作业设计图:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

获取总条数转换:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

存储数据转换:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

3.1 作业设计过程

使用设置变量添加上面几个变量信息:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

下面通过计算总条数转换获取到总数,实际就是取的返回中的 $.data.total 参数:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

下面通过 JS 脚本计算出总页数,将总页数覆盖变量 totalPage 的值:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

var log= new org.pentaho.di.core.logging.LogChannel("My Log ");var preRows=previous_result.getRows();log.logMinimal('打印日志:'+preRows.size());log.logMinimal('打印日志:'+preRows.get(0));var total = preRows.get(0).getInteger("total", 0);log.logMinimal('打印日志:'+total);var totalPage = total % 20 == 0 ? parseInt(total / 20) : parseInt(total / 20) + 1;log.logMinimal('打印日志:计算总页数'+totalPage);parent_job.setVariable('totalPage', totalPage);true


下面直接判断如果 page 的值小于 totalPage 则就可以执行存储数据的转换操作:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

在转换执行后,无需拿到转换的结果,直接对 page 进行 +1 操作,并重新生成一个完整的 url 覆盖变量中 url 的值,这里通过 JS 脚本实现:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

var log= new org.pentaho.di.core.logging.LogChannel("My Log ");var page=parent_job.getVariable('page');var baseUrl=parent_job.getVariable('baseUrl');var totalPage=parent_job.getVariable('totalPage');page++;parent_job.setVariable('page', page);log.logMinimal('打印日志:当前分页:'+page+' , 总页数:'+totalPage);var url = baseUrl+"&page="+page;parent_job.setVariable('url', url);true;


下面又指向检验字段的值,一直递归计算。

3.2 获取总条数转换

首先获取到变量的值:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

然后通过 REST client 获取到接口数据:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

下面使用 JSON input 对结果数据进行解析,取出 $.data.total 值:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件
Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

下面通过字段选择,只保留 total 字段:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

最后将该结果作为转换的结果给到作业。

3.3 存入 Excel 过程转换

首先同样获取变量:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

然后通过 REST client 拿到接口数据:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

接着使用 JSON input 拿到关键字段,同样对 articleId、title、url、type、postTime 这几个字段进行存储:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

最后写入到 Excel 中:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

3.4 运行结果

运行作业:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件

从日志中可以看到迭代的效果,下面看下输出的结果:

Kettle实战案例,Kettle拉取博客列表数据,Kettle导入Excel文件
可以看到同样获取到了全部的数据。文章来源地址https://www.toymoban.com/news/detail-432071.html

到了这里,关于Kettle实战案例:拉取CSDN博客列表数据至Excel文件【详细教程】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包