StarSpider 星蛛 爬虫 Java框架 可以实现 lazy爬取 实现 HTML 文件的编译,子标签缓存等操作

news2025/2/8 18:25:29

StarSpider 星蛛 爬虫 Java框架

开源技术栏

StarSpider 能够实现 针对 HTML XSS SQL 数学表达式等杂乱数据的 爬取 解析 提取 需求!

目录

文章目录

  • StarSpider 星蛛 爬虫 Java框架
    • 目录
    • 介绍
      • 如何获取?
        • maven配置
      • 架构是什么样的?
        • 结果对象的类型与作用
        • 解析组件的类型与作用
    • 有哪些功能?
      • 简单入门
      • 标签文本的解析
      • HTML或XML属性的查找
      • 数学表达式的提取
      • 正则表达式的匹配
      • Json字符串的解析
      • sql 语句的解析
    • 更新日志
      • 1.1 版本更新于 2025-01-26
    • 更多信息

介绍

1703711668101.jpg
星蛛解析库是一款针对数据解析提供的库,其中内置诸多数据解析组件,支持对网络数据包,文件对象,以及字符串对象进行解析,是Java实现的一种数据解析手段,是可以实现爬虫,智能提取等需求的强悍工具。

如何获取?

目前该组件已支持maven与gradle两种方式获取。

maven配置

<dependencies>
    <dependency>
        <groupId>io.github.BeardedManZhao</groupId>
        <artifactId>StarSpider</artifactId>
        <version>1.1</version>
    </dependency>
    <!-- 依赖导入 您可以自己选择版本!!! -->
    <dependency>
        <groupId>io.github.BeardedManZhao</groupId>
        <artifactId>mathematical-expression</artifactId>
        <version>1.4.7</version>
        <!-- 至少要 1.4.7 版本 -->
    </dependency>
    <dependency>
        <groupId>io.github.BeardedManZhao</groupId>
        <artifactId>SQLStringInFo</artifactId>
        <version>1.1</version>
        <!-- 支持所有版本 -->
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>2.0.21</version>
        <!-- 至少要 2.0.21 版本 -->
    </dependency>
</dependencies>

架构是什么样的?

在框架中,用户直接与星蛛门户类(parser.io.github.beardedManZhao.starSpider.StarSpider)进行交互,通过该类,可对URL,FILE,String,三种对象进行内容提取与解析,用户可以根据自己的需求向星蛛解析函数中传递形参,实现不同效果。

星蛛门户会根据用户传递的形参,从哈希表中获取到对应的组件进行数据解析,并将组件解析结果对象直接通过星蛛门户类(parser.io.github.beardedManZhao.starSpider.StarSpider)
返回给用户,用户可根据结果中的各类函数进行更多的操作,目前的结果对象有如下几种。

结果对象的类型与作用
结果对象数据类型该结果类型对应的提取组件该结果类型的特有功能该结果类型的支持版本
io.github.beardedManZhao.starSpider.container.LABELDocumentio.github.beardedManZhao.starSpider.parser.LABELParser面向标签节点进行数据提取操作v1.0
io.github.beardedManZhao.starSpider.container.HTMLDocumentio.github.beardedManZhao.starSpider.parser.HTMLParser面向标签节点与节点属性进行数据提取操作,是LABEL结果对象的子类实现v1.0
io.github.beardedManZhao.starSpider.container.ExpressionDataio.github.beardedManZhao.starSpider.parser.MEParser面向每一个数学表达式进行数据提取操作v1.0
io.github.beardedManZhao.starSpider.container.StringDataio.github.beardedManZhao.starSpider.parser.PatternParser面向每一个符合提取条件的字符串v1.0
io.github.beardedManZhao.starSpider.container.SQLStringDataio.github.beardedManZhao.starSpider.parser.SQLStringParser面向每一个SQL语句进行语义解析操作v1.0
io.github.beardedManZhao.starSpider.container.FastJsonDocumentio.github.beardedManZhao.starSpider.parser.FastJsonParser面向json字符串中每一个json节点进行提取操作。v1.0
解析组件的类型与作用
组件名称(常量区中的常量名)组件类型作者主页面向格式已注册至门户组件作用组件支持版本
NULLio.github.beardedManZhao.parser.starSpider.StarSpiderhttps://github.com/BeardedManZhaoURL, FILE, StringNO与用户进行直接交互,根据用户的需求调整框架内部的结构并提交解析数据的任务v1.0
PARSER_NAME_LABELio.github.beardedManZhao.parser.starSpider.LABELParserhttps://github.com/BeardedManZhao使用标签格式的字符串YES提取与解析标签数据中的每一个节点v1.0
PARSER_NAME_HTMLio.github.beardedManZhao.parser.starSpider.HTMLParserhttps://github.com/BeardedManZhaoHTML XMLYES通过节点名称或节点属性,提取与解析HTML与XML中的每一个节点,并返回具有相对节点解析功能的结果对象v1.0
PARSER_NAME_REGEXPio.github.beardedManZhao.parser.starSpider.PatternParserhttps://github.com/BeardedManZhaoStringYES通过用户提供的正则表达式解析任意文本中的内容,提取出符合正则表达式的所有数据v1.0
PARSER_NAME_MEio.github.beardedManZhao.parser.starSpider.MEParserhttps://github.com/BeardedManZhaoStringYES智能提取出所有数学表达式,并通过ME框架进行表达式计算,返回结果v1.0
PARSER_NAME_SQL_STRING_INFOio.github.beardedManZhao.parser.starSpider.SQLStringParserhttps://github.com/BeardedManZhao/SQLStringInFoSQLStringYES智能提取出所有的SQL语句,并通过SQLStringINFO解析库对语句进行解析,然后返回结果v1.0
PARSER_NAME_FASTJSONio.github.beardedManZhao.parser.starSpider.FastJsonParserhttps://github.com/alibabaJsonYES针对JSON进行解析的库,将FastJson接入到门户,它返回的结果就是一个JSONObject对象v1.0
Dear friendsNO事实上,我们希望有更多人可以将自己的实现提供给我们,由各位亲自将自己的组件接入至星蛛门户

