Java 使用 EasyExcel 爬取数据

一、爬取数据的基本思路

分析要爬取数据的来源

1. 查找数据来源:浏览器按 F12 或右键单击“检查”打开开发者工具查看数据获取时的请求地址

2. 查看接口信息:复制请求地址直接到浏览器地址栏输入看能不能取到数据

3. 推荐安装插件:FeHelper(FeHelper - Awesome)

4. 按 F12 打开控制台,查看网络请求,复制 curl 代码便于查看和执行:

注意不要暴露 cookie!!

curl "https://api.zsxq.com/v2/hashtags/48844541281228/topics?count=20" ^-H "authority: api.zsxq.com" ^-H "accept: application/json, text/plain, */*" ^-H "accept-language: zh-CN,zh;q=0.9" ^-H "cache-control: no-cache" ^-H "origin: https://wx.zsxq.com" ^-H "pragma: no-cache" ^-H "referer: https://wx.zsxq.com/" ^--compressed

二、使用 EasyExcel 爬取数据

方式一:通过监听器读取

1. 导入 EasyExcel 的依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version>
</dependency>

2. 创建读对象

读对象的的两种方式:

  • 表头确定:创建对象(属性即为需要的列数据)
  • 表头不确定:把每一行数据映射为 Map<String, Object>

  • 本系统的表头是确定的,读取表格中的用户名及星球编号即可,所以使用创建对象,对象的属性与表头进行绑定即可
  • 将 Excel 表格字段与 Java 对象关联起来:使用 @ExcelProperty("") 注解指定使用 index 强制匹配或根据 "str" 字符串匹配表格数据
package com.example.usercenter.once;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;/*** 用户信息实体对象:与 Excel 字段对应* @author Ghost* @version 1.0*/
@Data
public class TableUserData {@ExcelProperty("用户名")private String username;@ExcelProperty("星球编号")private String planetCode;}

3. 读取数据:先创建监听器,在读取数据时绑定监听器

  • 实现监听器 ReadListener 接口的 invoke() 方法,读取数据时会触发该方法
  • 实现 doAfterAllAnalysed() 方法,当所有数据读取完成就会触发一次该方法
  • 单独抽离处理逻辑,代码清晰易于维护
  • 一条一条处理,适用于数据量大的场景
package com.example.usercenter.once;import com.alibaba.excel.context.AnalysisContext;
import lombok.extern.slf4j.Slf4j;
import com.alibaba.excel.read.listener.ReadListener;@Slf4j
public class DemoDataListener implements ReadListener<TableUserData> {/*** 这个每一条数据解析都会来调用** @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}* @param context*/@Overridepublic void invoke(TableUserData data, AnalysisContext context) {System.out.println(data);// 输出每次解析到的数据}/*** 所有数据解析完成了 都会来调用** @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {log.info("所有数据解析完成!");}
}

 4. 绑定监听器,读取 Excel 数据

  • 在 resources 目录下新建一个 testUser.xls 作为测试使用
  • 绑定监听器 DemoDataListener
  • 每次解析一条数据,每次解析都会调用 invoke() 方法输出数据
package com.example.usercenter.once;import com.alibaba.excel.EasyExcel;/*** 读取 Excel 表格数据* @author Ghost* @version 1.0*/
public class ImportExcelData {public static void main(String[] args) {// 写法 1String fileName = "D:\\code\\user-center\\src\\main\\resources\\testUser.xls";// 先写一个绝对路径// 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行EasyExcel.read(fileName, TableUserData.class, new DemoDataListener()).sheet().doRead();}}

5. 运行程序,查看效果

方式二:使用同步读方式

1. 导入 EasyExcel 的依赖(同方式一)

2. 创建读对象(同方式一)

3. 读取数据:使用同步读的方式

