基于Java的XxlCrawler网络信息爬取实战-以中国地震台网为例

目录

前言

一、信息网站介绍

1、网站介绍

2、 地震历史信息

3、 历史信息接口分析

二、XxlCrawler组件

1、关于XxlCrawler

2、核心概念介绍

三、实际信息爬取

1、新建maven项目

     2、新建model层对象

3、实际爬取

总结


前言

        如今,只要谈起网络信息爬取也就是爬虫,相信绝大多数人的第一反应就是Python。确实Python在信息爬取方面资料很多,内容很丰富,同时案例也很丰富。爬虫技术是一门有一定门槛的技术。而在网络请求当中,不管是出于攻方或者是守方。有一句话是,你站在桥上看风景,看风景的人站在楼上看你。在获取信息和作为信息源头提供信息,如今都已经家常便饭,习以为常。你可以使用熟悉的语言和技术栈来实现爬虫,去爬取相应的知识,但是要用于正当目的。

        在之前的博客当中,我们介绍了一些地震相关的博客,想把地震种类的地质灾害作为GIS的时空数据源来和人类活动轨迹和生活范围进行关联分析,为人类提供安全保障,为较少财产损失贡献自己的力量。为了对地震有更多的认识,我们需要将地震信息进行详细的搜集。通过长时序的地震信息搜集,为进一步的数据挖掘提供坚实的数据基础。由此,我们需要从中国地震台网挖掘。楼主采用熟悉的java技术栈,通过java语言去获取中国地震台网的信息。

        本文将主要讲解使用Java语言结合XxlCrawler框架进行信息的抓取。首先讲解目标网站的相关信息,分析内容和需要抓取的链接地址,URL的构造,然后介绍XxlCrawler这个组件的相关使用情况,最后使用代码进行实际信息抓取的开发。方便大家对如何使用Java和XxlCrawler来实现信息爬取有一定的参考和指导。

一、信息网站介绍

        本节对中国地震台网进行简要介绍。

1、网站介绍

        CEIC.ac.cn是在中国地震台网中心资助科研项目的研究成果,它于2006年1月上线运行,之后陆续完善。根据中国 地震局监测预报司的要求(2008年第168号文件),网站从现在起用于地震信息及其相关数据产品的发布,根据要求,新 版网站于2009年5月起正式运行。中国地震台网中心于2004年10月18日成立,它是中国地震局直属事业单位,是我国防震减灾工作的重要业务枢纽、 核心技术平台和基础信息国际交流的重要窗口。中国地震台网中心承担着全国地震监测、地震中短期预测和地震速报;国 务院抗震救灾指挥部应急响应和指挥决策技术系统的建设和运行;全国各级地震台网的业务指导和管理;各类地震监测数 据的汇集、处理与服务。

2、 地震历史信息

        在地震历史中可以查询到近10年的地震信息,可以在官方网站中打开历史查询tab页。默认不输入任何条件,查询近期的地震信息。界面如下所示:

        这就是地震信息,我们如果想要得到这信息,也就是根据接口把相应的历史信息取到即可。下面来看一下系统是怎么获取到这些信息的。

3、 历史信息接口分析

        在上面的网页中,来看一下具体的信息获取接口。在谷歌浏览器中打开检查选项。

        可以很清楚的看到,点击查询按钮之后。它的网络接口是:

https://www.ceic.ac.cn/ajax/search?page=1&&start=&&end=&&jingdu1=&&jingdu2=&&weidu1=&&weidu2=&&height1=&&height2=&&zhenji1=&&zhenji2=&&callback=jQuery180015104370237141462_1713018372132&_=1713018820900

         在这个接口中,有一个page的页数控制,通过这个参数来进行分页。因此我们只需要在请求中模拟页数的传递即可获取相应的数据。

        将上述的地址复制到浏览器中,可以看到以下的返回响应数据。

        数据的主要信息包含以下:

 

AUTO_FLAG: "M"
CATA_ID: "CD20240413222636.00"
CATA_TYPE: ""
EPI_DEPTH: 9
EPI_LAT: "24.05"
EPI_LON: "121.60"
EQ_CATA_TYPE: ""
EQ_TYPE: "M"
IS_DEL: ""
LOCATION_C: "台湾花莲县"
LOCATION_S: ""
LOC_STN: "0"
M: "4.2"
M_MB: "0"
M_MB2: "0"
M_ML: "0"
M_MS: "0"
M_MS7: "0"
NEW_DID: "CD20240413222636"
O_TIME: "2024-04-13 22:26:35"
O_TIME_FRA: "0"
SAVE_TIME: "2024-04-13 22:35:56"
SUM_STN: "0"
SYNC_TIME: "2024-04-13 22:35:56"
id: "46396"

        其主要的信息包括num即数据总页数,是按照每页20条数据来展示的,还有page分页条,对于数据爬取,分页条信息不是最重要的,最重要是shuju,在接口中以shuju字段来返回。以上信息非常重要,在后续的信息爬取过程当中很重要。