有哪些功能?

在星蛛门户中,用户可以直接通过parse函数设置参数与解析对象,进而获取到解析结果,在库中的解析工作由解析器进行,解析器的实现有很多,每一个注册到星蛛的组件都可以使用门户访问到,接下来就展示下更多的信息。

简单入门

package io.github.beardedManZhao.starSpider;

import io.github.beardedManZhao.starSpider.container.HTMLDocument;
import io.github.beardedManZhao.starSpider.parser.StarSpider;

import java.io.File;
import java.io.IOException;

/**
 * 测试用例类
 *
 * @author zhao
 */
public final class MAIN {
    public static void main(String[] args) throws IOException {
        // 构建需要爬取页面的URL
        // URL url = new URL("https://xxx.xxx.xxx/xxx"); 可以使用url进行数据的解析
        // 也可使用文件对象,在这里我们对一个文本数据进行爬取 这个文本数据可以在本文中的 测试标签页面 看到哦!
        File file = new File("F:\\MyGithub\\StarSpider\\src\\main\\resources\\Test.html");
        // 获取到其中所有的 class 为 odd 的标签 下面的参数中 "attr" 代表的就是按照属性解析,"nodePath" 代表的是按照路径解析
        HTMLDocument[] parse = (HTMLDocument[]) StarSpider.parse(file, ConstantRegion.PARSER_NAME_HTML, "attr", "class", "odd");
        for (HTMLDocument container : parse) {
            // 获取到标签中的文本
            System.out.println(container.getChildrenText());
            // 获取到标签属性
            System.out.println(container.getAttribs());
            // 直接打印它的 html
            System.out.println(container.HTMLData);
            // 还可以继续解析到其内部的节点
            HTMLDocument[] tds = container.getAllChildrenByNodeName("td");
            // 为了方便 在这只打印第一个 td 的文本
            System.out.println(tds[0]);
            // 分割行 方便各位看哦
            System.out.println();
        }
    }
}

标签文本的解析

标签文本的典型例子就是HTML,针对这类文本的解析任务,可以使用label组件(LABELParser),具体使用方式如下所示

package io.github.beardedManZhao.starSpider;

import io.github.beardedManZhao.starSpider.container.LABELDocument;
import io.github.beardedManZhao.starSpider.parser.StarSpider;

import java.io.File;
import java.io.IOException;

/**
 * 测试用例类
 *
 * @author zhao
 */
