使用Java快速將Web中表格轉(zhuǎn)換成Excel的方法
背景
隨著后疫情時代的到來,在過去的2022年,全國的經(jīng)濟(jì)情況,想必是很多學(xué)者和研究對象都非常關(guān)心的事。而這些數(shù)據(jù)在國家統(tǒng)計局網(wǎng)站上都有相應(yīng)的記錄。通過分析這些數(shù)據(jù),可以從某一個角度來驗證和觀察當(dāng)下的經(jīng)濟(jì)情況。
全國共計有1279個縣級單位已經(jīng)披露了2022年GDP和一般公共預(yù)算收入數(shù)據(jù)情況,企業(yè)預(yù)警通根據(jù)這些數(shù)據(jù)整理出中國百強(qiáng)縣gdp排行榜和百強(qiáng)縣一般公共預(yù)算收入排行榜。其中昆山市以5006.66億元GDP蟬聯(lián)榜單榜首,江陰市、晉江市位列百強(qiáng)縣第二三位,長沙縣是湖南省唯一進(jìn)入全國前十的(Top7)。來源:2023中國縣城GDP百強(qiáng)榜揭曉 2023中國百強(qiáng)縣排行榜一覽。
第一張圖是以圖片的形式發(fā)布的,第二種是采用Html的表格(table)形式展示的。在離線分析使用數(shù)據(jù)的時候非常不方便。作為程序猿,這一定難不倒您。我們可以采用網(wǎng)頁抓取的技術(shù)對數(shù)據(jù)進(jìn)行整理。本文將以Java語言為編程語言,講解使用Jsoup對Web網(wǎng)頁知識進(jìn)行爬取,文中給出了詳細(xì)的示例代碼,希望對大家有幫助。
一、初識Jsoup抓取
1、網(wǎng)頁結(jié)構(gòu)分析
在使用Jsoup對頁面進(jìn)行抓取時,需要對網(wǎng)頁的結(jié)構(gòu)進(jìn)行初步的分析,便于制定相對應(yīng)的抓取策略。首先打開瀏覽器,輸入目標(biāo)網(wǎng)站的地址,同時打開F12進(jìn)入調(diào)試,找到目標(biāo)網(wǎng)頁的元素。
打開上面gdp百強(qiáng)榜表格中的div下table表格,找到如下的數(shù)據(jù)
同理,對于一般公共預(yù)算收入的數(shù)據(jù)處理也是同樣的處理辦法,在此不再贅述。
二、Java開發(fā)Jsoup抓取
1、引用Jsoup相關(guān)依賴包
這里我們采用Maven的jar進(jìn)行包的依賴處理管理。因此先定義Pom.xml,關(guān)鍵代碼如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.yelang</groupId> <artifactId>jsoupdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.3</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.0.5</version> </dependency> </dependencies> </project>
2、 信息實體類的處理
對比發(fā)現(xiàn)兩個表格處理具體的指標(biāo)不一樣,前面的排名和縣名稱,所在省份名稱都是一樣的。因此我們采用面向?qū)ο蟮脑O(shè)計方法對信息處理的類進(jìn)行開發(fā)。相應(yīng)的類圖如下所示:
3、數(shù)據(jù)采集實體
package com.yelang.entity; import java.io.Serializable; import com.alibaba.excel.annotation.ExcelProperty; public class CountyBase implements Serializable { private static final long serialVersionUID = -1760099890427975758L; @ExcelProperty(value= {"序號"},index = 1) private Integer index; @ExcelProperty(value= {"縣級地區(qū)"},index = 2) private String name; @ExcelProperty(value= {"所屬省"},index = 3) private String province; public Integer getIndex() { return index; } public void setIndex(Integer index) { this.index = index; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public CountyBase(Integer index, String name, String province) { super(); this.index = index; this.name = name; this.province = province; } public CountyBase() { super(); } }
在上面的代碼中,將排序、縣級地區(qū)、省作為父類抽象出來,設(shè)計兩個子類:GDP類和一般公共收入類。這里需要注意的是,由于這里我們需要將采集的數(shù)據(jù)保存到本地的Excel表格中,這里我們采用EasyExcel作為技術(shù)生成組件。@ExcelProperty這個屬性中,我們定義了寫入的Excel表頭以及具體的排序。
package com.yelang.entity; import java.io.Serializable; import com.alibaba.excel.annotation.ExcelProperty; public class Gdp extends CountyBase implements Serializable { private static final long serialVersionUID = 5265057372502768147L; @ExcelProperty(value= {"GDP(億元)"},index = 4) private String gdp; public String getGdp() { return gdp; } public void setGdp(String gdp) { this.gdp = gdp; } public Gdp(Integer index, String name, String province, String gdp) { super(index,name,province); this.gdp = gdp; } public Gdp(Integer index, String name, String province) { super(index, name, province); } }
package com.yelang.entity; import java.io.Serializable; import com.alibaba.excel.annotation.ExcelProperty; public class Gpbr extends CountyBase implements Serializable { private static final long serialVersionUID = 8612514686737317620L; @ExcelProperty(value= {"一般公共預(yù)算收入(億元)"},index = 4) private String gpbr;// General public budget revenue public String getGpbr() { return gpbr; } public void setGpbr(String gpbr) { this.gpbr = gpbr; } public Gpbr(Integer index, String name, String province, String gpbr) { super(index, name, province); this.gpbr = gpbr; } public Gpbr(Integer index, String name, String province) { super(index, name, province); } }
4、實際爬取
下面是處理GDP數(shù)據(jù)的轉(zhuǎn)換代碼,如果不熟悉Jsoup可以先熟悉下相關(guān)語法,如果有類似Jquery的開發(fā)經(jīng)驗,對于Jsoup上手非常快。
static void grabGdp() { String target = "https://www.maigoo.com/news/665462.html"; try { Document doc = Jsoup.connect(target) .ignoreContentType(true) .userAgent(FetchCsdnCookie.ua[1]) .timeout(300000) .header("referer","https://www.maigoo.com") .get(); Elements elements = doc.select("#t_container > div:eq(3) table tr"); List<Gdp> list = new ArrayList<Gdp>(); for(int i = 1;i<elements.size();i++) { Element tr = elements.get(i);//獲取表頭 Elements tds = tr.select("td"); Integer index = Integer.valueOf(tds.get(0).text()); String name = tds.get(1).text(); String province = tds.get(2).text(); String gdp = tds.get(3).text(); Gdp county = new Gdp(index, name, province, gdp); list.add(county); } String fileName = "E:/gdptest/2023全國百強(qiáng)縣GDP排行榜 .xlsx"; EasyExcel.write(fileName, Gdp.class).sheet("GDP百強(qiáng)榜").doWrite(list); System.out.println("完成..."); } catch (Exception e) { System.out.println(e.getMessage()); System.out.println("發(fā)生異常,繼續(xù)下一輪循環(huán)"); } }
這里需要注意的是在jsoup中如何進(jìn)行網(wǎng)頁的元素定位及抓取。在上面這里,我們使用類似jquery的Dom獲取方法。
Elements elements = doc.select("#t_container > div:eq(3) table tr");
通過這一行去獲取表格下的每一個tr,然后再循環(huán)每個td就可以獲取對應(yīng)的數(shù)據(jù)。
三、過程分析及結(jié)果
1、采集過程分析
這里采用對源程序進(jìn)行debug的方法對網(wǎng)頁進(jìn)行抽絲剝繭的分析。使用jsou進(jìn)行網(wǎng)頁模擬訪問
采用select(xxx)的方法獲取頁面元素,
獲取tr下的td單元格數(shù)據(jù),
2、運行結(jié)果
上述代碼運行完成后,在目的磁盤可以看到以下兩個文件,
打開上述兩個excel文件可以看到想要采集的數(shù)據(jù)已經(jīng)采集完畢,數(shù)據(jù)的順序也是完全按照網(wǎng)頁上的順序來進(jìn)行生成的。
總結(jié)
以上就是本文的主要內(nèi)容。本文將以Java語言為編程語言,詳細(xì)講解了如何使用Jsoup對Web網(wǎng)頁知識進(jìn)行爬取,結(jié)合EasyExcel將網(wǎng)頁表格轉(zhuǎn)換成Excel表格,同時文中給出了詳細(xì)的示例代碼。
到此這篇關(guān)于使用Java快速將Web中表格轉(zhuǎn)換成Excel的方法的文章就介紹到這了,更多相關(guān)Java將Web表格轉(zhuǎn)換Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基于Netty實現(xiàn)Http server的實戰(zhàn)
本文主要介紹了Java基于Netty實現(xiàn)Http server的實戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02解決spring中redistemplate不能用通配符keys查出相應(yīng)Key的問題
這篇文章主要介紹了解決spring中redistemplate不能用通配符keys查出相應(yīng)Key的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11關(guān)于java.math.BigDecimal比較大小問題
這篇文章主要介紹了關(guān)于java.math.BigDecimal比較大小問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07Java實現(xiàn)Linux下雙守護(hù)進(jìn)程
這篇文章主要介紹了Java實現(xiàn)Linux下雙守護(hù)進(jìn)程的思路、原理以及具體實現(xiàn)方式,非常的詳細(xì),希望對大家有所幫助2014-10-10mybatis-plus用insertBatchSomeColumn方法批量新增指定字段
mybatisPlus底層的新增方法是一條一條的新增的,下面這篇文章主要給大家介紹了關(guān)于mybatis-plus用insertBatchSomeColumn方法批量新增指定字段的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05Java如何獲取一個隨機(jī)數(shù) Java猜數(shù)字小游戲
這篇文章主要為大家詳細(xì)介紹了Java如何獲取一個隨機(jī)數(shù),類似猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組的實現(xiàn)與應(yīng)用
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中稀疏數(shù)組的實現(xiàn)與應(yīng)用,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以了解一下2022-10-10