基于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有了更深入的了解。示例代码供参考,请朋友合理使用资源。行文仓促,定有不足之处,环境大家批评指正。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

配置交换机端口安全

1、实验目的 通过本实验可以掌握&#xff1a; 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法。 2、实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 3、实验步骤 &#xff…

set 类 和 map 类

1. 关联式容器 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key, value>结构的 键值对&#xff0c;在数据检索时比序列式容器效率更高 2. 键值对 用来表示具有一一对应关系的一种结构&#xff0c;该结构中一般只包含…

JVM之JVM的基本介绍

基本介绍 JVM&#xff1a;全称 Java Virtual Machine&#xff0c;即 Java 虚拟机&#xff0c;一种规范&#xff0c;本身是一个虚拟计算机&#xff0c;直接和操作系统进行交互&#xff0c;与硬件不直接交互&#xff0c;而操作系统可以帮我们完成和硬件进行交互的工作 特点&…

Docker Image (镜像) 常见命令

Docker Image (镜像) 常用命令 docker images 功能&#xff1a;列出本地所有的镜像。如果镜像 ID 相同&#xff0c;但是 Tag 标签不同&#xff0c;也会被当作不同的条目被列出来。 语法&#xff1a; docker images [options] [REPOSITORY[:TAG]] 别名&#xff1a; docker ima…

【fastapi】搭建第一个fastapi后端项目

本篇文章介绍一下fastapi后端项目的搭建。其实没有什么好说的&#xff0c;按照官方教程来即可&#xff1a;https://fastapi.tiangolo.com/zh/ 安装依赖 这也是我觉得python项目的槽点之一。所有依赖都安装在本地&#xff0c;一旦在别人电脑上编写项目就又要安装一遍。很扯淡。…

mysql搭建主从

mysql搭建主从: 1:拉取mysql镜像 docker pull mysql2:创建主从对应目录 3:建立一个简易的mysql docker run -it --name mytest -e MYSQL_ROOT_PASSWORD123 -d mysql4:进入这个简易的mysql;从中获取my.cnf文件 docker exec -it mytest bash5:从容器中将my.cnf拷贝到 /3306/c…

ADC的认识

ADC介绍 Q:ADC是什么&#xff1f; A&#xff1a;全称&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 ADC的性能指标 量程&#xff1a;能测量的电压范围分辨率&#xff1a;ADC能辨别的最小模拟量&#xff0c;通常以输出二进制数的位数表示&#xf…

康耐视visionpro-CogBlobTool工具操作详细说明

CogBlobTool功能说明: 通过设置灰度值提取感兴趣区域,并分析所提取区域的面积、长宽等参数。 Cog BlobTool操作说明: .打开工具栏,双击或点击鼠标拖拽添加CogBlobTool工具 ②.添加输入图像:单击鼠标右键“链接到”或以连线拖拽的方式选择相应输入源 ③.极性: “白底黑点…

搭建基于Hexo的个人博客,以及git相关命令

全文写完之后的总结 测试命令 hexo clean hexo g hexo s 上传到服务器命令 hexo clean hexo g hexo d 上传到服务器&#xff08;如果上一个命令用不了&#xff09;&#xff0c;也要先hexo clean,hexo g git init git add . git commit -m "first commit" git p…

vscode配置c\c++及美化

文章目录 vscode配置c\c及美化1.安装vscode2.汉化3.安装c\c插件4.安装mingw5.配置mingw6. 运行c代码6.1 创建代码目录6.2 设置文件配置6.3 创建可执行任务&#xff1a;task.json6.4 编译执行6.5 再写其他代码6.6 运行多个c文件 7. 运行c文件8.调式代码8.1 创建launch.json8.2 修…

jenkins下载安装(mac)

下载官网 具体 直接命令安装 Sample commands: Install the latest LTS version: brew install jenkins-ltsStart the Jenkins service: brew services start jenkins-ltsRestart the Jenkins service: brew services restart jenkins-ltsUpdate the Jenkins version: brew u…