public final class MAIN {
    public static void main(String[] args) throws IOException {
        // 构建需要爬取页面的URL
        // URL url = new URL("https://xxx.xxx.xxx/xxx"); 可以使用url进行数据的解析
        // 也可使用文件对象,在这里我们对一个文本数据进行爬取
        File file = new File("F:\\MyGithub\\StarSpider\\src\\main\\resources\\Test.html");
        // 使用星蛛解析组件,对file对象进行LABEL页面的解析(也可以对url进行解析) 按照节点路径 table > tbody
        // LABELDocument[] parses1 = (LABELDocument[]) StarSpider.parse(url, ConstantRegion.PARSER_NAME_LABEL, "nodePath", "table", "tbody");
        LABELDocument[] parses1 = (LABELDocument[]) StarSpider.parse(file, ConstantRegion.PARSER_NAME_LABEL, "nodePath", "table", "tbody");
        // 迭代每一个被解析到的节点文档对象
        for (LABELDocument labelDocument : parses1) {
            // 获取节点名称
            System.out.println(labelDocument.getName());
            // 获取节点数据
            System.out.println(labelDocument.getText());
            // 获取节点属性(id的值)
            System.out.println(labelDocument.getAttrib("id"));
            // 获取该节点下所有子节点的字符串数据(也可以获取到数组形式的数据)
            System.out.println(labelDocument.getChildrenText());
            System.out.println("+---------------------------------------------------------------------------------------+");
        }

        // 使用星蛛解析组件,对file对象进行LABEL页面的爬取 按照节点[tr]
        LABELDocument[] parses2 = (LABELDocument[]) StarSpider.parse(file, ConstantRegion.PARSER_NAME_LABEL, "node", "tr");
        // 迭代获取到的所有tr标签
        for (LABELDocument container : parses2) {
            // 将每一个tr标签以及标签子节点的数据以数组的形式获取到(也可以像上面一样使用getChildrenText直接获取字符串)
            String[] childrenTextArray = container.getChildrenTextArray(false);
            if (childrenTextArray.length >= 3) {
                System.out.println(
                        childrenTextArray[0] + "\t|\t" +
                                childrenTextArray[1] + "\t|\t" +
                                childrenTextArray[2] + "\t|\t"
                );
            }
        }
    }
}

HTML或XML属性的查找

在库中有一个组件HTMLParser是专用于提取HTML与XML这类数据的,它在label组件(LABELParser)的基础上拓展了一个新的功能,就是通过属性查找,它具有label组件的所有功能,同时为HTML
XML这两类文本的爬取进行了优化,使得该组件针对HTML与XML的爬取性能要好得多,为演示效果,准备好了这样的一份文件,文件内容如下所示。

<html lang="zh_CN">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<head>
    <title>测试标签页面</title>
</head>
<body>
<h1 id="StarSpider">StarSpider</h1>
<h2 id="介绍">介绍</h2>
<p>星蛛解析库是一款针对数据解析提供的库,其中内置诸多数据解析组件,支持对网络数据包,文件对象,以及字符串对象进行解析,是Java实现的一种数据解析手段,是可以实现爬虫,智能提取等需求的强悍工具。</p>
<h3 id="架构是什么样的">架构是什么样的?</h3>
<p>
    在框架中,用户直接与星蛛门户类(starSpider.parser.StarSpider)进行交互,通过该类,可对URL,FILE,String,三种对象进行内容提取与解析,用户可以根据自己的需求向星蛛解析函数中传递形参,实现不同效果。</p>
<p>星蛛门户会根据用户传递的形参,从哈希表中获取到对应的组件进行数据解析,并将组件解析结果对象直接通过星蛛门户类(starSpider.parser.StarSpider)
    返回给用户,用户可根据结果中的各类函数进行更多的操作,目前的结果对象有如下几种。</p>
<h4 id="结果对象的类型与作用">结果对象的类型与作用</h4>
<table id="table1">
    <colgroup>
        <col style="width: 31%"/>
        <col style="width: 27%"/>
        <col style="width: 31%"/>
        <col style="width: 10%"/>
    </colgroup>
    <thead>
    <tr class="header">
        <th>结果对象数据类型</th>
        <th>该结果类型对应的提取组件</th>
        <th>该结果类型的特有功能</th>
        <th>该结果类型的支持版本</th>
    </tr>
    </thead>
    <tbody id="tb-1">
    <tr class="odd">
        <td>io.github.beardedManZhao.starSpider.container.LABELDocument</td>
        <td>io.github.beardedManZhao.starSpider.parser.LABELParser</td>
        <td>面向标签节点进行数据提取操作</td>
        <td>v1.0</td>
    </tr>
    <tr class="even">
        <td>io.github.beardedManZhao.starSpider.container.HTMLDocument</td>
        <td>io.github.beardedManZhao.starSpider.parser.HTMLParser</td>
        <td>面向标签节点与节点属性进行数据提取操作,是LABEL结果对象的子类实现</td>
        <td>v1.0</td>
    </tr>
    <tr class="odd">
        <td>io.github.beardedManZhao.starSpider.container.ExpressionData</td>
        <td>io.github.beardedManZhao.starSpider.parser.MEParser</td>
        <td>面向每一个数学表达式进行数据提取操作</td>
        <td>v1.0</td>
    </tr>
    <tr class="even">
        <td>io.github.beardedManZhao.starSpider.container.StringData</td>
        <td>io.github.beardedManZhao.starSpider.parser.PatternParser</td>
        <td>面向每一个符合提取条件的字符串</td>
        <td>v1.0</td>
    </tr>
    </tbody>
