首页 > 其他分享 >从国家统计局网站爬取省级到村级别的行政区划代码(2022最新)

从国家统计局网站爬取省级到村级别的行政区划代码(2022最新)

时间:2023-03-07 14:36:02浏览次数:124  
标签:substring areaid 2022 strs 爬取 indexOf si 村级 String


import cn.hutool.http.HttpUtil;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;


/**
* 从国家统计局网站爬取省级到村级别的行政区划代码
*/
public class Area {
public static final String baseUrl = "http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2022/";
//设置utf-8 2020版需要用GBK
public static final String CHARSET = "utf-8";

public static StringBuffer result = new StringBuffer();


/**
* 读省的信息
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String url = baseUrl + "index.html";
//如果需要设置代理
//initProxy("10.10.13.200", "80");
// String str = getContent(url).toUpperCase();
String str = HttpUtil.get(url).toUpperCase();
String[] arrs = str.split("<A");

for (String s : arrs) {
if (s.indexOf("HREF") != -1 && s.indexOf(".HTML") != -1) {
//2020版用的是 ' ,不是 \",BR后面没有空格,市县同理
String a = s.substring(7, s.indexOf("\">"));
String areaid = a.replace(".HTML", "") + "0000";
String name = s.substring(s.indexOf("\">") + 2, s.indexOf("<BR />"));
saveCity(areaid, name, "0", 1);
System.out.println("爬取:" + areaid + "---" + name);
boolean success = false;
while (!success) {
try {
readShi(a, areaid);
success = true;
} catch (Exception e) {
e.printStackTrace();
success = false;
Thread.sleep(60000);
}
}

}
}
}

/**
* 读市的数据
*
* @param -list
* @throws Exception
*/
public static void readShi(String url, String paretid) throws Exception {
String content = getContent(baseUrl + url).toUpperCase();
String[] citys = content.split("CITYTR");
//\"><TD><A HREF=\"11/1101.HTML\">110100000000</A></TD><TD><A HREF=\"11/1101.HTML\">市辖区</A></TD></td><TR CLASS=\"
for (int c = 1, len = citys.length; c < len; c++) {
String[] strs = citys[c].split("<A HREF=\"");
String cityUrl = null;
String areaid = "";
String areaname = "";
for (int si = 1; si < 3; si++) {
if (si == 1) {//取链接和编码
cityUrl = strs[si].substring(0, strs[si].indexOf("\">"));
areaid = strs[si].substring(strs[si].indexOf("\">") + 2, strs[si].indexOf("</A>"));
} else {
areaname = strs[si].substring(strs[si].indexOf("\">") + 2, strs[si].indexOf("</A>"));
System.out.println("爬取:" + strs[si].substring(strs[si].indexOf("\">") + 2, strs[si].indexOf("</A>")));
}
}
saveCity(areaid, areaname, paretid, 2);
boolean success = false;
while (!success) {
try {
readXian(cityUrl.substring(0, cityUrl.indexOf("/") + 1), cityUrl, areaid);
success = true;
} catch (IOException e) {
e.printStackTrace();
success = false;
Thread.sleep(60000);
}
}
}
}

/**
* 读县的数据
*
* @param url
* @throws Exception
*/
public static void readXian(String prix, String url, String paretid) throws Exception {
String content = getContent(baseUrl + url).toUpperCase();
String[] citys = content.split("COUNTYTR");
for (int i = 1; i < citys.length; i++) {
String cityUrl = null;
String areaid = "";
String areaname = "";
//发现石家庄有一个县居然没超链接,特殊处理
if (citys[i].indexOf("<A HREF=\"") == -1) {
areaid = citys[i].substring(6, 18);
areaname = citys[i].substring(citys[i].indexOf("</TD><TD>") + 9, citys[i].lastIndexOf("</TD>"));
} else {
String[] strs = citys[i].split("<A HREF=\"");
for (int si = 1; si < 3; si++) {
if (si == 1) {//取链接和编码
cityUrl = strs[si].substring(0, strs[si].indexOf("\">"));
areaid = strs[si].substring(strs[si].indexOf("\">") + 2, strs[si].indexOf("</A>"));
} else {
areaname = strs[si].substring(strs[si].indexOf("\">") + 2, strs[si].indexOf("</A>"));
}
}
}
saveCity(areaid, areaname, paretid, 3);
boolean success = false;
while (!success) {
try {
if (null != cityUrl) {
readZhen(prix, cityUrl, areaid);
}
success = true;
} catch (IOException e) {
e.printStackTrace();
success = false;
Thread.sleep(60000);
}
}
}
}

/**
* 读镇的数据
*
* @param url
* @throws Exception
*/
public static void readZhen(String prix, String url, String paretid) throws Exception {
String content = getContent(baseUrl + prix + url).toUpperCase();
String myPrix = (prix + url).substring(0, (prix + url).lastIndexOf("/") + 1);
String[] citys = content.split("TOWNTR");
for (int i = 1; i < citys.length; i++) {
String[] strs = citys[i].split("<A HREF=\"");
String cityUrl = null;
String areaid = "";
String areaname = "";
for (int si = 1; si < 3; si++) {
if (si == 1) {//取链接和编码
cityUrl = strs[si].substring(0, strs[si].indexOf("\">"));
areaid = strs[si].substring(strs[si].indexOf("\">") + 2, strs[si].indexOf("</A>"));

} else {
areaname = strs[si].substring(strs[si].indexOf("\">") + 2, strs[si].indexOf("</A>"));
}
}
saveCity(areaid, areaname, paretid, 4);
}
}

/**
* 读村/街道的数据
*
* @param url
* @throws Exception
*/
public static void readCun(String prix, String url, BufferedWriter bw) throws Exception {
String content = getContent(baseUrl + prix + url).toUpperCase();
String[] citys = content.split("VILLAGETR");
for (int i = 1; i < citys.length; i++) {
String[] strs = citys[i].split("<TD>");

bw.write("<tr><td>");
bw.write(strs[1].substring(0, strs[1].indexOf("</TD>")));
bw.write("</td>");

bw.write("<td></td><td></td><td></td><td></td>");
bw.write("<td>");
bw.write(strs[2].substring(0, strs[2].indexOf("</TD>")));
bw.write("</td><td>");
bw.write(strs[3].substring(0, strs[3].indexOf("</TD>")));
bw.write("</td></tr>");
}
}


//设置代理
public static void initProxy(String host, String port) {
System.setProperty("http.proxyType", "4");
System.setProperty("http.proxyPort", port);
System.setProperty("http.proxyHost", host);
System.setProperty("http.proxySet", "true");
}


//获取网页的内容
public static String getContent(String strUrl) throws Exception {
try {
URL url = new URL(strUrl);
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(), Charset.forName(CHARSET)));
String s = "";
StringBuffer sb = new StringBuffer("");
while ((s = br.readLine()) != null) {
sb.append(s);
}
br.close();
return sb.toString();
} catch (Exception e) {
System.out.println("can\"t open url:" + strUrl);
throw e;
}
}


