Advertisement

全国城市数据获取 mysql全国城市数据

阅读量:

全国城市数据@TOC

全国城市数据

数据来源 中华人民共和国民政部 根据国家发布的最新城市数据进行处理

访问页面查看数据

2020年中华人民共和国县以上行政区划代码(截止2020年12月31日)
点击后可查看全国县以上数据。

抓取数据

这个是急慌慌写出来的,然后就插到了我们自己的数据库了,感兴趣的可以看一下。
其中有个 com.fy.utils.JsonUtils 工具类 自己使用ObjectMapper即可,这里就不再单独展示了。

使用了jsoup对html进行处理

复制代码
    		<dependency>
    			<groupId>org.jsoup</groupId>
    			<artifactId>jsoup</artifactId>
    			<version>1.11.3</version>
    		</dependency>
    
    
      
      
      
      
      
    

实体

复制代码
    /** * */
    package com.fy.utils;
    
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    
    /** * @author
     * */
    public class CityModel implements Serializable{
    	
    	/** * */
    	private static final long serialVersionUID = 1L;
    
    	private Long code;
    	
    	private String name;
    	
    	private int layer;
    	
    	private Long parent;
    	
    	private List<CityModel> children = new ArrayList<CityModel>();
    
    	public Long getCode() {
    		return code;
    	}
    
    	public void setCode(Long code) {
    		this.code = code;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getLayer() {
    		return layer;
    	}
    
    	public void setLayer(int layer) {
    		this.layer = layer;
    	}
    
    	public Long getParent() {
    		return parent;
    	}
    
    	public void setParent(Long parent) {
    		this.parent = parent;
    	}
    
    	public List<CityModel> getChildren() {
    		return children;
    	}
    
    	public void setChildren(List<CityModel> children) {
    		this.children = children;
    	}
    
    	/* * @Override public String toString() { return "CityModel [code=" + code +
    	 * ", name=" + name + ", layer=" + layer + ", parent=" + parent + ", children="
    	 * + children + "]"; }
    	 */
    
    
    }
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

逻辑

复制代码
    /** * */
    package com.fy.config;
    
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.nio.file.StandardOpenOption;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.commons.lang3.StringUtils;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    import org.springframework.web.client.RestTemplate;
    
    import com.fy.utils.CityModel;
    import com.fy.utils.JsonUtils;
    
    /** * * @author 
     * */
    public class CityUtils  {
    
    	public static void main(String[] args) {
    		RestTemplate rest = new RestTemplate();
    		String r = rest.getForObject("http://www.mca.gov.cn/article/sj/xzqh/2020/20201201.html", String.class);
    
    		Document document = Jsoup.parse(r);
    		Elements es = document.select("table").select("tr");
    		es.removeIf(e -> !"19".equals(e.attr("height")));
    
    		List<CityModel> l = new ArrayList<>();
    		for (Element tr : es) {
    			Elements tds = tr.select("td");
    			int i = 1;
    			String key = "key", value = "value";
    			CityModel m = new CityModel();
    			for (Element td : tds) {
    				String text = td.text();
    				if (StringUtils.isBlank(text))
    					continue;
    
    				if (i % 2 == 0) 
    					key = text;
    				else 
    					value = text;
    				
    				i++;
    			}
    
    			if (StringUtils.isNumeric(value)) {
    				m.setCode(Long.valueOf(value));
    				m.setName(key);
    				l.add(m);
    			}
    		}
    
    		List<CityModel> ones = new ArrayList<CityModel>();
    		for (CityModel cityModel : l) {
    			if (cityModel.getName().contains("省")
    					|| cityModel.getName().contains("自治区")
    					|| cityModel.getName().contains("特别")
    					|| cityModel.getName().contains("北京市")
    					|| cityModel.getName().contains("天津市")
    					|| cityModel.getName().contains("重庆市")
    					|| cityModel.getName().contains("上海市")
    					) {
    				cityModel.setLayer(2);
    				cityModel.setParent(0L);
    				ones.add(getChildren(cityModel, l));
    			}
    		}
    		
    		CityModel m = new CityModel();
    		m.setParent(-1L);
    		m.setName("中国");
    		m.setCode(0L);
    		m.setLayer(1);
    		m.setChildren(ones);
    		
    		String a = JsonUtils.writeValueAsString(m);
    //		System.err.println(a);
    		try {
    			Files.createFile(Paths.get("C://city.json"));
    			Files.write(Paths.get("C://city.json"), a.getBytes(), StandardOpenOption.WRITE);
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
    	
    	private static CityModel getChildren(CityModel model, List<CityModel> list) {
    		String code = model.getCode() + ""; //城市编码 例如北京市:110000
    		
    		//处理特别行政区 
    		if(model.getName().contains("特别")) {
    			return model;
    		}
    		
    		//处理直辖市
    		if(model.getName().equals("北京市")
    				|| model.getName().equals("天津市")
    				|| model.getName().equals("重庆市")
    				|| model.getName().equals("上海市")) {
    			code = code.substring(0, 3);
    			
    			for (CityModel cityModel : list) {
    				String zxsCityCode = cityModel.getCode() + "";
    				String cityCode =zxsCityCode.substring(0, 3),
    					   endCode = zxsCityCode.substring(zxsCityCode.length() - 2, zxsCityCode.length());
    				
    				if(code.equals(cityCode) && !"00".equals(endCode)) {
    					cityModel.setParent(model.getCode());
    					cityModel.setLayer(model.getLayer() + 1);
    					model.getChildren().add(cityModel);
    				}
    			}
    			return model;
    		}
    		
    		// 找个每个省下的地级市以及地级市下的行政区
    		// 山东为例 370000
    		// 匹配规则 地级市和省的编码前两位以及最后两位一致就是地级市
    		String startWithCode = code.substring(0, 2), //省编码前两位 37
    		       endWithCode = code.substring(code.length() - 2, code.length()), // 省编码后两位 00
    		       lastCode = code.substring(code.length() - 4, code.length());// 后四位 0000 则为省
    		if("0000".equals(lastCode)) {
    			for (CityModel cityModel : list) {
    				String cityCode = (cityModel.getCode() + "");// 济南 370100  
    				String cityLastCode = cityCode.substring(cityCode.length() - 4, cityCode.length()); // 后四位 0100
    				
    				if(cityCode.startsWith(startWithCode) && cityCode.endsWith(endWithCode) && !"0000".equals(cityLastCode)) {
    					cityModel.setParent(model.getCode());
    					cityModel.setLayer(model.getLayer() + 1);
     					model.getChildren().add(getChildren(cityModel, list));
    				}
    			}
    			return model;
    		}
    		
    		//处理地级市下行政区
    		String cityTempCode = code.substring(0, 4);
    		for (CityModel cityModel : list) {
    			String cityCode = (cityModel.getCode() + "");
    			if(cityCode.contains(cityTempCode) && !cityModel.getName().equals(model.getName())) {
    				cityModel.setParent(model.getCode());
    				cityModel.setLayer(model.getLayer() + 1);
    				model.getChildren().add(cityModel);
    			}
    		}
    		return model;
    	}
    
    }
    
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    

全部评论 (0)

还没有任何评论哟~