</table>
<h4 id="解析组件的类型与作用">解析组件的类型与作用</h4>
<table id="table2" style="width:100%;">
    <colgroup>
        <col style="width: 11%"/>
        <col style="width: 20%"/>
        <col style="width: 19%"/>
        <col style="width: 10%"/>
        <col style="width: 4%"/>
        <col style="width: 29%"/>
        <col style="width: 4%"/>
    </colgroup>
    <thead>
    <tr class="header">
        <th>组件名称(常量区中的常量名)</th>
        <th>组件类型</th>
        <th>作者主页</th>
        <th>面向格式</th>
        <th>已注册至门户</th>
        <th>组件作用</th>
        <th>组件支持版本</th>
    </tr>
    </thead>
    <tbody>
    <tr class="odd">
        <td>NULL</td>
        <td>io.github.beardedManZhao.starSpider.parser.StarSpider</td>
        <td>https://github.com/BeardedManZhao</td>
        <td>URL, FILE, String</td>
        <td>NO</td>
        <td>与用户进行直接交互,根据用户的需求调整框架内部的结构并提交解析数据的任务</td>
        <td>v1.0</td>
    </tr>
    <tr class="even">
        <td>PARSER_NAME_LABEL</td>
        <td>io.github.beardedManZhao.starSpider.container.LABELDocument</td>
        <td>https://github.com/BeardedManZhao</td>
        <td>任何使用标签进行数据存储的文本内容</td>
        <td>YES</td>
        <td>提取与解析标签数据中的每一个节点</td>
        <td>v1.0</td>
    </tr>
    <tr class="odd">
        <td>PARSER_NAME_HTML</td>
        <td>io.github.beardedManZhao.starSpider.container.HTMLDocument</td>
        <td>https://github.com/BeardedManZhao</td>
        <td>HTML XML</td>
        <td>YES</td>
        <td>通过节点名称或节点属性,提取与解析HTML与XML中的每一个节点,并返回具有相对节点解析功能的结果对象</td>
        <td>v1.0</td>
    </tr>
    <tr class="even">
        <td>PARSER_NAME_REGEXP</td>
        <td>io.github.beardedManZhao.starSpider.parser.PatternParser</td>
        <td>https://github.com/BeardedManZhao</td>
        <td>String</td>
        <td>YES</td>
        <td>通过用户提供的正则表达式解析任意文本中的内容,提取出符合正则表达式的所有数据</td>
        <td>v1.0</td>
    </tr>
    <tr class="odd">
        <td>PARSER_NAME_ME</td>
        <td>io.github.beardedManZhao.starSpider.parser.MEParser</td>
        <td>https://github.com/BeardedManZhao</td>
        <td>String</td>
        <td>YES</td>
        <td>智能提取出所有数学表达式,并通过ME框架进行表达式计算,返回结果</td>
        <td>v1.0</td>
    </tr>
    <tr class="even">
        <td></td>
        <td></td>
        <td>Dear friends</td>
        <td></td>
        <td>NO</td>
        <td>事实上,我们希望有更多人可以将自己的实现提供给我们,由各位亲自将自己的组件接入至星蛛门户</td>
        <td></td>
    </tr>
    </tbody>
</table>
<h2 id="有哪些功能">有哪些功能?</h2>
<p>在星蛛门户中,用户可以直接通过parse函数设置参数与解析对象,进而获取到解析结果,在库中的解析工作由解析器进行,解析器的实现有很多,每一个注册到星蛛的组件都可以使用门户访问到,接下来就展示下更多的信息。</p>
<h3 id="标签文本的解析">标签文本的解析</h3>
<h3 id="html或xml属性的查找">HTML或XML属性的查找</h3>
<h3 id="数学表达式的提取">数学表达式的提取</h3>
<h3 id="正则表达式的匹配">正则表达式的匹配</h3>
</body>
</html>

