日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java初始化省市区三级数据

發布時間:2024/1/1 java 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java初始化省市区三级数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用Jsoup爬蟲工具獲取全國地區數據(省市縣鎮村)

最近新做一個項目,要在數據庫初始化省市區三級數據,所以在網上找了個爬蟲工具,從國家統計局區劃代碼網站爬取了相關數據。具體原理不解釋了,只要能實現功能就OK。

  • 首先需要導入Jsoup相關依賴,數據庫和spring的依賴就不用我再說了吧!!
<!--爬蟲工具--> <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.14.2</version> </dependency>
  • 然后創建地區實體類
/*** @作者 yangs* @日期 2021/8/25* @描述 中國省市區*/ @Data @AllArgsConstructor @NoArgsConstructor @TableName(value = "area") public class Area implements Serializable {//主鍵,區劃代碼@TableId(value = "id")private String id;//上級區劃代碼@TableField(value = "parentId")private String parentId;//區域名稱,如山東省@TableField(value = "areaName")private String areaName;//區域等級,1代表省,2代表市,3代表區@TableField(value = "level")private Integer level; }
  • 接著編寫代碼,從http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020/這個網站爬取數據并存入數據庫,這個網站包含了全國省市縣鎮鄉所有數據,但是根據業務需要,本人業務只需要省市縣數據即可,各位可以根據自己的業務需求,修改相應代碼。
package com.yckj.appauth.service.impl;import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yckj.appauth.mapper.InitAreaMapper; import com.yckj.appauth.service.InitAreaService; import com.yckj.common.entity.Area; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.io.IOException; import java.util.HashMap; import java.util.Map;/*** @作者 yangs* @日期 2021/8/26* @描述 初始化省市區數據*/ @Service public class InitAreaServiceImpl extends ServiceImpl<InitAreaMapper, Area> implements InitAreaService {//這是DAO層@Autowiredprivate InitAreaMapper initAreaMapper;private static Map<Integer, String> cssMap = new HashMap<>();static {cssMap.put(1, "provincetr");// 省cssMap.put(2, "citytr");// 市cssMap.put(3, "countytr");// 縣//數據只需要統計省市區,所以把鎮和村注釋掉了。如果你需要鎮和村,直接打開注釋就行/*cssMap.put(4, "towntr");// 鎮cssMap.put(5, "villagetr");// 村*/}/*** @作者 yangs* @日期 2021/8/26* @描述 爬取數據直接存入數據庫,這是方法入口,使用controller調用即可*/public void initArea() {int level = 1;// 獲取全國各個省級信息Document connect = connect("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020/");Elements rowProvince = connect.select("tr." + cssMap.get(level));System.out.println("區劃代碼****上級代碼****區域名稱****區域等級");// 遍歷每一行的省份城市for (Element provinceElement : rowProvince) {Elements select = provinceElement.select("a");// 每一個省份(如:山東省)for (Element province : select) {String strprovince = province.toString();String areaName = strprovince.substring(strprovince.indexOf(".html\">") + 7, strprovince.indexOf("<br></a>"));String areaCode = "";switch (areaName) {case "北京市":areaCode = "110000";break;case "天津市":areaCode = "120000";break;case "河北省":areaCode = "130000";break;case "山西省":areaCode = "140000";break;case "內蒙古自治區":areaCode = "150000";break;case "遼寧省":areaCode = "210000";break;case "吉林省":areaCode = "220000";break;case "黑龍江省":areaCode = "230000";break;case "上海市":areaCode = "310000";break;case "江蘇省":areaCode = "320000";break;case "浙江省":areaCode = "330000";break;case "安徽省":areaCode = "340000";break;case "福建省":areaCode = "350000";break;case "江西省":areaCode = "360000";break;case "山東省":areaCode = "370000";break;case "河南省":areaCode = "410000";break;case "湖北省":areaCode = "420000";break;case "湖南省":areaCode = "430000";break;case "廣東省":areaCode = "440000";break;case "廣西壯族自治區":areaCode = "450000";break;case "海南省":areaCode = "460000";break;case "重慶市":areaCode = "500000";break;case "四川省":areaCode = "510000";break;case "貴州省":areaCode = "520000";break;case "云南省":areaCode = "530000";break;case "西藏自治區":areaCode = "540000";break;case "陜西省":areaCode = "610000";break;case "甘肅省":areaCode = "620000";break;case "青海省":areaCode = "630000";break;case "寧夏回族自治區":areaCode = "640000";break;case "新疆維吾爾自治區":areaCode = "650000";break;}//Area只有4個字段,ID代表區劃代碼,parentId代表上級區劃代碼,areaName代表區域名稱,level代表區域等級Area area = new Area();area.setId(areaCode);area.setParentId("root");area.setAreaName(areaName);area.setLevel(1);//把省級數據入庫initAreaMapper.insert(area);System.out.println(areaCode + "****root****" + areaName + "****" + 1);parseNextLevel(areaCode, province, level + 1);}}System.out.println("執行完畢");}/*** @作者 yangs* @日期 2021/8/26* @描述 遞歸讀取數據(根據業務需求,這里只讀取到區級)*/private void parseNextLevel(String parentId, Element parentElement, int level) {try {Thread.sleep(500);//睡眠一下,否則可能出現各種錯誤狀態碼} catch (InterruptedException e) {e.printStackTrace();}Document doc = connect(parentElement.attr("abs:href"));if (doc != null) {Elements newsHeadlines = doc.select("tr." + cssMap.get(level));// 獲取表格的一行數據for (Element element : newsHeadlines) {printInfo(parentId, element, level + 1);String code = element.select("td").first().text();Elements select = element.select("a");// 在遞歸調用的時候,這里是判斷是否是村一級的數據,村一級的數據沒有a標簽if (select.size() != 0) {parseNextLevel(code.substring(0, 6), select.last(), level + 1);}}}}/*** @作者 yangs* @日期 2021/8/26* @描述 打印市區并入庫*/private void printInfo(String parentId, Element element, int level) {String code = element.select("td").first().text();Area area = new Area();area.setId(code.substring(0, 6));area.setParentId(parentId);area.setAreaName(element.select("td").last().text());area.setLevel(level - 1);//把市和區數據入庫initAreaMapper.insert(area);System.out.println(area.getId() + "****" + area.getParentId() + "****" + area.getAreaName() + "****" + (level - 1));}private static Document connect(String url) {if (url == null || url.isEmpty()) {throw new IllegalArgumentException("The input url('" + url + "') is invalid!");}try {return Jsoup.connect(url).timeout(100 * 1000).get();} catch (IOException e) {e.printStackTrace();return null;}} }

感謝:本人是根據前輩的代碼改寫形成的,下面附上前輩博客鏈接:Jsoup獲取全國地區數據(省市縣鎮村)。

總結

以上是生活随笔為你收集整理的Java初始化省市区三级数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。