public static void saveCity(String areaid, String areaname, String paretid, int level) {
try {
String URL = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false";
String USER = "root";
String PASSWORD = "*******";
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2.获得数据库链接
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
//3.通过数据库的连接操作数据库,实现增删改查(使用Statement类)
String s = "insert into area(code,`name`,p_code,`level`) values(?,?,?,?)";
PreparedStatement pst = conn.prepareStatement(s);

pst.setString(1, level > 3 ? areaid.substring(0, 9) : areaid.substring(0, 6));
pst.setString(2, areaname);
pst.setString(3, paretid.replace("000000", ""));
pst.setInt(4, level);

pst.execute();
//关闭资源
pst.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

标签:substring,areaid,2022,strs,爬取,indexOf,si,村级,String
From: https://www.cnblogs.com/LuJunlong/p/17187987.html

相关文章

  • 使用pycharm2022社区版搭建Django
    因为使用的是pycharm社区版,免费的没有直接搭建Django项目,所以查了半天资料,摸索了半天,才跑起来,用此文记录下。1.使用pycharm创建项目,安装项目创建好后,大概会有个虚拟环......
  • 【专题】深度学习平台发展报告(2022年)PDF合集分享(附原数据表)
    报告链接:http://tecdat.cn/?p=31689原文出处:拓端数据公众号深度学习平台市场目前正经历着巨大的增长阶段。头部企业通过整合算力、研发、部署、行业应用等AI服务能力,布局......
  • 【愚公系列】2022年03月 .NET架构班 020-ABP vNext 虚拟文件系统
    【摘要】前言虚拟文件系统可以管理文件系统(磁盘)上实际不存在的文件。它主要用于将(js,css,image,cshtml…)文件嵌入到程序集中,并在运行时将它们用作物理文件。一、集成虚拟......
  • luogu P8341 [AHOI2022] 回忆
    题面传送门恭喜你发现一只写挂了却质疑自己贪心错了的纯纯sb。首先一个简单的猜想就是维护每个子树内向上的路径,如果两个子树之间路径可以合并就合并。但是这是有问题的......
  • 2022年第十三届蓝桥杯大赛软件类省赛C/C++大学A组真题
    Preface周末没什么比赛打索性开始准备下蓝桥杯,然后就想着找一下去年的真题来做一下结果yysy去年的真题说实话有点难度的,感觉出题风格偏向OI比赛而和ACM的风格不太像啊感......
  • luogu P8367 [LNOI2022] 盒
    题面传送门比较厉害的题目。首先我们发现我们只需要计算\(i\)和\(i+1\)之间经过的货物数,也即设\(a\)的前缀和为\(Sum\),\(b\)的前缀和为\(c\),则\(i\toi+1\)......
  • D. Hard Tasks【GDUT 2022 grade Qualifying】
    D.HardTasks原题链接题意给出一个数n,询问1-n中有多少对组合(三个数)相加不需要进位思路1-10有{0,1,2},{1,2,3},{2,3,4}共3对10-20有{10,11,12},{11,12,13},{12,13,......
  • C Make it in a Line【GDUT 2022 grade Qualifying #1】
    C MakeitinaLine原题链接题意求出三维n×n×n中的满足条件的总数题解只看底面一个面n个点在一个平面内,一共有n个面:\(n(2n+2)\)(行列+对角线)n个点在垂直底......
  • A Calculus【GDUT 2022 grade Qualifying #1】
    A CalculusChipmunkisamathgenius,andheisextraordinarilygoodatcalculus.NowChipmunkgivesyouaformulaandasksyoutocalculateitinoneminute,......
  • 数之联官网新闻爬取
    importrequestsimportpandasaspdimportrandomfromtimeimportsleepimportjsondefshuzhilian(keyword):foriinrange(1,20):baseurl=......