【2021最新】java爬取国家统计局>>统计⽤区划和城乡划分代码
⼀、爬取准备⼯作
1. 本次爬取要⽤到的⼯具为Jsoup,引⼊Jsoup pom依赖:
<!-- JSOUP 解析-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
2. 实体类:为了便于保存,使⽤实体类,然后转换为你们需要的格式,json或者存⼊数据库等操作。
属性注释
id(当前市/区/县/乡) 代码
pid(当前市/区/县/乡) ⽗级代码
name(当前市/区/县/乡) 名称
treeLevel(当前市/区/县/乡) 层级
leaf(当前市/区/县/乡) 是否叶⼦节点
sort(当前市/区/县/乡) 排序
@Data
@EqualsAndHashCode(callSuper =false)
@Accessors(chain =true)
public class SysRegion implements Serializable {
private static final long serialVersionUID=1L;
/
**
* id
*/
@TableId("id")
private Long id;
/**
* 上级ID,⼀级为0
*/
@TableField("pid")
private Long pid;
/**
* 名称
*/
@TableField("name")
private String name;
/**
* 层级
*/
@TableField("tree_level")
private Integer treeLevel;
/**
* 是否叶⼦节点  0:否  1:是
*/
@TableField("leaf")
private Integer leaf;
/**
* 排序
*/
@TableField("sort")
private Long sort;
}
⼆、代码
爬取全国所有城乡太耗时了,所以这⾥我在代码⾥做了逻辑判断,使其只爬取浙江省,宁波市的所有信息,如果你们有其他需求可以在此代码上做更改。
/**
* Mark Yu on 2021/9/10
*/
public class RegionCodeCrawling{
// 固定写法:国家统计局的⾸页链接
private static final String link ="v/tjsj/tjbz/tjyqhdmhcxhfdm/2020/";
// 保存结果集的集合
private static List<SysRegion> regions =new ArrayList<>();
public static void main(String[] args)throws IOException {
// 爬取省份
Document document = t(link).get();
/
*
<tr class="provincetr">
<tr class="provincetr">
<td><a href="11.html">北京市<br></a></td>
</tr>
*/
Elements provincetrAll = document.select(".provincetr");
for(Element provincetr : provincetrAll){
for(Element td:provincetr.children()){
Elements a = td.select("a");
String href = a.attr("href");// 11.html
String name = a.text();// 浙江省
if(name.equals("浙江省")){
getShi(href);
}
}
}
}
// 爬取市
private static void getShi(String shiHref)throws IOException {
Document document = t(link+shiHref).get();
/*
<tr class="citytr">
<td><a href="33/3309.html">330900000000</a></td>
<td><a href="33/3309.html">⾈⼭市</a></td>
</tr>
*/
Elements citytrAll = document.select(".citytr");
for(Element citytr:citytrAll){
Element codetd = citytr.child(0);
Element nametd = citytr.child(1);
String href = codetd.select("a").attr("href");// 33/3308.html
String code = codetd.select("a").text();// 330800000000
String name = nametd.select("a").text();// 衢州市
if(name.equals("宁波市")){
SysRegion region =new SysRegion();
region.setId(Long.valueOf(code));
region.setPid(0L);
region.setName(name);
// 这⾥的排序写死,层级树设置为第⼀层。
// 因为我的业务逻辑只拿宁波市的乡镇信息。
// 如果你有其他需求,请在循环外部设置计数器。(例如:下⾯的区和街道逻辑)                region.setTreeLevel(1);
region.setSort(1L);
regions.add(region);
getQu(href,code);
java图书馆最新}
}
}
// 爬取区
private static void getQu(String countryHref,String cityCode)throws IOException {
Document document = t(link+countryHref).get();
/*
<tr class="countytr">
<td><a href="02/330203.html">330203000000</a></td>
<td><a href="02/330203.html">海曙区</a></td>
</tr>
*/
*/
Elements countryAll = document.select(".countytr");
// 这⾥的sort没有从0开始增加,是因为市下的第⼀级为市辖区,该级下⽆⼦级,⽤不着采集。所以直接跳过。
long sort =-1;
for(Element countrytr:countryAll){
sort++;
if(sort>0){
Element codetd = countrytr.child(0);
Element nametd = countrytr.child(1);
String href = codetd.select("a").attr("href");// 02/330281.html
String code = codetd.select("a").text();// 330281000000
String name = nametd.select("a").text();// 余姚市
SysRegion region =new SysRegion();
region.setId(Long.valueOf(code));
region.setPid(Long.valueOf(cityCode));
region.setName(name);
region.setTreeLevel(2);
region.setLeaf(1);
region.setSort(sort);
regions.add(region);
getJiedao(href,code);
}
}
}
// 爬取乡镇(街道)
private static void getJiedao(String jiedaoHref,String countryCode)throws IOException {
Document document = t(link+countryCode.substring(0,2)+"/"+jiedaoHref).get();
/*
<tr class="towntr">
<td><a href="12/330212001.html">330212001000</a></td>
<td><a href="12/330212001.html">下应街道</a></td>
</tr>
*/
Elements townAll = document.select(".towntr");
long sort =0;
for(Element towntr:townAll){
Element codetd = towntr.child(0);
Element nametd = towntr.child(1);
String href = codetd.select("a").attr("href");// 12/330212001.html
String code = codetd.select("a").text();// 330212001000
String name = nametd.select("a").text();// 下应街道
SysRegion region =new SysRegion();
region.setId(Long.valueOf(code));
region.setPid(Long.valueOf(countryCode));
region.setName(name);
region.setTreeLevel(3);
region.setLeaf(1);
sort++;
region.setSort(sort);
regions.add(region);
getShequ(href,code);
}
}
/
/ 爬取村(社区)
private static void getShequ(String shequHref,String townCode)throws IOException {
String a = townCode.substring(0,2);
String b = townCode.substring(2,4);
Document document = t(link+a+"/"+b+"/"+shequHref).get();
/*
<tr class="villagetr">
<td>330212001209</td>
<td>112</td>
<td>胜利村村委会</td>
</tr>
*/
Elements villagetrAll = document.select(".villagetr");
long sort =0;
for(Element villagetr:villagetrAll){
Element codetd = villagetr.child(0);
Element nametd = villagetr.child(2);
String code = ();// 330212001005
String name = ();// 东兴社区居委会
SysRegion region =new SysRegion();
region.setId(Long.valueOf(code));
region.setPid(Long.valueOf(townCode));
region.setName(name);
region.setTreeLevel(4);
region.setLeaf(1);
sort++;
region.setSort(sort);
regions.add(region);
}
}
}
三、总结
1. ⽹上⼤多数使⽤的都是httpclient等解析⼯具,本代码直接使⽤了jsoup,api全⾯便捷,代码量少。
2. 因为本⼈存在具体采集需求,所以代码⾥只采集了宁波市以下的信息。如果读者有其他需求,可在本代码上进⾏更改,代码不难,易
读。
3. 如果觉得好⽤⿇烦点个关注,收藏,谢谢⼤家。