小巧抓取(省、市(区号\邮编)、县)数据

最近项目需要用到 城市的地址信息,但从网上下载的xml数据没有几个是最新的地址信息.....数据太老,导致有些地区不全。所以才想到天气预报官网特定有最新最全的数据。贴出代码,希望能给有同样困惑的朋友,减少一些时间。

	/**
	 * @param var  城市名称
	 * @return	string数组,0表示邮编	1表示区号
	 */
	@SuppressWarnings("deprecation")
	private String[] getZipCode(String var) {
		String[] code = new String[2];
		String zipCode_S = "邮编:";
		String zipCode_E = " ";
		String qhCode_S = "区号:";
		String qhCode_E = "</td>";
		String encode = URLEncoder.encode(var);
		try {
			URL url = new URL("http://www.ip138.com/post/search.asp?area="
					+ encode + "&action=area2zone");
			BufferedReader br = new BufferedReader(new InputStreamReader(
					url.openStream(), "GBK"));
			for (String line; (line = br.readLine()) != null;) {
				int zipNum = line.indexOf(zipCode_S);
				if (zipNum > 1) {
					String str = line.substring(zipNum + zipCode_S.length());
					str = str.substring(0, str.indexOf(zipCode_E));
					code[0] = str;
				}
				int qhNum = line.indexOf(qhCode_S);
				if(qhNum > 1)
				{
					String str = line.substring(qhNum + qhCode_S.length());
					str = str.substring(0, str.indexOf(qhCode_E));
					code[1] = str;
					break;
				}
			}
		} catch (Exception e) {
			System.out.println(var +"\t错误"+e.toString());
		}
		return code;
	}

	/**
	 * 	主程序
	 * @throws Exception
	 */
	@Test
	public void main() throws Exception
	{
		//1:获取所有省份
		TreeMap<String,String> provincesBuffer = getAddressInfo("http://www.weather.com.cn//data/city3jdata/china.html");
		Element prcEle = DocumentHelper.createElement("Provinces");

		//2:根据省份获取城市
		Element citysEle = DocumentHelper.createElement("Citys");

		//3:根据省份城市获取区、县
		Element distEle = DocumentHelper.createElement("Districts");
		int p = 1;
		int c = 1;
		int d = 1;
		for(Entry<String, String> prc : provincesBuffer.entrySet())
		{
			Element province = DocumentHelper.createElement("Province");
			province.addAttribute("ID",""+(p)).addAttribute("ProvinceName", prc.getValue()).addText(prc.getValue());
			//获取邮政编号
			TreeMap<String,String> cityBuffer = getAddressInfo("http://www.weather.com.cn/data/city3jdata/provshi/"+prc.getKey()+".html");
			for(Entry<String, String> citys : cityBuffer.entrySet())
			{
				Element city = DocumentHelper.createElement("City");
				String[] zipCode = getZipCode(citys.getValue());
				if(zipCode[0]==null||zipCode[1]==null)
					System.out.println("缺少"+citys.getValue()+"邮政或区号!");
				city.addAttribute("ID", ""+c).addAttribute("CityName", citys.getValue()).addAttribute("PID",p+"").addAttribute("ZipCode", zipCode[0]).addAttribute("AreaCode", zipCode[1]).addText(citys.getValue());
				TreeMap<String, String> distsBuffer = getAddressInfo("http://www.weather.com.cn/data/city3jdata/station/"+prc.getKey()+""+citys.getKey()+".html");
				for(Entry<String, String> dists : distsBuffer.entrySet())
				{
					String value = dists.getValue();
					if(value.equals(citys.getValue()))
						continue;

					Element district = DocumentHelper.createElement("District");
					district.addAttribute("ID",""+(d++)).addAttribute("DistrictName", dists.getValue()).addAttribute("CID", c+"").addText(dists.getValue());
					distEle.add(district);
				}
				citysEle.add(city);
				c++;
			}
			prcEle.add(province);
			p++;
		}
		//4:保存到本地
		saveInf("f:\\Provinces.xml",prcEle);
		saveInf("f:\\Citys.xml",citysEle);
		saveInf("f:\\Districts.xml",distEle);
	}

	/**	保存xml
	 * @param savePath  xml保存路径
	 * @param varEle	根元素
	 */
	private void saveInf(String savePath, Element varEle) {
		Document varDoc = DocumentHelper.createDocument();
		varDoc.add(varEle);
		try {
			XMLWriter xmlwri = new XMLWriter(new FileOutputStream(new File(savePath)), new OutputFormat("\t", true, "UTF-8"));
			xmlwri.write(varDoc);
			xmlwri.close();
		} catch (Exception e) {
			System.out.println(savePath +"失败,原因如下");
			throw new RuntimeException(e);
		}
	}

	/**
	 * 	获取信息
	 * @param address  url路径
	 * @return	key :信息编号	value:信息名称
	 */
	private TreeMap<String, String> getAddressInfo(String address) {
		TreeMap<String,String> china = new TreeMap<String, String>();
		BufferedReader br = null;
		String buffer = null;
		try {
			URL url = new URL(address);
			br = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
			buffer = br.readLine();
		} catch (Exception e) {
			System.out.println("错误:"+e.getMessage());
		}finally{
			if(br != null)
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
		if(buffer==null)
			return china;

		buffer = buffer.replaceAll("\\{|\\}|\"","");
		String[] splits = buffer.split(",");
		for(String sp : splits)
		{
			String[] split = sp.split(":");
			if(split!=null && split.length == 2)
				china.put(split[0], split[1]);
			else
				System.out.println(address);
		}
		buffer = null;
		return china;
	}

下载xml数据

时间: 2024-11-05 21:36:24

小巧抓取(省、市(区号\邮编)、县)数据的相关文章

学术休假-区号查询

不得不吐槽一下CSDN的审核速度,前天发表的文章到现在还没有审核完.好吧,寒假理解. 下午无聊想查一下某城市的区号,还是找到度娘,后来索性任性了一会,用C++写了一个区号查询. 程序和先前的写作风格差不多,利用多函数,文件查找,结构比较简单. 上源码: /* *Copyright (c) 2015,烟台大学计算机学院 *All gight reserved. *文件名称:temp.cpp *作者:邵帅 *完成时间:2015年1月30日 *版本号:v1.0 */ #include<fstream>

html实现 省——市——区三级联动

html实现  省--市--区三级联动 html中实现三级联动是一个不错的demo,博主在这里跟大家分享一下实现的过程,以及自己在过程中出现的一些问题,仅供参考. 首先我们将全国的省市区数据导入进来,这里已经直接整理搜集好了.如下: var provinceList = [ {name:'北京', cityList:[ {name:'市辖区', areaList:['东城区','西城区','崇文区','宣武区','朝阳区','丰台区','石景山区','海淀区','门头沟区','房山区','通州区

验证电子邮件?手机号码?密码6-15位?验证输入网址?身份证号?邮编? 文件改名? 替换字符串部分单词?

/** *验证电子邮件?手机号码?密码6-15位?验证输入网址?身份证号?邮编? *邮箱正则: *"[\\w]@[\\w](.\\w+)+"; */ public class StringDemo8 { public static void main(String[] args) { String email = "[email protected]"; String emailRegex = "[\\w][email protected][a-zA-z0

全国行政区划数据大放送——包含邮政编码-电话区号-简拼-区划路径

因为一些情况需要用到全国行政区划数据库,本身没有库的就自己在网上找,但是找到的基本上不是我想要的,因为只包含了基本信息, 最后自己下了一个原始库准备自己组装数据,网上的XX数据网啊,web services都有限制,还是自己想办法把数据拿到手最放心. 原始数据是2015年4月的,原始数据只有基本的三级(省市县)区划信息,我自己通过一些查询区划网站,把四级数据抓取导入到自己的数据 库中(省市县乡),数据还是比较新的,觉得应该会有园友用到所以将数据放上来. 组装后的格式:区划ID-区划名称-父级ID

支持中英文和国旗的android国家代码/国际电话区号选择器

最近在做app登录的时候,因为需要支持国外手机号注册和登录,所以就涉及到国际电话区号的选择.在github上面找了一下,国家名称基本都是只有英文版本,而手动的去把中文一个个加上实在是一件费时费力的事情,所以就写了一段简单的java代码,抓取了某快递网站的数据转换成json格式,以下是处理后的数据 [ { "en": "Angola", "zh": "安哥拉", "locale": "AO"

取到崭新连号人民币,我却一点都不开心

01 今天很难得的去银行取了一次钱. 现在移动支付太方便,路边卖煎饼果子的大叔都接受手机支付:左手边的手机里放着<套马杆的汉子>,右手边立着个微信支付二维码图片,时髦值MAX. 所以,ATM在我眼中,和缝纫机差不多地位了. 但我要讲的重点,是在我回到家之后. 我仔细端详这一叠钱,发现一件神奇的事情: 这些钱是连号的! 02 作为有点像处女座的摩羯座,我的本能反应是: 哇塞,连号的新钱,好棒,赶紧叠好,别乱了顺序. 但仅仅0.371秒之后,我就意识到了另外一个让人沮丧的事情: 又取到了连号的钱,

弹出层,验证码,省市地区选择,国际电话区号选择等插件的使用

1.layer的弹出层,有bug,或许是跟当前的JS冲突,所以,使用了zdialog.js 参考链接:http://www.jq22.com/jquery-info18718 引入三个文件,分别是,jquery.js,zdialog.js,zdialog.css 其中,具体的样式,可以在zdialog.css里进行修改.不过,他的css写的其实挺漂亮了. 比如,他们的提示框,从上到下有三部分,分别是:标题,内容,确定. 我直接修改,标题的样式为display:none:就更加简化了这个提示框.

第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号

第三百三十节,web爬虫讲解2-urllib库爬虫-实战爬取搜狗微信公众号 封装模块 #!/usr/bin/env python # -*- coding: utf-8 -*- import urllib from urllib import request import json import random import re import urllib.error def hq_html(hq_url): """ hq_html()封装的爬虫函数,自动启用了用户代理和ip

WinForm Timer控件,三级联动[省,市,区]

Timer控件: 组件中的最后一个控件,功能是可以根据用户自定义的时间间隔来触发时间,不会印象窗体本身的其他事件进行. 属性: Enable  设置控件是否启用 Interval  设置事件的频率,以毫秒为单位 事件只有一个:Tick事件 例:使用timer控件获取当前时间并即时变动 private void timer1_Tick(object sender, EventArgs e) { label1.Text = DateTime.Now.ToString("yyyy年MM月dd日hh时m