行政区划获取
行政区划获取
- 一、导入jar包
- 二、代码展示
背景:
公司的行政区划代码有问题,有的没有街道信息,有的关联信息有误,然后找到了国家的网站国家统计局-行政区划,这个里面是包含了所有的行政信息,但是全是html页面,这个就没法自动获取了,只能去爬取这个数据了,java语音有三方类库Jsoup,他是一个仿浏览器的三方库,可以通过他来获取页面信息。
一、导入jar包
下面是笔者用到的全部jar包
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.1.1-jre</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-json</artifactId><version>5.4.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.44</version></dependency><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.14.3</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.5.4</version></dependency>
这里说下,maven配置要从阿里云下载jar,若是从中央仓库将会非常的慢。
阿里云私服:http://maven.aliyun.com/nexus/content/repositories/central/
二、代码展示
这里是代码的展示,笔者是网上搜的代码改造的,不然网站有反爬,大概爬取2000条左右就会中断,笔者加了延时这样就避开了反爬(可能还有别的规避措施)。这里爬取的是4级行政区划:省、市、区县、街道
package com.cheng.controller;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.util.*;
/**
-
@author pcc
-
@version 1.0.0
-
@className JsoupTest
-
@date 2023-03-02 10:39
*/
public class JsoupTestPluMdm {
static int i = 1;static String url1 = “http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2022”;
static String url2 = “”;
public static void main(String[] args) throws IOException {try{List<Map<String,String>> listMap = new ArrayList<>();Document document = Jsoup.connect(url1).header("Cookie", "wzws_sessionid=oGQAAyWBMmNlMWZkgjdlZDJkMIAyMjEuMjM4LjEzMi41MA==; SF_cookie_1=15502425; wzws_cid=6e8cdc0aea81349b05c8a0b6c05cd7204b6e0f10e5a48d462175473d23abcb4891edf1ceb73464398cb1ce7e6f53999f7545dd0014a15b1fb4eec5c6cf37421f0c2b08528de36f728ec4c676ed264c7d").get();//获取他所有的省Elements elements = document.select("body > table:nth-child(3) > tbody > tr:nth-child(1) > td > table > tbody > tr:nth-child(2) > td > table > tbody > tr > td > table > tbody");//解析省的超链接Elements elements1 = elements.select("tbody > tr > td > a");for(int j=0;j<elements1.size();j++){
// Thread.sleep(100);
String s = elements1.get(j).select(“a”).attr(“href”);
String provinceCode = s.replaceAll(“.html”,“”)+“0000”;
System.out.println(“省代码:” + provinceCode);
String provinceName = elements1.get(j).text();
System.out.println(“省名称:” + provinceName);
Map<String,String> map = new HashMap<>();
map.put(provinceCode,provinceName);
listMap.add(map);
}
for (int i1 = 0; i1 <31; i1++) {System.out.println("**********************i********************:"+i);if(i%1000==0){Thread.sleep(1000*60*10);}Map<String, String> stringStringMap = listMap.get(i1);Iterator<Map.Entry<String, String>> iterator = stringStringMap.entrySet().iterator();while(iterator.hasNext()){Map.Entry<String,String> entry = iterator.next();String provinceCode = entry.getKey();String provinceName = entry.getValue();String index = provinceCode.substring(0,2)+".html";SXSSFWorkbook wb = new SXSSFWorkbook(100);SXSSFSheet sheet = (SXSSFSheet) wb.createSheet();// TODO 这里改成自己的地址即可,也可以存放到一个文件里String enterFileName = "C:\\Users\\pcc\\Desktop\\xingzhengquhua\\"+provinceName+".xlsx";FileOutputStream fileOut = new FileOutputStream(enterFileName);Row row = sheet.createRow(0);sheet.createRow(i).createCell(0).setCellValue(provinceCode);// idsheet.getRow(i).createCell(1).setCellValue(provinceName);// namesheet.getRow(i).createCell(2).setCellValue(""); // pidsheet.getRow(i).createCell(3).setCellValue("1"); // typei++;try {jsoupList2(url1 + "/" + index, provinceName, provinceCode, sheet);} catch (SocketTimeoutException e) {e.printStackTrace();jsoupList2(url1 + "/" + index, provinceName, provinceCode, sheet);} catch (ConnectException e) {e.printStackTrace();jsoupList2(url1 + "/" + index, provinceName, provinceCode, sheet);}row.createCell(0).setCellValue("id");row.createCell(1).setCellValue("district_name");row.createCell(2).setCellValue("pid");row.createCell(3).setCellValue("type");wb.write(fileOut);fileOut.close();}}}catch (Exception e){e.printStackTrace();}finally {}}//市级页面
public static void jsoupList2(String url,String provinceName,String provinceCode,SXSSFSheet sheet) throws Exception {String cityName = "";String cityCode = "";url2 = url.replace(".html","");Document document = Jsoup.connect(url).get();Elements elements = document.select("body > table:nth-child(3) > tbody > tr:nth-child(1) > td > table > tbody > tr:nth-child(2) > td > table > tbody > tr > td > table > tbody");Elements elements1 = elements.select("tbody > tr > td");//j从2开始是因为他有个表头 统计用区划代码 名称for (int j = 2; j < elements1.size(); j++) {System.out.println("**********************i********************:"+i);if(i%1000==0){Thread.sleep(1000*60*10);}
// Thread.sleep(500);
//判断是否是超链接,不是超链接也要获取数据
if(elements1.get(j).select(“td > a”).toString().equals(“”)){
String text = elements1.get(j).text();
if (j % 2 == 0) {
System.out.println(“市代码:” + text);
sheet.createRow(i).createCell(0).setCellValue(text);
} else {
System.out.println(“市名称:” + text);
sheet.getRow(i).createCell(1).setCellValue(text);
sheet.getRow(i).createCell(2).setCellValue(provinceCode);
sheet.getRow(i).createCell(3).setCellValue(“3”);
i++;
}
}else {
Elements elements2 = elements1.get(j).select(“td > a”);
for (int j1 = 0; j1 < elements2.size(); j1++) {
String text = elements2.get(j1).text();
if (j % 2 == 0) {
System.out.println(“市代码:” + text);
cityCode = text;
sheet.createRow(i).createCell(0).setCellValue(text);
} else {
System.out.println(“市名称:” + text);
cityName = text;
sheet.getRow(i).createCell(1).setCellValue(text);
sheet.getRow(i).createCell(2).setCellValue(provinceCode);
sheet.getRow(i).createCell(3).setCellValue(“2”);
i++;
String s = elements2.get(j1).select(“a”).attr(“href”);
//TODO 这里排除了海南的几个市区,更改为不排除任何市区
if(true) {
try {
jsoupList3(url1 + “/” + s,cityName,cityCode,provinceName,provinceCode, sheet);
} catch (SocketTimeoutException e) {
e.printStackTrace();
jsoupList3(url1 + “/” + s,cityName,cityCode,provinceName,provinceCode, sheet);
} catch (ConnectException e) {
e.printStackTrace();
jsoupList3(url1 + “/” + s,cityName,cityCode,provinceName,provinceCode, sheet);
}
}
}
}
}
}
}
//县级页面
public static void jsoupList3(String url,String cityName,String cityCode,String provinceName,String provinceCode,SXSSFSheet sheet) throws Exception {
Document document = Jsoup.connect(url).get();
Elements elements = document.select(“body > table:nth-child(3) > tbody > tr:nth-child(1) > td > table > tbody > tr:nth-child(2) > td > table > tbody > tr > td > table > tbody”);
Elements elements1 = elements.select(“tbody > tr > td”);
String xianName = “”;
String xianCode = “”;
//j从2开始是因为他有个表头 统计用区划代码 名称
for (int j = 2; j < elements1.size(); j++) {
System.out.println(“i:"+i);
if(i%1000==0){
Thread.sleep(10006010);
}
// Thread.sleep(500);
//判断是否是超链接,不是超链接也要获取数据
if(elements1.get(j).select(“td > a”).toString().equals(”“)){
String text = elements1.get(j).text();
if (j % 2 == 0) {
System.out.println(“县代码:” + text);
sheet.createRow(i).createCell(0).setCellValue(text);
} else {
System.out.println(“县名称:” + text);
sheet.getRow(i).createCell(1).setCellValue(text);
sheet.getRow(i).createCell(2).setCellValue(cityCode);
sheet.getRow(i).createCell(3).setCellValue(“3”);
i++;
}
}else {
Elements elements2 = elements1.get(j).select(“td > a”);
for (int j1 = 0; j1 < elements2.size(); j1++) {
String text = elements2.get(j1).text();
xianName = text;
if (j % 2 == 0) {
xianCode = text;
System.out.println(“县代码:” + xianCode);
sheet.createRow(i).createCell(0).setCellValue(text);
} else {
System.out.println(“县名称:” + text);
sheet.getRow(i).createCell(1).setCellValue(text);
sheet.getRow(i).createCell(2).setCellValue(cityCode);
sheet.getRow(i).createCell(3).setCellValue(“3”);
i++;
String s = elements2.get(j1).select(“a”).attr(“href”);
try {
jsoupList4(url1 + “/” +provinceCode.substring(0,2)+”/“+ s,xianName,xianCode,cityName,cityCode,provinceName,provinceCode, sheet);
} catch (SocketTimeoutException e) {
e.printStackTrace();
jsoupList4(url1 + “/” +provinceCode.substring(0,2)+”/“+ s,xianName,xianCode,cityName,cityCode,provinceName,provinceCode, sheet);
} catch (ConnectException e) {
e.printStackTrace();
jsoupList4(url1 + “/” +provinceCode.substring(0,2)+”/"+ s,xianName,xianCode,cityName,cityCode,provinceName,provinceCode, sheet);
}
}
}
}
}
}
//街道页面
public static void jsoupList4(String url,String xianName,String xianCode,String cityName,String cityCode,String provinceName,String provinceCode,SXSSFSheet sheet) throws Exception {Document document = Jsoup.connect(url).get();Elements elements = document.select("body > table:nth-child(3) > tbody > tr:nth-child(1) > td > table > tbody > tr:nth-child(2) > td > table > tbody > tr > td > table > tbody");Elements elements1 = elements.select("tbody > tr > td");//j从2开始是因为他有个表头 统计用区划代码 名称for (int j = 2; j < elements1.size(); j++) {System.out.println("**********************i********************:"+i);if(i%1000==0){Thread.sleep(1000*60*10);}
// Thread.sleep(500);
//判断是否是超链接,不是超链接也要获取数据
if(elements1.get(j).select(“td > a”).toString().equals(“”)){
String text = elements1.get(j).text();
if (j % 2 == 0) {
System.out.println(“街道代码:” + text);
sheet.createRow(i).createCell(0).setCellValue(text);
} else {
System.out.println(“街道名称:” + text);
sheet.getRow(i).createCell(1).setCellValue(text);
sheet.getRow(i).createCell(2).setCellValue(xianCode);
sheet.getRow(i).createCell(3).setCellValue(“4”);
i++;
}
}else {
Elements elements2 = elements1.get(j).select(“td > a”);
for (int j1 = 0; j1 < elements2.size(); j1++) {
String text = elements2.get(j1).text();
if (j % 2 == 0) {
System.out.println(“街道代码:” + text);// TODO 这里不能截取,不然街道界别数据截不全
sheet.createRow(i).createCell(0).setCellValue(text);
} else {
System.out.println(“街道名称:” + text);
sheet.getRow(i).createCell(1).setCellValue(text);
sheet.getRow(i).createCell(2).setCellValue(xianCode);
sheet.getRow(i).createCell(3).setCellValue(“4”);
i++;
}
}
}
}
}
}
相关文章:
行政区划获取
行政区划获取一、导入jar包二、代码展示背景:公司的行政区划代码有问题,有的没有街道信息,有的关联信息有误,然后找到了国家的网站国家统计局-行政区划,这个里面是包含了所有的行政信息,但是全是html页面&a…...

让ChatGPT介绍一下ChatGPT
申请新必应内测通过了,我在New Bing中使用下ChatGPT,让ChatGPT介绍一下ChatGPT 问题1:帮我生成一篇介绍chatGPT的文章,不少于2000字 回答: chatGPT是什么?它有什么特点和用途? chatGPT是一种…...

【Redis】Redis 主从复制 + 读写分离
Redis 主从复制 读写分离1. Redis 主从复制 读写分离介绍1.1 从数据持久化到服务高可用1.2 主从复制1.3 如何保证主从数据一致性?1.4 为何采用读写分离模式?2. 一主两从环境准备2.1 配置文件2.2 启动 Redis3. 主从复制原理3.1 全量同步3.1.1 建立连接3…...

2023届秋招,鬼知道我经历了什么
仅记录个人经历,充满主观感受,甚至纯属虚构,仅供参考,杠就是你对 本想毕业再写,但是考虑到等毕业了,24秋招的提前批就快开始了,大概就来不及了,正好现在有点时间,陆陆续…...

ChatGPT助力校招----面试问题分享(一)
1 ChatGPT每日一题:期望薪资是多少 问题:面试官问期望薪资是多少,如何回答 ChatGPT:当面试官问及期望薪资时,以下是一些建议的回答方法: 1、调查市场行情:在回答之前,可以先调查一…...

CSS媒体查询@media (prefers-color-scheme:dark)判断系统白天黑夜模式
前言 在最近学习中突然看到了在媒体查询中prefers-color-scheme:dark监听的使用,然后就模仿里边写了个简单例子,代码如下: body {background-color: #f5f5f5;}media (prefers-color-scheme: dark) {body {background-color: #666;}}然后通过…...

运行YOLOv8实现识别
https://github.com/ultralytics/ultralyticshttps://docs.ultralytics.com/环境配置官方环境要求Python>3.7(我是python3.8也是可以用的) environment with PyTorch>1.7.这是ultralyticsCommand Line Interface命令行接口运行输入参数的格式yolo …...

如何在Linux中优雅的使用 head 命令,用来看日志简直溜的不行
当您在 Linux 的命令行上工作时,有时希望快速查看文件的第一行,例如,有个日志文件不断更新,希望每次都查看日志文件的前 10 行。很多朋友使用文本编辑的命令是vim,但还有个命令head也可以让轻松查看文件的第一行。 在…...
Nginx.conf 配置详解
#安全问题,建议用nobody,不要用root. #user nobody; #worker数和服务器的cpu数相等是最为适宜 worker_processes 2; #work绑定cpu(4 work绑定4cpu) worker_cpu_affinity 0001 0010 0100 1000 #error_log path(存放路径) level(日志等级) path表示日志路径&…...

剖析NLP历史,看chatGPT的发展
1、NLP历史演进 1.1 NLP有监督范式 NLP里的有监督任务的范式,可以归纳成如下的样子。 输入是字词序列,中间一步关键的是语义表征,有了语义表征之后,然后交给下游的模型学习。所以预训练技术的发展,都是在围绕怎么…...
20个Python使用小技巧,建议收藏~
1、易混淆操作 本节对一些 Python 易混淆的操作进行对比。 1.1 有放回随机采样和无放回随机采样 import random random.choices(seq, k1) # 长度为k的list,有放回采样 random.sample(seq, k) # 长度为k的list,无放回采样1.2 lambda 函数的参数 …...
Kafka 主题管理
Kafka 主题管理创建主题查看主题修改主题内部主题异常主题删除失败创建主题 创建 Kafka 主题 create : 创建主题partitions : 主题的分区数replication-factor : 每个分区下的副本数 bin/kafka-topics.sh \ --bootstrap-server broker_host:port \ --create --topic my_topi…...

【深度学习】GPT系列模型:语言理解能力的革新
GPT-1🏡 自然语言理解包括一系列不同的任务,例如文本蕴涵、问答、语义相似度评估和文档分类。尽管大量的未标记文本语料库很充足,但用于学习这些特定任务的标记数据却很稀缺,使得判别式训练模型难以达到良好的表现。我们证明&…...
【Vue.js】全局状态管理模式插件vuex
文章目录全局状态管理模式Vuexvuex是什么?什么是“状态管理模式”?vuex的应用场景Vuex安装开始核心概念一、State1、单一状态树2、在 Vue 组件中获得 Vuex 状态3、mapState辅助函数二、Getter三、Mutation1、提交载荷(Payload)2、…...

JPA 之 Hibernate EntityManager 使用指南
Hibernate EntityManager 专题 参考: JPA – EntityManager常用API详解EntityManager基本概念 基本概念及获得 EntityManager 对象 基本概念 在使用持久化工具的时候,一般都有一个对象来操作数据库,在原生的Hibernate中叫做Session&…...
英语作文提示(持续更新)
星期(介词on)Monday星期一Tuesday星期二Wednesday星期三Thursday星期四Friday星期五Saturday星期六Sunday星期日月份(介词in)lunar calendar农历on the second day of the second lunar农历初二January1月February2月March3月Apri…...

【计算机组成原理】计算机的性能指标、数据的表示和运算、BCD码和余3码
计算机组成原理(二) 计算机的性能指标: 存储器的性能指标: 存储器中,MAR为存储单元的个数 MDR为机械字长也就是存储单元的长度 存储器的大小MAR*MDR n为二进制位能表示出几种不同的状态呢? 2的n次方种不同的状态 CPU的性能指标…...

三天吃透MySQL八股文(2023最新整理)
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...
队列_23约瑟夫问题+_24猫狗收容所
约瑟夫问题 n 个小孩围坐成一圈,并按顺时针编号为1,2,…,n,从编号为 p 的小孩顺时针依次报数,由1报到m ,当报到 m 时,该小孩从圈中出去,然后下一个再从1报数,当报到 m 时再出去。如此反复&#…...
gradle
Gradle环境介绍OpenJDK 17.0.5Gradle 7.6示例代码 fly-gradleGradle 项目下文件介绍如果你的电脑安装了 gradle,可以使用 gradle init 去初始化一个新的 gradle 工程,然后使用电脑安装的 gradle 去执行构建命令。但是每个开发电脑上的 gradle 版本不一样…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...