二、XxlCrawler组件

        本小节将重点介绍一个信息爬取框架XxlCrawler,通过这个框架来爬取相关信息。关于XxlCrawler,在其官网网站上有一定的介绍,这里不做很深入的介绍。

1、关于XxlCrawler

         XXL-CRAWLER 是一个分布式爬虫框架。一行代码开发一个分布式爬虫,拥有”多线程、异步、IP动态代理、分布式、JS渲染”等特性;这是一位技术功底很深厚的专家贡献的开源框架。xxl-crawler。除了信息爬取框架,还有其它很有用的组件。下面是它的核心架构图:

        XXL-CRAWLER 是一个分布式Web爬虫框架。采用模块化设计,各个模块可灵活进行自定义和扩展。借助 XXL-CRAWLER,一行代码开发一个分布式爬虫。大家在使用过程当中,要自己进行合理的扩展,根据自己的业务来进行编码才能开发出符合要求的。

2、核心概念介绍

概念说明
XxlCrawler爬虫对象,维护爬虫信息
PageVo页面数据对象,一张Web页面可抽取一个或多个PageVo
PageLoaderWed页面加载器,负责加载页面数据,支持灵活的自定义和扩展
PageParserWed页面解析器,绑定泛型PageVO后将会自动抽取页面数据对象,同时支持运行时调整请求参数信息;

        NonPageParser : 非Web页面解析器,如JSON接口等,直接输出响应数据。比如这里的地震信息查询接口返回的就是json的数据格式。

        XxlCrawler的属性

方法说明
setUrls待爬的URL列表
setAllowSpread允许扩散爬取,将会以现有URL为起点扩散爬取整站
setWhiteUrlRegexsURL白名单正则,非空时进行URL白名单过滤页面
setIfPost请求方式:true=POST请求、false=GET请求
setUserAgentUserAgent
setParamMap请求参数
setCookieMap请求Cookie
setTimeoutMillis超时时间,毫秒
setPauseMillis停顿时间,爬虫线程处理完页面之后进行主动停顿,避免过于频繁被拦截;
setProxyMaker代理生成器,支持设置代理IP,同时支持调整代理池实现动态代理;
setThreadCount爬虫并发线程数
setPageParser页面解析器
setPageLoader页面加载器,默认提供 “JsoupPageParser” 和 “HtmlUnitPageLoader” 两种实现;
setRunData设置运行时数据模型,默认提供LocalRunData单机模型,支持扩展实现分布式模型;
start运行爬虫,可通过入参控制同步或异步方式运行
stop终止爬虫

三、实际信息爬取

        本节将重点讲述如何使用java语言基于XxlCrawler进行信息抓取的开发。首先讲解XxlCrawler来进行信息的获取,然后讲解如何将json数据转换成javaBean,不管以后用来存为Excel或者入库,比如保存到关系型数据库,都是需要采用JavaBean的。

1、新建maven项目

        首先,新建一个maven项目,在pom.xml中引入相关的资源,首先便是XxlCrawler,然后是json处理工具,这里使用Gson,最后为了简化对象的get和set操作,使用lombok来进行对象简化。pom.xml的关键代码如下所示:   

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yelang</groupId><artifactId>xxl-crawler-demo</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-crawler</artifactId><version>1.3.0</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version><scope>provided</scope></dependency></dependencies>
</project>

     2、新建model层对象

        model层对象对应是javaBean,主要包含两个对象,第一个是大的对象,包含num和shuju的定义。由于shuju是一个数组,因此再定义一个信息对象来接收数组的值。两个类的具体代码如下:

package com.yelang.entity;
import java.io.Serializable;
import java.math.BigDecimal;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class Earthquake implements Serializable {private static final long serialVersionUID = -1212153879708670015L;private String AUTO_FLAG;private String CATA_ID;private String CATA_TYPE;private BigDecimal EPI_DEPTH = new BigDecimal("0");private String EPI_LAT;private String EPI_LON;private String EQ_CATA_TYPE;private String EQ_TYPE;private String IS_DEL;private String LOCATION_C;private String LOCATION_S;private String LOC_STN;private String M;private String M_MB;private String M_MB2;private String M_ML;private String M_MS;private String M_MS7;private String NEW_DID;private String O_TIME;private String O_TIME_FRA;private String SAVE_TIME;private String SUM_STN;private String SYNC_TIME;private String id;public Earthquake(String aUTO_FLAG, String cATA_ID, String cATA_TYPE, BigDecimal ePI_DEPTH, String ePI_LAT,String ePI_LON, String eQ_CATA_TYPE, String eQ_TYPE, String iS_DEL, String lOCATION_C, String lOCATION_S,String lOC_STN, String m, String m_MB, String m_MB2, String m_ML, String m_MS, String m_MS7, String nEW_DID,String o_TIME, String o_TIME_FRA, String sAVE_TIME, String sUM_STN, String sYNC_TIME, String id) {super();AUTO_FLAG = aUTO_FLAG;CATA_ID = cATA_ID;CATA_TYPE = cATA_TYPE;EPI_DEPTH = ePI_DEPTH;EPI_LAT = ePI_LAT;EPI_LON = ePI_LON;EQ_CATA_TYPE = eQ_CATA_TYPE;EQ_TYPE = eQ_TYPE;IS_DEL = iS_DEL;LOCATION_C = lOCATION_C;LOCATION_S = lOCATION_S;LOC_STN = lOC_STN;M = m;M_MB = m_MB;M_MB2 = m_MB2;M_ML = m_ML;M_MS = m_MS;M_MS7 = m_MS7;NEW_DID = nEW_DID;O_TIME = o_TIME;O_TIME_FRA = o_TIME_FRA;SAVE_TIME = sAVE_TIME;SUM_STN = sUM_STN;SYNC_TIME = sYNC_TIME;this.id = id;}public Earthquake() {super();}
}
package com.yelang.entity;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class EarthquakeCrawler implements Serializable {private static final long serialVersionUID = 2968933968732310138L;private Integer num;private List<Earthquake> shuju;public EarthquakeCrawler(Integer num, List<Earthquake> shuju) {super();this.num = num;this.shuju = shuju;}public EarthquakeCrawler() {super();}
}

3、实际爬取

package com.yelang.test;
import java.util.Random;
import org.jsoup.internal.StringUtil;
import com.google.gson.Gson;
import com.xuxueli.crawler.XxlCrawler;
import com.xuxueli.crawler.parser.strategy.NonPageParser;
import com.yelang.entity.Earthquake;
import com.yelang.entity.EarthquakeCrawler;
public class CeicCrawlerCase {public static void main(String[] args) {String commonUrl = "https://www.ceic.ac.cn/ajax/search?start=&&end=&&jingdu1=&&jingdu2=&&weidu1=&&weidu2=&&height1=&&height2=&&zhenji1=&&zhenji2=&_="+ System.currentTimeMillis();String[] urlList = new String[1];urlList[0] = commonUrl + "&&page=" + 1;// 构造爬虫XxlCrawler crawler = new XxlCrawler.Builder().setUrls(urlList).setThreadCount(3).setPauseMillis(3000).setUserAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36").setIfPost(false).setFailRetryCount(3)// 重试三次.setPageParser(new NonPageParser() {public void parse(String url, String pageSource) {if (!StringUtil.isBlank(pageSource)) {pageSource = pageSource.substring(1, pageSource.length() - 1);Gson gson = new Gson();EarthquakeCrawler crawler = gson.fromJson(pageSource, EarthquakeCrawler.class);System.out.println("总页数:"+crawler.getNum());for (Earthquake data : crawler.getShuju()) {System.out.println(data);}}}}).build();crawler.start(true);// 启动}
}

