Java 使用 EasyExcel 爬取数据

这篇具有很好参考价值的文章主要介绍了Java 使用 EasyExcel 爬取数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、爬取数据的基本思路

分析要爬取数据的来源

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

Java 使用 EasyExcel 爬取数据,Java,浪花 - 后端,java,数据库,mysql,爬虫

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

Java 使用 EasyExcel 爬取数据,Java,浪花 - 后端,java,数据库,mysql,爬虫

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
     */
    @Override
    public void invoke(TableUserData data, AnalysisContext context) {
        System.out.println(data);// 输出每次解析到的数据
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public 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) {
        // 写法 1
        String fileName = "D:\\code\\user-center\\src\\main\\resources\\testUser.xls";// 先写一个绝对路径
        // 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行
        EasyExcel.read(fileName, TableUserData.class, new DemoDataListener()).sheet().doRead();
    }

}

5. 运行程序,查看效果

Java 使用 EasyExcel 爬取数据,Java,浪花 - 后端,java,数据库,mysql,爬虫

方式二:使用同步读方式

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) {
        // 写法 1
        String 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 同步读取会自动finish
        List<TableUserData> list = EasyExcel.read(fileName).head(TableUserData.class).sheet().doReadSync();
        for (TableUserData data : list) {
            log.info("读取到数据:{}", data);
        }
    }

}

4. 运行程序,查看效果

Java 使用 EasyExcel 爬取数据,Java,浪花 - 后端,java,数据库,mysql,爬虫

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

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

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

3. TODO:如何获取所有用户(用户的唯一标识)文章来源地址https://www.toymoban.com/news/detail-800021.html

到了这里,关于Java 使用 EasyExcel 爬取数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 后端:使用easyExcel实现解析Excel文件读取数据。前端:Excel模板下载、前端上传文件

            本篇是EasyExcel快速入门知识,讲解如何读取Excel文件,对Excel中错误信息如空字符、必填项为空、表格格式校验做到处理 ,并给出了实际项目中示例代码;为什么要使用easyexcel;原因是相比于poi,easyexcel更加轻量级,读取写入API方便,并且在工作中占用内存较小;

    2024年02月05日
    浏览(76)
  • 浪花 - 组队功能后端开发

    1. 添加队伍 2. 删除队伍 3. 修改 / 更新队伍信息 4. 查找队伍 1. 封装请求包装类 2. 创建查询构造器 3. 执行列表查询 1. 通用分页查询请求参数 2. 创建查询构造器 3. 执行分页查询 1. 为什么需要请求参数包装类? 请求参数名称 / 类型和实体类型不一致 有一些参数用不到,如果要

    2024年01月23日
    浏览(37)
  • 【java学习】EasyExcel的简单使用

    EasyExcel类是一套基于Java的开源Excel解析工具类,相较于传统的框架如Apache poi、jxl等更加快速、简洁,还可以解决大文件内存溢出问题,即能让使用者在不用考虑性能、内存的等因素的情况下,快速完成Excel的读(导入)、写(导出)等功能。 版本支持: 2+版本支持Java7Java6

    2024年02月16日
    浏览(42)
  • Java 使用 easyexcel 读取 excel 文件

    easyexcel 官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 1. 引入依赖并给出示例 excel     2. 两种读取的方式         (1)确定表头:建立对象,和表头形成映射。(这里以此为例)         (2)不确定表头:每一行映射为 MapString, Object。 3. 先创建 excel 中表头对应

    2024年02月12日
    浏览(59)
  • Java后端使用POST请求向mysql中插入Json数据的问题

    Cause: java.lang.IllegalStateException: Type handler was null on parameter mapping for property ‘urlParams’. It was either not specified and/or could not be found for the javaType (com.alibaba.fastjson.JSONObject) : jdbcType (null) combination.

    2024年02月07日
    浏览(41)
  • JAVA(EasyExcel)通过远程调用模板 导出数据 复杂表头

    最近接手一个需求,单组数据的显示,也有多组数据的显示,查了好多文章,都不是很明白.但是这篇文章和我的需求差不多非常相似(链接放在文末),根据这篇文章然后将自己的实现过程记录了下来,以防之后再用到. 这是我需要导出的excel格式 开头是单条数据的展示 之后是多条数据

    2024年02月03日
    浏览(49)
  • java实现excel的导出之使用easyExcel

    在我们的项目需求中,经常会遇到导出的需求,其中excel的导出最为常见。生成Excel比较有名的框架有Apache poi,jxl等,但他们都存在一个严重的问题就是非常的耗内存,如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc. EasyExcel是阿里巴巴

    2024年02月15日
    浏览(47)
  • Java——使用EasyExcel导出动态列的Excel

    多多点赞,会变好看! 多多留言,会变有钱! 有些时候列表的列可能是动态的,需要根据动态表头导出Excel文件,这时候可以使用下面的方法解决: 静态列导出代码:

    2024年02月15日
    浏览(49)
  • Java 使用 EasyExcel 实现导入导出(新手篇教程)

    官网镇楼↓,觉得我写的不好的同学可以去官网看哦 EasyExcel 示例: 如上一个简易 Excel 表格,表头占了两行,且第三列开始才为有效数据,那么我们应该如何导入? 建造实体类 首先无论是导入还是导出,都需要先建对应的实体类  如图所示,因为我的示例 Excel 一共需要读

    2024年04月17日
    浏览(41)
  • Python网络爬虫逆向分析爬取动态网页、使用Selenium库爬取动态网页、​编辑将数据存储入MongoDB数据库

    目录 逆向分析爬取动态网页 了解静态网页和动态网页区别 1.判断静态网页  2.判断动态网页  逆向分析爬取动态网页 使用Selenium库爬取动态网页 安装Selenium库以及下载浏览器补丁 页面等待  页面操作 1.填充表单 2.执行JavaScript 元素选取 Selenium库的find_element的语法使用格式如下

    2024年02月15日
    浏览(119)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包