使用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初始化省市区三级数据相关推荐

  1. Java中省市区三级联动,附前后台及数据库

    Java中省市区三级联动,附前后台及数据库 实体pojo @Entity @Table(name = "province_city_district") @Data public ...

  2. java封装省市区三级json格式,2016中国省市区三级联动json格式.pdf

    2016中国省市区三级联动json格式 2016 年中国省市区三级联的JSON 格式 {"北京市":{"name":"北京市"," ...

  3. java封装省市区三级json格式,微信开发 使用picker封装省市区三级联动模板

    目前学习小程序更多的是看看能否二次封装其它组件,利于以后能快速开发各种小程序应用.目前发现picker的selector模式只有一级下拉,那么我们是否可以通过3个picker来实现三级联动模板的形式来 ...

  4. python处理完数据导入数据库_全国最新行政区划省市区三级数据表(2018年9月),可直接用Python处理后导入数据库...

    本资料为最新整理的全国行政区划数据表,数据截至到2018年9月1日,共包含省市区4291个(34个省份 396个城市 3857个区县),内容包含名称.全称.全拼.简拼.省市区聚合.邮编.经度.纬度等! ...

  5. el-cascader省市区 三级数据

    export default {areajson: [{value: '110000',label: '北京',children: [{value: '110100',label: '北京市',chi ...

  6. jquery实现省市区三级联动

    jquery实现省市区三级联动 最近项目需要用到关于省市区三级联动下拉选择的功能,于是乎网上搜了一些做法,觉得有一些只是给出了小的案例,却很难找到详细的省.市.区的具体数据(其实,用baidu搜索就是 ...

  7. 微信小程序 省市区三级地址选择实现

    国际惯例 上效果图: 省市区三级联动,选择省自动刷新市,选择市自动刷新区,点击取消自动返回上一级重新选择,点击确定,保存地址. 数据库 这份数据库是某天在网上逛到的,当时未记录出处,直接贴出给读者使用 ...

  8. WheelView实现省市区三级联动(数据库实现版本号附带完整SQL及数据)

    近期在实现收货地址功能.用到了省市区三级联动效果.网上找到一般都是xml或json,数据源陈旧改动麻烦,改动了一下使用数据库方式实现了一下 数据源解决,因为数据量比較大通过初始化批量运行SQL的方式不 ...

  9. 实战演练-java+微信小程序实现省市区三级联动

    最终效果图 官方的"省市区选择器"mode="region"里的数据是定死的由微信提供,不能做更改,好在同是picker组件mode="multiSe ...

最新文章

  1. kotlin ++ --_顺便说一句-探索Kotlin代表团
  2. Almost All Divisors
  3. embed中 src属性动态更改。
  4. java排序算法大全_各种排序算法的分析及java实现
  5. interp1函数matlab_【原创】干货:用MATLAB搭建电化学单粒子模型(中)
  6. linux java 输出_Java远程连接linux的方法,执行命令并输出结果
  7. SpringMVC子父容器源码剖析
  8. 计算机统考第五次作业操作题,计算机基础第5次作业 第五章 Powerpoint知识题
  9. 从有理数到实数(序)
  10. idea实现抽象类的所有抽象方法_父类子类抽象类,super final 重写方法,搞懂继承中复杂的知识点
  11. 一篇文章让你学透Linux系统中的more命令
  12. Bailian4136 矩形分割【差分】
  13. noip2013提高组初赛(答案+选择题题目+个人分析)
  14. 机器学习中最重要的公式——贝叶斯公式
  15. 电脑重置后需要清除tpm吗
  16. 5G网络用户面时延测量
  17. 计算机提示无法识别usb,电脑提示“无法识别的USB设备”如何解决?
  18. JavaScript判断浏览器内核
  19. java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to
  20. 电路板之间接线的注意方法

热门文章

  1. JQuery 详细教程
  2. Vue进阶(幺肆伍):Vue-elementUI实现操作栏位更多效果
  3. 神朔 计算机联锁,神朔铁路2019年1月计算机联锁设备采购项目招标公告
  4. 解决安装python3.7.2时报错Setup failed,0x80072f7d-未指定的错误
  5. Favourite Blogger Lightroom Presets是一套内含15款lightroom预设的时尚博客调色效果lr预设。这些博客调色效果Lr预设适用于肖像摄影,生活摄影,创意摄影,旅游
  6. UVa #1533 Moving Pegs (习题7-12)
  7. 腾讯与华为数据之争谈物联网大数据发展之困
  8. 测试显卡的软件叫游戏什么,众多显卡监测软件和测试软件,到底哪个才是最适合你...
  9. 社会网络中基于标签传播的社区发现新算法
  10. navicat新建mysql用户_Navicat使用教程:在Navicat Premium中管理MySQL用户 - 第2部分:创建新用户...