[web教学] 一种使用Java的快速将Web中表格转换成Excel的方法

[复制链接]
查看1144 | 回复0 | 2023-8-23 11:51:44 | 显示全部楼层 |阅读模式 来自 中国北京
配景

        随着后疫情期间的到来,在过去的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.0</modelVersion>
  5.         <groupId>com.yelang</groupId>
  6.         <artifactId>jsoupdemo</artifactId>
  7.         <version>0.0.1-SNAPSHOT</version>
  8.         <dependencies>
  9.                 <dependency>
  10.                         <groupId>org.jsoup</groupId>
  11.                         <artifactId>jsoup</artifactId>
  12.                         <version>1.11.3</version>
  13.                 </dependency>
  14.                 <dependency>
  15.                         <groupId>com.alibaba</groupId>
  16.                         <artifactId>easyexcel</artifactId>
  17.                         <version>3.0.5</version>
  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.        
  9.         public String getGdp() {
  10.                 return gdp;
  11.         }
  12.         public void setGdp(String gdp) {
  13.                 this.gdp = gdp;
  14.         }
  15.         public Gdp(Integer index, String name, String province, String gdp) {
  16.                 super(index,name,province);
  17.                 this.gdp = gdp;
  18.         }
  19.         public Gdp(Integer index, String name, String province) {
  20.                 super(index, name, province);
  21.         }
  22. }
复制代码
  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<Gdp> list = new ArrayList<Gdp>();
  12.             for(int i = 1;i<elements.size();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获取方法。
  1. 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表格,同时文中给出了具体的示例代码。由于行文急忙,难免有误,接待品评指正交流。

来源:https://blog.csdn.net/yelangkingwuzuhu/article/details/130901172
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则