        这里仅演示效果,请大家不要大量的请求台网,合理设置信息的获取频次。上面的代码运行之后,可以在控制台看到以下的信息,即表示成功的获取历史地震信息,同时将字符串转换成了JavaBean。至此,一个使用java开发的信息抓取程序开发完毕。

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details
618
Earthquake(AUTO_FLAG=M, CATA_ID=CC20240324042204.00, CATA_TYPE=, EPI_DEPTH=30, EPI_LAT=-4.15, EPI_LON=143.10, EQ_CATA_TYPE=, EQ_TYPE=M, IS_DEL=, LOCATION_C=巴布亚新几内亚, LOCATION_S=, LOC_STN=0, M=6.9, M_MB=0, M_MB2=0, M_ML=0, M_MS=0, M_MS7=0, NEW_DID=CC20240324042204, O_TIME=2024-03-24 04:22:04, O_TIME_FRA=0, SAVE_TIME=2024-03-24 04:46:33, SUM_STN=0, SYNC_TIME=2024-03-24 04:46:33, id=46219)
Earthquake(AUTO_FLAG=M, CATA_ID=CC20240323212028.00, CATA_TYPE=, EPI_DEPTH=60, EPI_LAT=-4.65, EPI_LON=102.70, EQ_CATA_TYPE=, EQ_TYPE=M, IS_DEL=, LOCATION_C=印尼苏门答腊岛南部海域, LOCATION_S=, LOC_STN=0, M=5.3, M_MB=0, M_MB2=0, M_ML=0, M_MS=0, M_MS7=0, NEW_DID=CC20240323212028, O_TIME=2024-03-23 21:20:28, O_TIME_FRA=0, SAVE_TIME=2024-03-23 21:46:17, SUM_STN=0, SYNC_TIME=2024-03-23 21:46:16, id=46218)

总结