其中有两个表,表标签中有一个id属性,两张表的id属性不同,现在我们想要获取到第二张表的节点对象,具体操作方式如下所示(展示的是通过属性获取,通过节点获取的方式与LABELParser是一样的)。

package io.github.beardedManZhao.starSpider;

import io.github.beardedManZhao.starSpider.container.HTMLDocument;
import io.github.beardedManZhao.starSpider.parser.StarSpider;

import java.io.File;
import java.io.IOException;

/**
 * 测试用例类
 *
 * @author zhao
 */
public final class MAIN {
    public static void main(String[] args) throws IOException {
        // 构建需要爬取页面的URL
        // URL url = new URL("https://xxx.xxx.xxx/xxx"); 可以使用url进行数据的解析
        // 也可使用文件对象,在这里我们对一个文本数据进行爬取
        File file = new File("F:\\MyGitHub\\StarSpider\\src\\main\\resources\\Test.html");
        // 使用星蛛库将文件中 id 属性为 table2 的文件数据提取出来
        HTMLDocument[] parse = (HTMLDocument[]) StarSpider.parse(file, ConstantRegion.PARSER_NAME_HTML, "attr", "id", "table2");
        // 获取到当前节点下的所有tr标签
        for (HTMLDocument htmlDocument : parse[0].getAllChildrenByNodeName("tr")) {
            // 打印tr 标签的数据
            System.out.println(htmlDocument.getChildrenText());
            // 还可以按照属性或标签名字继续获取 tr 下面的节点数据
            HTMLDocument[] tds = htmlDocument.getAllChildrenByNodeName("td");
            System.out.printf("当前节点下面还有 %d 个 td 标签%n", tds.length);
            // 下面是按照属性的
            HTMLDocument[] allChildrenByNodeAttrib = htmlDocument.getAllChildrenByNodeAttrib("class", "td1");
            System.out.printf("当前节点下面还有 %d 个 class属性为td1 的标签%n%n", allChildrenByNodeAttrib.length);
        }
    }
}
  • 提取结果
组件名称(常量区中的常量名)	组件类型	作者主页	面向格式	已注册至门户	组件作用	组件支持版本	
NULL	io.github.beardedManZhao.starSpider.parser.StarSpider	https://github.com/BeardedManZhao	URL, FILE, String	NO	与用户进行直接交互,根据用户的需求调整框架内部的结构并提交解析数据的任务	v1.0	
PARSER_NAME_LABEL	io.github.beardedManZhao.starSpider.container.LABELDocument	https://github.com/BeardedManZhao	任何使用标签进行数据存储的文本内容	YES	提取与解析标签数据中的每一个节点	v1.0	
PARSER_NAME_HTML	io.github.beardedManZhao.starSpider.container.HTMLDocument	https://github.com/BeardedManZhao	HTML XML	YES	通过节点名称或节点属性,提取与解析HTML与XML中的每一个节点,并返回具有相对节点解析功能的结果对象	v1.0	
PARSER_NAME_REGEXP	io.github.beardedManZhao.starSpider.parser.PatternParser	https://github.com/BeardedManZhao	String	YES	通过用户提供的正则表达式解析任意文本中的内容,提取出符合正则表达式的所有数据	v1.0	
PARSER_NAME_ME	io.github.beardedManZhao.starSpider.parser.MEParser	https://github.com/BeardedManZhao	String	YES	智能提取出所有数学表达式,并通过ME框架进行表达式计算,返回结果	v1.0	
…	…	Dear friends	…	NO	事实上,我们希望有更多人可以将自己的实现提供给我们,由各位亲自将自己的组件接入至星蛛门户	…	

数学表达式的提取

针对一段包含数学表达式的混乱无格式的数据,库中有一个组件(parser.io.github.beardedManZhao.starSpider.MEParser)可以提取出所有的数学表达式,并根据用户传递的参数来判断是否需要计算出结果,接下来就是该组件的使用演示(在这里直接爬取百度百科一个页面中的所有数学表达式)。

package io.github.beardedManZhao.starSpider;
import io.github.beardedManZhao.starSpider.container.ExpressionData;
import io.github.beardedManZhao.starSpider.parser.StarSpider;

import java.io.IOException;
import java.net.URL;

/**
 * 测试用例类
 *
 * @author zhao
 */
