直接开门见山了,放出下载地址先:
1、http://blog.jjonline.cn/soft/J_Position/ajing.sql.gz
phpmyadmin压缩导出的mysql库,库名:ajing,内有6个表,一个表不带后缀的是原始数据,每一行是一个村,从省至村;另外5个带后缀的表是相关联的,关联id为各自的行政编码,例如湖北省id为420(其实是42,数据库中省份编码均是3位数字,最后一个0是多余的),宜昌市id为4205(然后用8个0补齐就是420500000000),当阳市(我的家乡,县级市)为420582(然后用6个0补齐就是420582000000),以此类推。
大小: 17164601 字节(16.3M)
修改时间: 2014年7月16日, 13:02:02
MD5: A170D11E82A2532CE29574C46739B9CA
SHA1: 6D0FE378E2D6AB007E5F5977B4039E9E28DE5431
CRC32: 2AABF023
2、http://blog.jjonline.cn/soft/J_Position/ajing_position.7z
这个是phpmyadmin导出的sql文件,与第一个文件是一致的,然后使用360压缩软件压缩7z格式,原始sql文件170几兆太大了。
大小: 10363487 字节(9.88M)
修改时间: 2014年7月16日, 13:09:03
MD5: 2A3916A6617F7507FADB98E34341F59E
SHA1: 517F07DC7221BAE0DA5857BB77941E50388B4CE0
CRC32: C4FF8237
3、http://blog.jjonline.cn/soft/J_Position/j_position.7z
这个文件是第一个文件中提到的mysql库中的不带后缀的表。
大小: 6206567 字节(5.91M)
修改时间: 2014年7月15日, 23:08:57
MD5: EC7F7F500E7888FB36639FD76A598337
SHA1: E0EE991F7B2AE8B1EA96DDBF49BADF7B6434B853
CRC32: 75D1A75A
4、http://blog.jjonline.cn/soft/J_Position/positionJson.7z
这个文件是读取网页后产生的json格式的数据文件,分市(city)、县(county)、镇(town)以及村(village)分别保存的json后缀的文本文件,文本格式为json。每个省下的市县镇村均已该省代码明明,例如湖北省下的市为./positionJson/city/420.json、县为./positionJson/county/420.json、镇为./positionJson/town/420.json、村为./positionJson/village/420.json,以此类推。
这个json文件主要是为了各位自己去读取并按照自己的格式要求插入数据库的。
大小: 5384282 字节(5.13M)
修改时间: 2014年7月16日, 13:12:22
MD5: D862A925839F1358984607A63E79C701
SHA1: E47DD7C7BC2A815E15664D7529C7DC2268B8CB36
CRC32: EDB0B0AC
====
还记得两年前,那个时候对PHP还不甚了解,就是找本文所分享的东西,网上找到的数据要么非常老旧,要么不全;然后每个群里到处发消息找人要,当时的想法很简单,就是群里一定有做电商的程序猿,找他们拿一个全国省、市、县的统计数据相当的简单,结果等了一天没任何反应;要么是人家觉得太简单不理咱这个菜鸟,要么是大家各忙各的,压根就没时间去理会一条渺小的消息。
这个事情给我的触动非常大,网络上知识虽多,却也不乏错误、不全乃至老旧的问题,或一篇文章你抄我我抄你的这种情况;需求者往往要花费较多的时间去搜索、甄别;最可恶的是常常会看到一篇有错误或并不完善的文章被转来转去,搜索的关键词翻了几十页还能看到的情况......
嗯,貌似跑题了,还是回入正题。本文分享的省、市、县、镇、村的数据源为:http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/index.html 这个网址就不介绍了,这个数据源是目前最新、最全乃至最权威的数据源。
该数据源是html格式的,需要先爬html页面,然后按关联关系读出里面的数据,刚开始写的程序是边爬页面边读出数据,没考虑到需要读取的总html文件数高达4万多个,程序运行了12个小时候才发现有些数据爬漏了(数据源服务器偶尔犯浑返回404错误,而程序里没处理这种情况),发现这个问题后就改变了策略,先down下这个数据源里的所有页面数据,然后读本地的html数据生成json文件,down完后再写程序边读边检查,确保该数据源里的所有html页面均成功down到本地。down到本地并检查完整性,这个过程持续了16个小时,索性程序自动化进行,就是时间太长了点-------4万多个html页面,纵使一个html花费1秒,也需要4万多秒(十几个小时),还算正常,加之完整性检查16个小时还算可以吧!
(下载的所有html文件夹属性示意图)
接下来就是正则匹配各个页面(并处理各个页面的关联关系成mysql字段),产生了上述第四个文件夹中的所有json文件,然后读这些json文件插入到mysql中,最终产生了完整的省、市、县、镇、村的库,供其他应用调用。这个过程,产生json比较耗时,一个省(省、直辖市并列处理)平均需要30分钟,31一个省(以及直辖市)花了大半天;然后读json插入数据库,这个比较快,每1000条一个插入,2个多小时就搞定。
(读取json插入mysql时本地虚拟机内的centos资源情况)
有人问:“为什么不直接读html并处理后直接插入msyql,还要产生json后再读了插入?”其实这是为了其他程序猿调用方便而已,我这里的json实际上也可以被认为是一种数据存储的方式而已。
看本文第二种图,本地虚拟机内的小512M内存的centos内存已被吃光,swap也快耗尽。