行政区划官方数据--java对象或json-java爬虫获取

今天需要用到行政区划的数据,之前爬取过,但是没有保留。

上各家API看了下,,都要收费或者key。。


好吧,,自己动手。。webmagic框架。

以下代码可以获取到所有的行政区划code和汉字。。这是一个list,,集合有了,,json还远吗?

剩下的父子关系其实很好处理。。就是判断是否省市县,处理就好。


先贴获取区划的代码:

public class CityZoneSpider implements PageProcessor {
	
	private final transient Logger logger = Logger.getLogger(CityZoneSpider.class);

	// 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等
	private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);

	@Override
	public Site getSite() {
		return site;
	}

	@Override
	public void process(Page page) {

		if (page.getUrl().toString()
				.matches("http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/")) {
			
			/*System.out.println(page.getHtml()
					.xpath("//ul[@class='center_list_contlist']").links().all().toString());*/
			
			
			String newUrl = page.getHtml()
					.xpath("//ul[@class='center_list_contlist']").links()
					.all().get(0);
			
			
			page.addTargetRequest(newUrl);
			return;
		}
		
		
		List contentList = page.getHtml()
				.xpath("//div[@class='TRS_PreAppend']/p/b/span").nodes();
		contentList.addAll(page.getHtml()
				.xpath("//div[@class='TRS_PreAppend']/p/span").nodes());
		
		List list = new ArrayList<>();
		for (int i = 0; i < contentList.size(); i++) {
			Selectable node = contentList.get(i);
			String innerHtml = node.toString();
			//判断code开始
			if(!innerHtml.contains("lang=\"EN-US\"")){
				continue;
			}
			String code = node.xpath("//span[@lang='EN-US']/text()").get().replace(" ", "");
			String text = contentList.get(i+1).xpath("//span/text()").get();

			list.add(new Zone(code,text));
			//System.out.println(code +":"+text);
			//跳过已处理的文本
			i++;
		}
		
		page.putField("data", list);
		logger.info("==>  zone list size is :"+ list.size());

	}

	public static void main(String[] args) {

		Spider.create(new CityZoneSpider())
		// 从"https://github.com/code4craft"开始抓
				.addUrl("http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/")
				//.addPipeline(new ZonePipeline())
				// 开启1个线程抓取
				.thread(1)
				// 启动爬虫
				.run();
	}

}



再贴下  处理省市县关系的代码

for(Zone z:list){
			if(z.getCode().endsWith("0000")){
				z.setParentId("0");
			}else if(!z.getCode().endsWith("0000") && z.getCode().endsWith("00")){
				z.setParentId(z.getCode().substring(0,2)+"0000");
			}else{
				z.setParentId(z.getCode().substring(0,4)+"00");
			}
			}




你可能感兴趣的:(java)