下载最新全国邮编数据库

      因为工作的原因,需要一份比较完整的邮编数据库,网上的数据都是一些比较旧的,而且数据很少,真希望邮局能免费提供邮编的下载,或者有一个接口也可以啊。终于功夫不负有心人,目光定在http://www.cpdc.com.cn/(中国邮政集团公司名址信息中心)。这个地方的数据特别完整。但问题也随之而来,根本没有可以下载数据库的地方。

      虽然没有提供直接可下载的数据库,或是接口,查询到的html已经算是数据了,只要对页面的html源码加以分析,就可以取出每页的数据。不过网站还设置了一些小的障碍-验证码。每次点击下一页都需要验证码,不过总会有办法解决,嘿嘿……

      大家对于HttpWatch一定并不陌生,如果不知道就去Google一下,我们可以通过HttpWatch解决遇到的麻烦,也能更好的分析,我们在点击查询,或者下一页的时候都做了些什么。

      第一步:查询北京的邮编,其余都为空,点击查询,HttpWatch监视的情况如下:

image 

   第二步:点击“下一页”,如下:

image

  其实通过上面的两个图片,我们已经可以知道了我们需要的东西:

1.查询时都是将数据提交到了 “http://***/Action.do” 页面;

2.Post的数据为:dist_cd_addr:顶级地区邮编;pageNo:页码;reqCode:getpostcdbyDistcdaddr 应该是Action

通过上面获取的内容,我们可以通过xmlhttp对象,将数据提交到指定页面,然后循环页数就能获取需要的数据了。如果你将dist_cd_addr的值提交为空,你就会发现,获得的数据是全国的所有数据,共170多万。

C# 版代码片段如下:

MSXML2.XMLHTTP xmlhttp = new MSXML2.XMLHTTP();
string PostData;
PostData = "addr_name=&cityselect=&ctyselect=&dist_cd_addr=&prvselect=&reqCode=getPostcdByDistcdAddr&pageNo=1&type=1&pageSize=1000";

xmlhttp.open("POST", "http://***/postcdQueryAction.do", false, null, null);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-Length", PostData.Length.ToString());
xmlhttp.send(PostData);
s = xmlhttp.responseText;

这样就能获取数据,然后通过解析s字符串的内容就可以了,但是因为数据量太大,需要一段时间才能取完数据,比较反对多线程,因为这样可能造成服务器的不稳定,影响大家的正常使用。这里写这篇Blog的目的只是为了介绍这个方式,通过HttpWath监视,然后用程序模仿页面提交,并获得数据。其实这种公共的数据库还是比较希望有免费的下载!

提供一个早期前人整理的数据库:http://download.csdn.net/source/2153604

原文地址:https://www.cnblogs.com/shelley/p/1692351.html