源:http://www.oschina.net/code/snippet_120579_11434#18725

抓取国家统计局网站上的最新县及县以上行政区划代码,并保存成json格式的文件

可用于为实现省市区选择框联动的js代码提供源数据

#! /usr/bin/env python
# -*- coding: utf-8 -*-'''抓取国家统计局网站上最新的县及县以上行政区划代码,并保存成 json 格式的js文件(供前端用)和SQL语句(供后端用)
by Conanca
'''import urllib2,jsonurl_prefix = 'http://www.stats.gov.cn/tjbz/xzqhdm/'var_text = 'xzqh'
code_text = 'C'
name_text = 'N'
sub_text = 'S'
jsfile_path = 'xzqh.js'
sqlfile_path = 'xzqh.sql'def set_proxy(proxy):''' 设置代理服务器 '''urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler({'http' : proxy})))def get_latest_page():''' 获取最新的行政区划代码公布页 '''content = urllib2.urlopen(url_prefix + 'index.htm').read()index_start = content.find("<td width='76%' height='20' valign='middle'><a href='") + 53index_end = content.find("' target='_blank'  class='a2'>")xzqhdm_url = content[index_start:index_end]xzqhdm_url = url_prefix + xzqhdm_urlprint 'latest page:' + xzqhdm_urlreturn xzqhdm_urldef crawl_page(xzqhdm_url):''' 爬行政区划代码公布页 '''print 'crawling...'content = urllib2.urlopen(xzqhdm_url).read()index_start = content.find('<TBODY>') + 9index_end = content.find("</TBODY></TABLE>")content = content[index_start:index_end]return contentdef creat_item(item_str):''' 根据字符串创建条目对象 '''code = item_str[item_str.index('lang=EN-US>') + 11:item_str.index('<o:p></o:p></SPAN></P></TD>')]name = item_str[item_str.index('''mso-bidi-font-family: Tahoma">''') + 30:]item = {code_text:code,name_text:name}print itemreturn itemdef convert(content):''' 将爬到的内容转换为行政区划 list '''print 'converting...'item_arr = content.split('<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD></TR>')p_list = []current_p = {}current_p_sub = []current_c = {}current_c_sub = []current_d = {}for item_str in item_arr:#print item_strif item_str.find('TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt; mso-pagination: widow-orphan')>=0:#print 'got a province:'+item_str# 赋值 当前省;初始化 当前省的子项current_p = creat_item(item_str)current_p_sub = []if len(current_p)!=0:# 为当前省 设置其子项;省列表中添加当前省current_p[sub_text] = current_p_subp_list.append(current_p)elif item_str.find('TEXT-INDENT: 12pt;')>=0:#print '********got a city:'+item_str# 赋值 当前市;初始化 当前市的子项current_c = creat_item(item_str)current_c_sub = []if len(current_c)!=0:# 为当前市 设置其子项;当前省的子项中添加当前市current_c[sub_text] = current_c_subcurrent_p_sub.append(current_c)elif (item_str.find('TEXT-INDENT: 24pt;')>=0 or item_str.find('TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt 23.95pt;')>=0):#print '****************got a district:'+item_str# 赋值 当前区县;当前市的子项中添加当前区县current_d = creat_item(item_str)current_c_sub.append(current_d)else :print 'invaild item string:'+item_strreturn p_listdef to_sql(p_list):''' 将行政区划列表转换为SQL语句 '''sql = 'CREATE TABLE T_XZQH(CODE CHAR(6) PRIMARY KEY,  NAME VARCHAR(30),  PARENT_CODE CHAR(6),  TYPE CHAR(1));\nINSERT INTO T_XZQH VALUES\n'for p in p_list:sql += "('"+p[code_text]+"','"+p[name_text]+"',NULL,'p'),\n"for c in p[sub_text]:sql += "('"+c[code_text]+"','"+c[name_text]+"','"+p[code_text]+"','c'),\n"for d in c[sub_text]:sql += "('"+d[code_text]+"','"+d[name_text]+"','"+c[code_text]+"','d'),\n"return sql[:-2]+";"def write_to(content,file_path):''' 将字符串写入指定的文件中 '''print 'writing...'f = open(file_path, 'w')f.write(content)f.close()print 'done!'if __name__ == '__main__':#set_proxy('http://192.168.2.59:8080')url = get_latest_page()content = crawl_page(url)p_list = convert(content)content = 'var ' + var_text + ' = ' + json.dumps(p_list,ensure_ascii=False,separators=(',',':')).decode('gb18030').encode('utf-8')write_to(content,jsfile_path)content = to_sql(p_list).decode('gb18030').encode('utf-8')write_to(content,sqlfile_path)print 'finish!'