  • 无需创建监听器,一次性获取完整数据
  • 方便简单,但数据量大时需要等待,会卡顿
package com.example.usercenter.once;import com.alibaba.excel.EasyExcel;
import lombok.extern.slf4j.Slf4j;import java.util.List;/*** 读取 Excel 表格数据* @author Ghost* @version 1.0*/
@Slf4j
public class ImportExcelData {public static void main(String[] args) {// 写法 1String fileName = "D:\\code\\user-center\\src\\main\\resources\\testUser.xls";// 先写一个绝对路径
//        readByListener(fileName);synchronousRead(fileName);}/*** 读取方式一:使用监听器读取* @param fileName 文件路径*/public static void readByListener(String fileName) {// 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行EasyExcel.read(fileName, TableUserData.class, new DemoDataListener()).sheet().doRead();}/*** 读取方式二:同步读取(同步的返回,不推荐使用,如果数据量大会把数据放到内存里面)* @param fileName 文件路径*/public static void synchronousRead(String fileName) {// 这里 需要指定读用哪个class去读,然后读取第一个sheet 同步读取会自动finishList<TableUserData> list = EasyExcel.read(fileName).head(TableUserData.class).sheet().doReadSync();for (TableUserData data : list) {log.info("读取到数据:{}", data);}}}

4. 运行程序,查看效果

三、清洗数据后导入数据库

1. 使用同步读的方式获取数据

2. 数据去重:判断是否有用户名相同的用户

3. TODO:如何获取所有用户(用户的唯一标识)

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

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

相关文章

搭建知识付费小程序平台:如何避免被坑,选择最佳方案?

随着知识经济的兴起&#xff0c;知识付费已经成为一种趋势。越来越多的人开始将自己的知识和技能进行变现&#xff0c;而知识付费小程序平台则成为了一个重要的渠道。然而&#xff0c;市面上的知识付费小程序平台琳琅满目&#xff0c;其中不乏一些不良平台&#xff0c;让老实人…

高可用架构去中心化重要?

1 背景 在互联网高可用架构设计中&#xff0c;应该避免将所有的控制权都集中到一个中心服务&#xff0c;即便这个中心服务是多副本模式。 对某个中心服务&#xff08;组件&#xff09;的过渡强依赖&#xff0c;那等同于把命脉掌握在依赖方手里&#xff0c;依赖方的任何问题都可…

个性化定制的知识付费小程序,为用户提供个性化的知识服务

明理信息科技知识付费saas租户平台 随着知识经济的兴起&#xff0c;越来越多的人开始重视知识付费&#xff0c;并希望通过打造自己的知识付费平台来实现自己的知识变现。本文将介绍如何打造自己的知识付费平台&#xff0c;并从定位、内容制作、渠道推广、运营维护四个方面进行…

如何保证Kafka不丢失消息

丢失消息有 3 种不同的情况&#xff0c;针对每一种情况有不同的解决方案。 生产者丢失消息的情况消费者丢失消息的情况Kafka 弄丢了消息 生产者丢失消息的情况 生产者(Producer) 调用send方法发送消息之后&#xff0c;消息可能因为网络问题并没有发送过去。所以&#xff0c;我们…

@Controller层自定义注解拦截request请求校验

一、背景 笔者工作中遇到一个需求&#xff0c;需要开发一个注解&#xff0c;放在controller层的类或者方法上&#xff0c;用以校验请求参数中(不管是url还是body体内&#xff0c;都要检查&#xff0c;有token参数&#xff0c;且符合校验规则就放行)是否传了一个token的参数&am…

从车联网到智慧城市:智慧交通的革新之路

一、引言 1、智慧城市的概念和发展背景 智慧城市&#xff08;Smart City&#xff09;是指以信息技术为基础&#xff0c;运用信息与通信等手段&#xff0c;对城市各个核心系统各项关键数据进行感测、分析、整合和利用&#xff0c;实现对城市生活环境的感知、资源的调控&#x…

Linux下的HTTPS配置:从证书到安全连接

在当今的互联网环境中&#xff0c;数据传输的安全性越来越受到重视。HTTPS&#xff0c;作为HTTP的安全版本&#xff0c;通过使用SSL/TLS协议来加密数据传输&#xff0c;确保了数据在传输过程中的安全。在Linux环境下&#xff0c;配置HTTPS需要从证书的生成到服务器的配置进行一…

用 YAML 文件配置 CI/CD 管道

MSBuild 参数: 在使用 MSBuild 命令行生成打包项目(就像在 Visual Studio 中使用向导生成项目一样)之前,生成过程可以通过编辑 Package.appxmanifest 文件中 Package 元素的 Version 属性,来对生成的 MSIX 包进行版本控制。 在 Azure Pipelines 中,可以使用某个表达式来…

内网yum仓库 ftp;http方式

ftp方式 服务端 客户端 vim /etc/yum.repos.d/ftp.repo http方式 服务端 yum install httpd -y systemctl start httpd cd /var/www/html/ mkdir centos7 mount /dev/sr0 /var/www/html/centos7 客户端

pip与pip3的区别

pip 和 pip3 都是 Python 的包管理工具&#xff0c;用于安装第三方库。它们的区别在于&#xff1a; pip 是 Python 2 和 Python 3 通用的包管理工具&#xff0c;它可以安装适用于 Python 2 和 Python 3 的库。pip3 是专门用于 Python 3 的包管理工具&#xff0c;它只能安装适用…

CAN-位填充

位填充定义&#xff08;Bit Stuffing&#xff09; 当CAN节点发送 逻辑电平&#xff08;显性dominant或隐性recessive&#xff09;为持续相同的5位时&#xff0c;它必须添加一位反向电平。 CAN接收 节点会自动删除这个新增的额外电平位。 位填充作用 1---位填充是为了防止突发…

【2024-01-15】某安居客验证码分析-滑块验证码

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、抓包分析二、参数分析1.请求getInfoTp2.校验checkInfoTp一、抓包分析 网址: aHR0cHM6Ly9hcGkuYW5qdWtlLmNvbS93ZWI…

任务15:使用Hive进行全国气象数据分析

任务描述 知识点&#xff1a; 使用Hive进行数据分析 重 点&#xff1a; 掌握Hive基本语句熟练使用Hive对天气数据进行分析 内 容&#xff1a; 使用Hive创建外部表使用Hive对数据进行统计分析 任务指导 1. 使用Hive创建基础表 将China_stn_city.csv文件上传到HDFS的/…

统计学之常见的分布介绍

统计学中常见的分布有&#xff1a; 1. 正态分布&#xff08;Normal Distribution&#xff09;&#xff1a;也称为高斯分布&#xff0c;是最常见的分布之一&#xff0c;具有钟形曲线&#xff0c;对称且均值和标准差可以完全描述该分布。 2. 二项分布&#xff08;Binomial Dist…

Unity3D学习之数据持久化——PlayerPrefs

文章目录 1. 概念2. 存储2.1 存到内存当中2.2 存到硬盘当中2.3 局限性2.4 相同键会覆盖 3.读取3.1 int型3.2 float型3.3 string型3.4 判断数据是否存在 4. 删除数据5. 存储位置6. 反射6.1 判断一个类型的对象是否可以让另一个类型为自己分配空间6.2 通过反射获得泛型类型 7 数据…

斯坦福 Stats60:21 世纪的统计学:第十五章到第十八章

第十五章&#xff1a;比较均值 原文&#xff1a;statsthinking21.github.io/statsthinking21-core-site/comparing-means.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 我们已经遇到了许多情况&#xff0c;我们想要询问样本均值的问题。在本章中&#xff0c;我们…

Keepalived 双机热备

本章主要内容&#xff1a; Keepalived 双机热备基础知识学会构建双机热备系统学会构建LVSHA 高可用群集 简介 在这个高度信息化的IT时代&#xff0c;企业的生产系统&#xff0c;业务运营&#xff0c;销售和支持&#xff0c;以及日常管理等环节越来越依赖于计算机和服务&#…

Shape-IoU——综合考量边框形状与尺度的度量

今天看到一篇文章主要是提出了一种更有效的IOU度量方法&#xff0c;论文地址在这里&#xff0c;如下所示&#xff1a; 摘要 边界盒回归损失作为检测器定位分支的重要组成部分&#xff0c;在目标检测任务中起着重要作用。现有的边界框回归方法通常考虑GT框和预测框之间的几何关…

使用ffmpeg进行视频截取

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-version3 --enable-sta…

SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用

四、Database MetaData 与 SQL Express Language 的使用 MetaData对象用于描述表结构&#xff0c;SQL Express Language是DBAPI SQL的统一封装器。MetaData 与SQL Express 语句可以在Core层使用&#xff0c;ORM层基于MetaData, SQL Express基础上做了进一步抽象。本章将介绍在…