Requests,一个强大的 Python 库

Requests&#xff0c;一个强大的 Python 库 ​ 一. 介绍 在当今的互联网时代&#xff0c;网络数据的获取和处理变得尤为重要。无论是数据科学家获取数据集&#xff0c;还是开发者与外部API进行交互&#xff0c;都需要一个强大且易于使用的HTTP库来帮助完成这些任务。这就是r…

2024年认证杯数学建模挑战赛C题全解析

2024年认证杯C题的已经完成啦&#xff0c;包括参考论文&#xff0c;模型代码&#xff0c;分享给大家&#xff5e; 问题分析 对于这些问题&#xff0c;我们首先需要确定影响日光辐射降低效应的关键参数&#xff0c;例如海盐气溶胶的浓度、粒子大小、分布以及喷洒高度和范围。同…

英特尔、联想等服务器曝出难以修复的漏洞

文章目录 前言一、漏洞潜伏六年,服务器供应链安全堪忧二、漏洞广泛存在但难以修复前言 近日,英特尔、联想等多个厂商销售的服务器硬件曝出一个难以修复的远程可利用漏洞。该漏洞属于供应链漏洞,源自一个被多家服务器厂商整合到产品中的开源软件包——Lighttpd。 Lighttpd是…

【C++算法竞赛 · 图论】图的存储

前言 图的存储 邻接矩阵 方法 复杂度 应用 例题 题解 邻接表 方法 复杂度 应用 前言 上一篇文章中&#xff08;【C算法竞赛 图论】图论基础&#xff09;&#xff0c;介绍了图论相关的概念和一种图的存储的方法&#xff0c;这篇文章将会介绍剩下的两种方法&#xff…

elasticSearch从零整合springboot项目实操

type会被弃用 &#xff0c;就是说之后的elasticSearch中只会存在 索引&#xff08;indices&#xff09; 和 一行&#xff08;document&#xff09; 和字段&#xff08;fields&#xff09; elasticSearch 和solr的区别最大的就是 es对应的 是 json的格式 。 solr有xml和josn等…

OpenHarmony实例应用:【常用组件和容器低代码】

介绍 本篇Codelab是基于ArkTS语言的低代码开发方式实现的一个简单实例。具体实现功能如下&#xff1a; 创建一个低代码工程。通过拖拽的方式实现任务列表和任务信息界面的界面布局。在UI编辑界面实现数据动态渲染和事件的绑定。 最终实现效果如下&#xff1a; 相关概念 低代…

【opencv】示例-points_classifier.cpp 使用不同机器学习算法在二维空间中对点集进行分类...

#include "opencv2/core.hpp" // 包含OpenCV核心功能的文件 #include "opencv2/imgproc.hpp" // 包含OpenCV图像处理功能的文件 #include "opencv2/ml.hpp" // 包含OpenCV机器学习模块的文件 #include "opencv2/highgui.hpp" // 包含O…

【MIT6.S081】Lab3: page tables(详细解答版)

实验内容网址&#xff1a;https://xv6.dgs.zone/labs/requirements/lab3.html 本实验的代码分支&#xff1a;https://gitee.com/dragonlalala/xv6-labs-2020/tree/pgtbl2/ Print a page table 关键点&#xff1a;递归、三级页表 思路&#xff1a; 用上图来解释三级页表的原理最…

RISC-V技术变革:一颗芯片,CPU与GPU合二为一

一颗万能的RISC-V芯片: 将CPU和GPU整合到一个核中 X-Silicon 推出创新的 RISC-V 芯片架构,将 CPU、矢量功能和 GPU 加速无缝集成。这种开源混合芯片专为多功能工作负载而设计,包括人工智能,旨在通过高效处理提升性能。 革命性的 CPU/GPU 混合处理器全新的 RISC-V CPU/GPU 混…