房地产设计网站,视觉传达设计好找工作吗,新手开网店从哪里找货源,电子商务网站建设合同一、爬取数据的基本思路 分析要爬取数据的来源 1. 查找数据来源#xff1a;浏览器按 F12 或右键单击“检查”打开开发者工具查看数据获取时的请求地址 2. 查看接口信息#xff1a;复制请求地址直接到浏览器地址栏输入看能不能取到数据 3. 推荐安装插件#xff1a;FeHelper浏览器按 F12 或右键单击“检查”打开开发者工具查看数据获取时的请求地址 2. 查看接口信息复制请求地址直接到浏览器地址栏输入看能不能取到数据 3. 推荐安装插件FeHelperFeHelper - Awesome
4. 按 F12 打开控制台查看网络请求复制 curl 代码便于查看和执行 注意不要暴露 cookie curl https://api.zsxq.com/v2/hashtags/48844541281228/topics?count20 ^-H authority: api.zsxq.com ^-H accept: application/json, text/plain, */* ^-H accept-language: zh-CN,zh;q0.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 --
dependencygroupIdcom.alibaba/groupIdartifactIdeasyexcel/artifactIdversion3.1.1/version
/dependency
2. 创建读对象 读对象的的两种方式 表头确定创建对象属性即为需要的列数据 表头不确定把每一行数据映射为 MapString, 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 ReadListenerTableUserData {/*** 这个每一条数据解析都会来调用** 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 同步读取会自动finishListTableUserData list EasyExcel.read(fileName).head(TableUserData.class).sheet().doReadSync();for (TableUserData data : list) {log.info(读取到数据:{}, data);}}}4. 运行程序查看效果 三、清洗数据后导入数据库
1. 使用同步读的方式获取数据
2. 数据去重判断是否有用户名相同的用户
3. TODO如何获取所有用户用户的唯一标识