• 一种使用Java的快速将Web中表格转换成Excel的方法


    背景

            随着后疫情时代的到来,在过去的2022年,全国的经济情况,想必是很多学者和研究对象都非常关心的事。而这些数据在国家统计局网站上都有相应的记录。通过分析这些数据,可以从某一个角度来验证和观察当下的经济情况。

            全国共计有1279个县级单位已经披露了2022年GDP和一般公共预算收入数据情况,企业预警通根据这些数据整理出中国百强县gdp排行榜和百强县一般公共预算收入排行榜。其中昆山市以5006.66亿元GDP蝉联榜单榜首,江阴市、晋江市位列百强县第二三位,长沙县是湖南省唯一进入全国前十的(Top7)。来源:2023中国县城GDP百强榜揭晓 2023中国百强县排行榜一览

             第一张图是以图片的形式发布的,第二种是采用Html的表格(table)形式展示的。在离线分析使用数据的时候非常不方便。作为程序猿,这一定难不倒您。我们可以采用网页抓取的技术对数据进行整理。本文将以Java语言为编程语言,讲解使用Jsoup对Web网页知识进行爬取,文中给出了详细的示例代码,希望对大家有帮助。

    一、初识Jsoup抓取

    1、网页结构分析

            在使用Jsoup对页面进行抓取时,需要对网页的结构进行初步的分析,便于制定相对应的抓取策略。首先打开浏览器,输入目标网站的地址,同时打开F12进入调试,找到目标网页的元素。

             打开上面gdp百强榜表格中的div下table表格,找到如下的数据

             同理,对于一般公共预算收入的数据处理也是同样的处理办法,在此不再赘述。

    二、Java开发Jsoup抓取

    1、引用Jsoup相关依赖包

            这里我们采用Maven的jar进行包的依赖处理管理。因此先定义Pom.xml,关键代码如下所示:

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.yelanggroupId>
    6. <artifactId>jsoupdemoartifactId>
    7. <version>0.0.1-SNAPSHOTversion>
    8. <dependencies>
    9. <dependency>
    10. <groupId>org.jsoupgroupId>
    11. <artifactId>jsoupartifactId>
    12. <version>1.11.3version>
    13. dependency>
    14. <dependency>
    15. <groupId>com.alibabagroupId>
    16. <artifactId>easyexcelartifactId>
    17. <version>3.0.5version>
    18. dependency>
    19. dependencies>
    20. project>

    2、 信息实体类的处理

            对比发现两个表格处理具体的指标不一样,前面的排名和县名称,所在省份名称都是一样的。因此我们采用面向对象的设计方法对信息处理的类进行开发。相应的类图如下所示:

     3、数据采集实体

    1. package com.yelang.entity;
    2. import java.io.Serializable;
    3. import com.alibaba.excel.annotation.ExcelProperty;
    4. public class CountyBase implements Serializable {
    5. private static final long serialVersionUID = -1760099890427975758L;
    6. @ExcelProperty(value= {"序号"},index = 1)
    7. private Integer index;
    8. @ExcelProperty(value= {"县级地区"},index = 2)
    9. private String name;
    10. @ExcelProperty(value= {"所属省"},index = 3)
    11. private String province;
    12. public Integer getIndex() {
    13. return index;
    14. }
    15. public void setIndex(Integer index) {
    16. this.index = index;
    17. }
    18. public String getName() {
    19. return name;
    20. }
    21. public void setName(String name) {
    22. this.name = name;
    23. }
    24. public String getProvince() {
    25. return province;
    26. }
    27. public void setProvince(String province) {
    28. this.province = province;
    29. }
    30. public CountyBase(Integer index, String name, String province) {
    31. super();
    32. this.index = index;
    33. this.name = name;
    34. this.province = province;
    35. }
    36. public CountyBase() {
    37. super();
    38. }
    39. }

             在上面的代码中,将排序、县级地区、省作为父类抽象出来,设计两个子类:GDP类和一般公共收入类。这里需要注意的是,由于这里我们需要将采集的数据保存到本地的Excel表格中,这里我们采用EasyExcel作为技术生成组件。@ExcelProperty这个属性中,我们定义了写入的Excel表头以及具体的排序。

    1. package com.yelang.entity;
    2. import java.io.Serializable;
    3. import com.alibaba.excel.annotation.ExcelProperty;
    4. public class Gdp extends CountyBase implements Serializable {
    5. private static final long serialVersionUID = 5265057372502768147L;
    6. @ExcelProperty(value= {"GDP(亿元)"},index = 4)
    7. private String gdp;
    8. public String getGdp() {
    9. return gdp;
    10. }
    11. public void setGdp(String gdp) {
    12. this.gdp = gdp;
    13. }
    14. public Gdp(Integer index, String name, String province, String gdp) {
    15. super(index,name,province);
    16. this.gdp = gdp;
    17. }
    18. public Gdp(Integer index, String name, String province) {
    19. super(index, name, province);
    20. }
    21. }
    1. package com.yelang.entity;
    2. import java.io.Serializable;
    3. import com.alibaba.excel.annotation.ExcelProperty;
    4. public class Gpbr extends CountyBase implements Serializable {
    5. private static final long serialVersionUID = 8612514686737317620L;
    6. @ExcelProperty(value= {"一般公共预算收入(亿元)"},index = 4)
    7. private String gpbr;// General public budget revenue
    8. public String getGpbr() {
    9. return gpbr;
    10. }
    11. public void setGpbr(String gpbr) {
    12. this.gpbr = gpbr;
    13. }
    14. public Gpbr(Integer index, String name, String province, String gpbr) {
    15. super(index, name, province);
    16. this.gpbr = gpbr;
    17. }
    18. public Gpbr(Integer index, String name, String province) {
    19. super(index, name, province);
    20. }
    21. }

     4、实际爬取

            下面是处理GDP数据的转换代码,如果不熟悉Jsoup可以先熟悉下相关语法,如果有类似Jquery的开发经验,对于Jsoup上手非常快。

    1. static void grabGdp() {
    2. String target = "https://www.maigoo.com/news/665462.html";
    3. try {
    4. Document doc = Jsoup.connect(target)
    5. .ignoreContentType(true)
    6. .userAgent(FetchCsdnCookie.ua[1])
    7. .timeout(300000)
    8. .header("referer","https://www.maigoo.com")
    9. .get();
    10. Elements elements = doc.select("#t_container > div:eq(3) table tr");
    11. List list = new ArrayList();
    12. for(int i = 1;i
    13. Element tr = elements.get(i);//获取表头
    14. Elements tds = tr.select("td");
    15. Integer index = Integer.valueOf(tds.get(0).text());
    16. String name = tds.get(1).text();
    17. String province = tds.get(2).text();
    18. String gdp = tds.get(3).text();
    19. Gdp county = new Gdp(index, name, province, gdp);
    20. list.add(county);
    21. }
    22. String fileName = "E:/gdptest/2023全国百强县GDP排行榜 .xlsx";
    23. EasyExcel.write(fileName, Gdp.class).sheet("GDP百强榜").doWrite(list);
    24. System.out.println("完成...");
    25. } catch (Exception e) {
    26. System.out.println(e.getMessage());
    27. System.out.println("发生异常,继续下一轮循环");
    28. }
    29. }

             这里需要注意的是在jsoup中如何进行网页的元素定位及抓取。在上面这里,我们使用类似jquery的Dom获取方法。

     Elements elements = doc.select("#t_container > div:eq(3) table tr");

            通过这一行去获取表格下的每一个tr,然后再循环每个td就可以获取对应的数据。 

    三、过程分析及结果

    1、采集过程分析

            这里采用对源程序进行debug的方法对网页进行抽丝剥茧的分析。使用jsou进行网页模拟访问

             采用select(xxx)的方法获取页面元素,

             获取tr下的td单元格数据,

    2、运行结果         

            上述代码运行完成后,在目的磁盘可以看到以下两个文件,

             打开上述两个excel文件可以看到想要采集的数据已经采集完毕,数据的顺序也是完全按照网页上的顺序来进行生成的。

     总结

            以上就是本文的主要内容。本文将以Java语言为编程语言,详细讲解了如何使用Jsoup对Web网页知识进行爬取,结合EasyExcel将网页表格转换成Excel表格,同时文中给出了详细的示例代码。由于行文仓促,难免有误,欢迎批评指正交流。

  • 相关阅读:
    【EMQX】2.1.5 EMQ X 消息服务器功能列表
    Flutter - APP跳转高德、百度、腾讯、谷歌地图
    【MindSpore分布式训练】训练中报错: Destroy info store failed
    添加过的PDF注释可以修改吗?怎么修改PDF注释?
    使用原生div制作table表格
    ROS 中自定义消息需要配置的文件信息
    BatchNormalization和Layer Normalization解析
    【Android】安卓开发的前景
    第二章:Pythonocc官方demo 案例41(step文件的面的特征识别)
    linux驱动调试之Debugfs
  • 原文地址:https://blog.csdn.net/yelangkingwuzuhu/article/details/130901172