        以上就是本文的主要内容,本文将主要讲解使用Java语言结合XxlCrawler框架进行信息的抓取。首先讲解目标网站的相关信息,分析内容和需要抓取的链接地址,URL的构造,然后介绍XxlCrawler这个组件的相关使用情况,最后使用代码进行实际信息抓取的开发。通过本文,相信大家对XxlCrawler有了更深入的了解。示例代码供参考,请朋友合理使用资源。行文仓促,定有不足之处,环境大家批评指正。

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

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

相关文章

TCP/IP协议—HTTP

TCP/IP协议—HTTP HTTP协议HTTP通讯特点HTTP通讯流程 HTTP请求报文请求方法 HTTP应答报文状态码 HTTP协议 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一种请求-响应的协议&#xff0c;用户可以通过HTTP向服务器上传、下载数据。HT…

Java调用WebServices接口

当拿到一个WebServices接口时&#xff0c;首先用接口测试工具调用一下接口&#xff0c;看是否可以正常发送请求和获取返回接口&#xff0c;确保接口是没有问题的&#xff0c;可以用SoapUI工具进行测试。 下面以一个免费的天气预报接口为例&#xff0c;记录整个接口的调用过程。…

初学python记录:力扣2007. 从双倍数组中还原原数组

题目&#xff1a; 一个整数数组 original 可以转变成一个 双倍 数组 changed &#xff0c;转变方式为将 original 中每个元素 值乘以 2 加入数组中&#xff0c;然后将所有元素 随机打乱 。 给你一个数组 changed &#xff0c;如果 change 是 双倍 数组&#xff0c;那么请你返…

如何解决PPT中获取加载项是灰色的,无法链接到Power BI的问题?

问题描述&#xff1a; 最近有朋友留言询问:“在尝试之前我发布的如何在PPT中展示Power BI报告的操作步骤的时候&#xff0c;想要在PPT中展示Power BI报告&#xff1f;只需这样做&#xff01; (qq.com) 碰到在PowerPoint中【获取加载项选项】是灰色&#xff0c;无法链加载Powe…

【数据库】Oracle11g与Oceanbase3.2.3对比

一、数据库体系结构对比 数据库的体系结构是从某一个角度来分析和考察数据库的组成、工作过程与原理&#xff0c;以及数据在数据库中的组织与管理机制。 Oracle11g作为传统关系数据库的代表、Oceanbase作为分布式关系数据库的代表&#xff0c;体系结构上的设计差别很大。 &a…

【NLP】大语言模型基础之Transformer结构

大语言模型基础之Transformer结构 1. Transformer结构总览2. 嵌入表示层2. 注意力层3. 前馈层4. 残差连接与层归一化5. 编码器和解码器结构参考文献 Transformer是一种深度学习模型架构&#xff0c;由Vaswani等人于2017年在论文《Attention is All You Need》中首次提出。它在自…

【练习】二分查找思想

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 二分查找算法介绍 1.二分查找 题目描述 讲解 ​编辑 代码实现 2.…

STM32应用开发——BH1750光照传感器详解

STM32应用开发——BH1750光照传感器详解 目录 STM32应用开发——BH1750光照传感器详解前言1 硬件介绍1.1 BH1750简介1.2 硬件接线 2 软件编程2.1 软件原理2.1.1 IIC设备地址2.1.2 IIC读写2.1.3 BH1750指令集2.1.4 BH1750工作流程2.1.5 BH1750测量模式 2.2 测试代码2.3 运行测试…

【剪映专业版】10时间线工具:主轨磁吸、自动吸附、联动、预览轴、全局缩放预览

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 主轨&#xff1a;有封面标志的轨道才是主轨。 主轨磁吸&#xff1a;开启后&#xff0c;在主轨上移动素材&#xff0c;自动向前磁吸&#xff0c;在其他轨道上移动无此效果&#xff1b;关闭后&#xff0c;不自动向前磁吸&…

6个步骤轻松实现Postman接口压力测试(建议收藏)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 这里讲是postman做接口并发测试&#xff0c;基础用法不做…

这些年背过的面试题--MySQL篇

MySQL一直是面试中的热点问题&#xff0c;也难道了很多的面试者。其实MySQL没那么难&#xff0c;只是大家没有系统化、实战性的过去学习、总结。同时很多开发者在实际的开发过程中也很少去接触一些偏向底层的知识。 本手册&#xff0c;已总结成完整的PDF文档。想获取该文档&am…

opencv的cmake报错

opencv编译报错 CMakeDownloadLog.txt #use_cache "D:/opencv/.cache" #do_unpack "ippicv_2021.8_win_intel64_20230330_general.zip" "71e4f58de939f0348ec7fb58ffb17dbf" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/1…

遇事不决 量子力学?

文章目录 引入量子力学产生的必然性量子力学名称的由来粒子&#xff1f;波&#xff1f;波粒二象性测不准原理 &#xff08;不确定原理&#xff09;叠加态原理 量子纠缠态叠加量子纠缠量子纠缠实验 逻辑判断&#xff0c;量子力学到底完善吗观测量子纠缠&#xff1f;那我们宏观世…

快慢指针的应用

快慢指针的原理 快慢指针是利用两个指针移动速度的不一样&#xff0c;实现一些有趣的追击行为。就像上学时求解的那些操场上的追击问题一样。 问题1&#xff1a;判断两个链表是否相交。&#xff08;链表不存在环结构&#xff09; 形如&#xff1a; 方法&#xff1a;循环第一…

谷歌开源专业代码模型:对硬件要求低,性能超强!

谷歌发布了面向企业、开发人员的全新代码模型Code Gemma&#xff0c;一共有基础预训练、指令微调和快速推理三个版本。 Code Gemma是基于谷歌在今年2月发布的Gemma模型之上开发而成。其参数很小只有20亿和70亿两种&#xff0c;但使用了超过5000亿tokens的代码、数学、文本等数…

vue2和vue3的v-if与v-for优先级对比

Vue.js 中使用最多的两个指令就是 v-if 和 v-for&#xff0c;因此我们可能会想要同时使用它们。虽然官方不建议这样做&#xff0c;但有时确实是必须的&#xff0c;我们来了解下他们的工作方式&#xff1a; 在 vue 2.x 中&#xff0c;在一个元素上同时使用 v-if 和 v-for 时&am…

【第七届openGauss技术文章征集】 openGauss新版本征文活动来啦!

活动背景 2024年3月30日&#xff0c;openGauss 6.0.0版本正式上线&#xff0c;该版本与之前版本特性功能保持兼容&#xff0c;在内核能力、DataPod三层资源池化架构、DataKit数据全生命周期管理平台、生态兼容性等方面全面增强。&#xff08;下方【点击原文】即可查看更多【新…

【GPT-4最新研究】GPT-4与科学探索:揭秘语言模型在科学领域的无限可能

各位朋友们&#xff0c;你们知道吗&#xff1f;自然语言处理领域最近取得了巨大的突破&#xff01;大型语言模型&#xff08;LLM&#xff09;的出现&#xff0c;简直就像打开了新世界的大门。它们不仅在语言理解、生成和翻译方面表现出色&#xff0c;还能涉足许多其他领域&…

【绘图案例-屏幕截图 Objective-C语言】

一、屏幕截图 1.接下来,我们来说这个屏幕截图, 1.看一下我们的ppt, 屏幕截图呢,核心代码,也就是一句话, 我们看ppt上说,有时候需要从屏幕上的某一个View啊,截取一个图片出来,然后呢,这个里边儿,它举的一个例子,就是这个东西,捕鱼达人的这个图片,实际上,屏幕截图…

突破界限:LangChain 引领 AI 应用构建的新时代

前言 在上一篇文章中我们对 ChatWithPDF 的方案设计进行了整体的概览&#xff0c;现在细化下整体流程&#xff0c;如下图所示&#xff1a; 针对上面的流程&#xff0c;我们思考&#x1f914;一下会面临的问题&#xff1a; 如何读取 PDF 中的内容&#xff1f;&#xff08;肯定…