public final class MAIN {
    public static void main(String[] args) throws IOException {
        // 构建需要解析的url,这里是百度百科的网站页面
        URL url1 = new URL("https://baike.baidu.com/item/%E8%A1%A8%E8%BE%BE%E5%BC%8F/7655228");
        // 使用星蛛组件,对url对象进行数学表达式的智能提取与计算,这里指定使用的解析组件为ME(表达式解析组件)以及计算模式(brackets)
        ExpressionData[] parse = (ExpressionData[]) StarSpider.parse(url1, ConstantRegion.PARSER_NAME_ME, "brackets");
        for (ExpressionData expressionData : parse) {
            System.out.println("提取到表达式【" + expressionData.getName() + "】 = " + expressionData.getText());
        }
    }
}

正则表达式的匹配

用户如果想要使用正则表达式提取数据,库中也有一个组件支持用户进行这样的操作,接下来就是该组件的使用演示。

package io.github.beardedManZhao.starSpider;

import io.github.beardedManZhao.starSpider.container.Container;
import io.github.beardedManZhao.starSpider.parser.StarSpider;

/**
 * 测试用例类
 *
 * @author zhao
 */
public final class MAIN {
    public static void main(String[] args) {
        // 提取出一个字符串中所有的数值
        Container[] regulars = StarSpider.parse(
                "zhaodsandjsaklfdhajkndfjsdhfaudSUD123HDUSIFCNDJNJDKS678DJSKAF2341233HDSD",
                "regular", "\\d+"
        );
        for (Container regular : regulars) {
            System.out.println(regular.getText());
        }
    }
}
  • 打印结果
123
678
2341233

Json字符串的解析

在门户中,同样存在着Json解析器被注册,它非常适用于Json文件的解析,在本框架中,将fastJson
作为FastJsonDocument的底层实现,FastJsonDocument遵循fastJson的JSONObject类的操作方式,使得具有FastJson经验的用户在使用FastJsonDocument的时候能够快速上手,接下来就是有关FastJsonDocument的一些操作示例。

package io.github.beardedManZhao.starSpider;

import io.github.beardedManZhao.starSpider.container.FastJsonDocument;
import io.github.beardedManZhao.starSpider.parser.StarSpider;

import java.io.File;
import java.io.IOException;

/**
 * 测试用例类
 *
 * @author zhao
 */
public final class MAIN {
    public static void main(String[] args) throws IOException {
        File file = new File("F:\\MyGitHub\\StarSpider\\src\\main\\resources\\testJson.json");
        // 获取到json 文件中的data1与two,并以json格式解析它
        // 返回解析到的结果,这里是data1的结果对象与two组成的数组
        FastJsonDocument[] parse = (FastJsonDocument[]) StarSpider.parse(file, ConstantRegion.PARSER_NAME_FASTJSON, "json", "data1", "two");
        for (FastJsonDocument container : parse) {
            // 在这里就是针对每一个FastJsonDocument的获取数据操作,其中的函数风格符合JSONObject,减少学习成本
            if (container.isJObject) {
                // 如果当前节点返回的是一个jsonObject,就可以使用JSONObject风格的函数
                System.out.println(container.getName() + '\t' + container.getText() + '\t' + container.getString("key1"));
            } else {
                // 如果当前节点返回的不是一个jsonObject,那么就不可以进行JSONObject的函数调用
                // 但基础函数还是可以调用的,例如获取节点名称和节点数据等操作
                System.out.println(container.getName() + '\t' + container.getText());
            }
        }
    }
}
  • 打印结果
data1	{"key1":"value1年后suiadhs468237&*……&*","key2":"value2","key3":"value3","key4":"value4","key5":"value5","key6":"value6"}	value1年后suiadhs468237&*……&*
two     {"data1":{"key1":[1,2,3,4,5],"key2":"value2","key3":"value3","key4":"value4","key5":"value5","key6":"value6"}}	                null

sql 语句的解析

package io.github.beardedManZhao.starSpider;

import io.github.beardedManZhao.starSpider.container.SQLStringData;
import io.github.beardedManZhao.starSpider.parser.StarSpider;

/**
 * 测试用例类
 *
 * @author zhao
 */