抓取国家统计局网站上的最新县及县以上行政区划代码,并保存成json格式的文件相关推荐

  1. 最新县及县以上行政区划代码(截止2016年7月31日)

    最新县及县以上行政区划代码(截止2016年7月31日),数据整理来源于国家统计局官方公布. 110000|北京市110100|市辖区110101|东城区110102|西城区110105|朝阳区1101 ...

  2. 最新县及县以上行政区划代码(截止2009年12月31日)

    备忘一下:最新县及县以上行政区划代码(截止2009年12月31日) http://www.stats.gov.cn/tjbz/xzqhdm/t20100623_402652267.htm 最新县及县以 ...

  3. 最新县及县以上行政区划代码(截止2012年10月31日)

    最新县及县以上行政区划代码(截止2012年10月31日) http://www.stats.gov.cn/tjbz/xzqhdm/t20130118_402867249.htm 对应数据: --TRU ...

  4. 最新县及县以上行政区划代码(截止2007年12月31日)

    最新县及县以上行政区划代码(截止2007年12月31日) 最新县及县以上行政区划代码(截止2007年12月31日) 2008-02-15 09:21:37 代码 名称 110000 北京市 11010 ...

  5. Java爬虫实战(一):抓取一个网站上的全部链接

    前言:写这篇文章之前,主要是我看了几篇类似的爬虫写法,有的是用的队列来写,感觉不是很直观,还有的只有一个请求然后进行页面解析,根本就没有自动爬起来这也叫爬虫?因此我结合自己的思路写了一下简单的爬虫,测 ...

  6. 最新县及县以上行政区划代码(截止2013年8月31日)

    如题,我国最新县及县以上行政区划名称及代码,截至2013年8月31日, 来着国家统计局,http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t2014011 ...

  7. java爬虫怎么确定url连接_Java爬虫之抓取一个网站上的全部链接

    前言:写这篇文章之前,主要是我看了几篇类似的爬虫写法,有的是用的队列来写,感觉不是很直观,还有的只有一个请求然后进行页面解析,根本就没有自动爬起来这也叫爬虫?因此我结合自己的思路写了一下简单的爬虫,测 ...

  8. 省市区三级联动 最新县及县以上行政区划代码 来源:国家统计局

    http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201504/t20150415_712722.html jquery省市区三级联动(数据来源国家统计局官网)内附源码 ...

  9. 最新县及县以上行政区划代码(截止2010年12月31日)

    为什么80%的码农都做不了架构师?>>>    国家统计局: http://www.stats.gov.cn/tjbz/xzqhdm/t20110726_402742468.htm ...

最新文章

  1. ASP .NET Core Web MVC系列教程:使用ASP .NET Core创建MVC Web应用程序
  2. 剑指offer 算法 (知识迁移能力)
  3. 【嵌入式】Libmodbus下载和编译详解
  4. python xlwt模块生成excel文件并写入数据 xlrd读取数据
  5. 二叉树的左右子树交换
  6. 【Boost】boost库中智能指针——intrusive_ptr
  7. Spark SQL之queryExecution运行流程解析Logical Plan(三)
  8. Java 8 Friday:语言设计很微妙
  9. LeetCode 1824. 最少侧跳次数(DP)
  10. cornerstone the working copy is locked due to a previous文件lock解决办法
  11. DevOps使用教程 华为云(18)git 把单个文件回退到某一版本
  12. 服务器内的虚拟机无法上网,VMware虚拟机中无法上网如何解决
  13. 大文件下载插件webupload插件
  14. GoogleEarth二次开发平台指南(4) --- 三维视频融合、视频拼接与摄像头控制
  15. 巴黎世家土味病毒营销,B端创业初期,如何用营销壮大你的种子用户?
  16. 赤峰市田家炳中学2021高考成绩查询,2021年常州各高中高考成绩排名及放榜最新消息...
  17. 《Linux C/C++服务器开发实践》简介
  18. Twitter Inc.(TWTR)2020年第三季度收益电话会议记录
  19. python启动浏览器崩溃
  20. 【软件侠】公认最常用的20个函数,案例详解

热门文章

  1. 鸿蒙和ios流畅对比,鸿蒙OS对比iOS,华为再次“超越”,流畅度大幅领先苹果!...
  2. WVGA与HVGA、QVGA详细解答
  3. 【Weiler-Atherton算法】 计算机图形学多边形裁剪算法
  4. 短信网关 php,php使用ICQ网关发送手机短信_PHP教程
  5. springmvc-kuang
  6. ZOJ 3886 Nico Number(筛素数+Love(线)Live(段)树)
  7. 既已开始,就风雨兼程
  8. 天池龙珠训练营广东工业-林莉子学习笔记-Task1
  9. 人为何有指纹【转自生物谷】
  10. 如何在中关村做好一门小生意——北漂18年(18)