行政区划官方数据--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<Selectable> 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<Zone> 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");
			}
			}

 

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值