public final class MAIN {
    public static void main(String[] args) {
        System.out.println("版本:" + StarSpider.VERSION);
        // 准备一个需要被解析的 sql 脚本
        String data = "alter table zhao1 add test varchar(20);\n" +
                "alter table zhao1 drop test;\n" +
                "# 重命名列字段\n" +
                "alter table zhao1 change age age1 int;\n" +
                "# 重命名表名称\n" +
                "alter table zhao1 rename zhao;\n" +
                "# 加索引\n" +
                "alter table zhao add index indexName (name, age1);\n" +
                "# 加主键索引\n" +
                "alter table zhao add primary key (name);\n" +
                "# 加唯一索引\n" +
                "alter table zhao add unique (name);\n" +
                "\n" +
                "create table zhao2 \n" +
                "as \n" +
                "select * from student join achievement join (select * from zhao) join zhao1231;\n" +
                "hasiod;\n" +
                "\n" +
                "select * from zhao;";
        // 使用 PARSER_NAME_SQL_STRING_INFO 解析出 alter 的语句
        SQLStringData[] alters = (SQLStringData[]) StarSpider.parse(data, ConstantRegion.PARSER_NAME_SQL_STRING_INFO, "alter");
        for (SQLStringData alter : alters) {
            // alter 就是解析出来的语句对象包装类
            // 在这里我们简单的将所有 alter 的语句打印了出来
            System.out.println(alter.getStatement().getSqlStr());
        }
    }
}

更新日志

1.1 版本更新于 2025-01-26

  • 为了避免包名冲突,将包名改为了 io.github.beardedManZhao.starSpider
  • 修复了 io.github.beardedManZhao.starSpider.parser.HTMLParser 中使用属性获取只能获取到第一个数据的问题
  • 支持通过 FileReader 获取到需要被爬取的文本数据!
  • 对于 htmlDocument.getAllChildrenBy* 这类方法,进行了缓存,从而减少不必要的解析开销!
  • 优化了代码

更多信息

感谢各位的使用,库中的解析组件将会随时时间的流动而不断优化,如果各位想要将自己实现的组件注册到星蛛中,请将与您项目有关的一些信息发送到邮箱Liming7887@qq.com中,事实上我们很期待将您的实现加入到门户中。


  • date: 2023-12-27
  • 切换至 English document

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2294897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命

目录 一、DeepSeek-R1 势不可挡二、DeepSeek-R1 卓越之处三、DeepSeek-R1 创新设计四、DeepSeek-R1 进化之路1. 强化学习RL代替监督微调学习SFL2. Aha Moment “啊哈”时刻3. 蒸馏版本仅采用SFT4. 未来研究计划 部分内容有拓展&#xff0c;部分内容有删除&#xff0c;与原文会有…

动态规划LeetCode-121.买卖股票的最佳时机1

给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…

#渗透测试#批量漏洞挖掘#微商城系统 goods SQL注入漏洞

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

import { Component, Vue, Prop, Watch } from ‘vue-property-decorator‘

文章目录 导入部分的解释总结Vue 3 的推荐替代方案总结 你提供的代码片段是使用 vue-property-decorator 库的示例&#xff0c;这是一个第三方库&#xff0c;它提供了 Vue 组件的装饰器&#xff0c;使得编写类风格的 Vue 组件更加方便。以下是对代码中每个部分的详细解释&…

X Window System 架构概述

X Window System 架构概述 1. X Server 与 X Client ​ 这里引入一张维基百科的图&#xff0c;在Linux系统中&#xff0c;若用户需要图形化界面&#xff0c;则可以使用X Window System&#xff0c;其使用**Client-Server**架构&#xff0c;并通过网络传输相关信息。 ​ ​ X…

【ArcGIS Pro 简介1】

ArcGIS Pro 是由 Esri &#xff08;Environmental Systems Research Institute&#xff09;公司开发的下一代桌面地理信息系统&#xff08;GIS&#xff09;软件&#xff0c;是传统 ArcMap 的现代化替代产品。它结合了强大的空间分析能力、直观的用户界面和先进的三维可视化技术…

启明星辰发布MAF大模型应用防火墙产品,提升DeepSeek类企业用户安全

2月7日&#xff0c;启明星辰面向DeepSeek等企业级大模型业务服务者提供的安全防护产品——天清MAF&#xff08;Model Application Firewall&#xff09;大模型应用防火墙产品正式发布。 一个新赛道将被开启…… DeepSeek的低成本引爆赛道规模 随着DeepSeek成为当前最热的现象级…

小米AI眼镜官微上线,将与小米15 Ultra同台亮相,近屿智能用心培育 AI 人才

近日&#xff0c;小米眼镜官微已正式上线&#xff0c;认证主体为小米通讯技术有限公司。据悉&#xff0c;小米AI眼镜已获得入网许可&#xff0c;并计划提前至2月发布&#xff0c;与小米15 Ultra同台亮相。 此前&#xff0c;小米AI眼镜原定于2025年3月至4月发布。早在去年&#…

Mac下使用brew安装go 以及遇到的问题

首先按照网上找到的命令进行安装 brew install go 打开终端输入go version&#xff0c;查看安装的go版本 go version 配置环境变量 查看go的环境变量配置&#xff1a; go env 事实上安装好后的go已经可以使用了。 在home/go下新建src/hello目录&#xff0c;在该目录中新建…

在rtthread中,scons构建时,它是怎么知道是从rtconfig.h找宏定义,而不是从其他头文件找?

在rtthread源码中&#xff0c;每一个bsp芯片板级目录下都有一个 SConstruct scons构建脚本的入口&#xff0c; 在这里把rtthread tools/目录下的所有模块都添加到了系统路径中&#xff1a; 在tools下所有模块中&#xff0c;最重要的是building.py模块&#xff0c;在此脚本里面…

Unity游戏(Assault空对地打击)开发(7) 爆炸效果

效果 准备 首先请手搓一个敌军基地。 然后添加一个火焰特效插件或者自建。 爆炸脚本编写 新建一个脚本命名为Explode。 无需挂载到对象上。 首先是全部代码。 using System.Collections; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine…

嵌入式面试题 C/C++常见面试题整理_7

一.什么函数不能声明为虚函数? 常见的不能声明为虚函数的有:普通函数(非成员函数):静态成员函数;内联成员函数;构造函数;友元函数。 1.为什么C不支持普通函数为虚函数?普通函数(非成员函数)只能被overload&#xff0c;不能被override&#xff0c;声明为虚函数也没有什么意思…

excel实用问题:提取文字当中的数字进行运算

0、前言&#xff1a; 这里汇总在使用excel工作过程中遇到的问题&#xff0c;excel使用wps版本&#xff0c;小规模数据我们自己提取数据可行&#xff0c;大规模数据就有些难受了&#xff0c;因此就产生了如下处理办法。 需求&#xff1a;需要把所有文字当中的数字提取出来&…

【prompt实战】AI +OCR技术结合ChatGPT能力项目实践(BOL提单识别提取专家)

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 1. 需求背景 2. 目标 3. BOL通用处理逻辑…

昇思打卡营第五期(MindNLP特辑)番外:硅基流动 x 华为云DeepSeek V3 API推理MindTinyRAG

1.前言 前脚&#xff0c;DeepSeek面临的巨头企业官宣加入vs多国政府下场质疑的冰火两重天局势尚未平静&#xff08;DeepSeek在美两重天&#xff1a;五大巨头接入&#xff0c;政府诚惶诚恐&#xff09;&#xff1b;后脚&#xff0c;OpenAI被逼急&#xff0c;凌晨亮出全新推理…

DeepSeek R1 Distill Llama 70B(免费版)API使用详解

DeepSeek R1 Distill Llama 70B&#xff08;免费版&#xff09;API使用详解 在人工智能领域&#xff0c;随着技术的不断进步&#xff0c;各种新的模型和应用如雨后春笋般涌现。今天&#xff0c;我们要为大家介绍的是OpenRouter平台上提供的DeepSeek R1 Distill Llama 70B&…

LabVIEW与PLC交互

一、写法 写命令立即读出 写命令后立即读出&#xff0c;在同一时间不能有多个地方写入&#xff0c;因此需要在整个写入后读出过程加锁 项目中会存在多个循环并行执行该VI&#xff0c;轮询PLC指令 在锁内耗时&#xff0c;就是TCP读写的实际耗时为5-8ms&#xff0c;在主VI六个…

Selenium记录RPA初阶 - 基本输入元件

防止自己遗忘&#xff0c;故作此为记录。 爬取网页基本元件并修改后爬取。 包含元件&#xff1a; elements: dict[str, str] {"username": None,"password": None,"email": None,"website": None,"date": None,"ti…

第三个Qt开发实例:利用之前已经开发好的LED驱动在Qt生成的界面中控制LED2的亮和灭

前言 上一篇博文 https://blog.csdn.net/wenhao_ir/article/details/145459006 中&#xff0c;我们是直接利用GPIO子系统控制了LED2的亮和灭&#xff0c;这篇博文中我们利用之前写好的LED驱动程序在Qt的生成的界面中控制LED2的亮和灭。 之前已经在下面两篇博文中实现了LED驱动…

Android studio 创建aar包给Unity使用

1、aar 是什么&#xff1f; 和 Jar有什么区别 aar 和 jar包 都是压缩包&#xff0c;可以使用压缩软件打开 jar包 用于封装 Java 类及其相关资源 aar 文件是专门为 Android 平台设计的 &#xff0c;可以包含Android的专有内容&#xff0c;比如AndroidManifest.xml 文件 &#…