在日常应用中,我们很多应用都会用到地址数据,地址数据包含名字和行政区划代码,在国家统计局网站有公开行政区划地址数据,国家统计局的行政区划地址数据有将近70万条,用人工来操作显然不现实,用程序处理就很easy了。整个行政区划代码数据分为省、市/州、区/县、乡/镇、村五个级别。

程序使用Python的BeautifulSoup(也就是BS4)模块来解析html。话不多说,完整代码如下:

注:抓取后保存为insert语句。国家统计局统计用区划代码和城乡划分代码地址:http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020/index.html

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import sys
import os
import re
from bs4 import BeautifulSoup
import string#设置请求头
request_headers = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","Accept-Encoding": "gzip, deflate","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.5","Cache-Control": "max-age=0","Connection": "keep-alive","Cookie": "_trs_uv=jz3i785b_6_2zxi; AD_RS_COOKIE=20088745","Host": "www.stats.gov.cn","DNT": "1","If-Modified-Since": "Thu, 10 Sep 2020 05:53:29 GMT","If-None-Match": "1c98-580baa54b4840-gzip","Upgrade-Insecure-Requests": "1","User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0"
}#insert语句的索引,当达到指定值后重新生成insert
sqlSaveIndex = 1
#当一条insert 的 values达到该值后重新生成新的一条insert
sqlSaveIndexEnd = 10000
#保存的文件名
saveFileName = "data/areacode2020-all.sql"
# saveFileName = "data/areacode2020-simple.sql"####function echo() start######
def echo( param,*args ):if len(args)==0:print(param)else:for var in args:if var=='':print(param,end='')else:print(param)
####function echo() end#######def writeSql(sql):try:fp=open(saveFileName,"a+",encoding="utf-8")fp.write(sql)#\n用来换行finally:fp.close()############function: replaceLastChar 替换末尾的,为;#######################
def replaceLastChar():#sed -i 's/,\(\w*$\)/;\1/g' data/areacode.sqlwith open(saveFileName, 'r+') as fo:filedata = fo.read(-1)if filedata.strip() == '':echo("error: content is null")sys.exit(0)if filedata.strip().endswith(',') == True:filedata = filedata.strip().rstrip(',')filedata = filedata + ';'try:fp=open(saveFileName,"w+",encoding="utf-8")fp.write(filedata)finally:fp.close()def echoinfo(name,code):print("areaName: %s,areaCode: %s" % (name,code))def createTableMySQL():create_tb_cmd = '''CREATE TABLE IF NOT EXISTS areacode2020 (code  varchar(20) PRIMARY KEY NOT NULL COMMENT '地址code',area_name  varchar(255) DEFAULT '' COMMENT '名字',type  int COMMENT '级别,1:省,2:市/州,3区县,4乡镇,5村',parent_code varchar(20) COMMENT '父级code ',KEY `areacode_index` (`parent_code`)) DEFAULT CHARSET=utf8 COMMENT='地址表2020';\n'''return create_tb_cmddef createTablePgSQL():sql = '''CREATE TABLE if not exists public.areacode2020 (code varchar(20) NULL,area_name text NULL,"type" integer NULL,parent_code varchar(20) NULL,CONSTRAINT areacode2020_pk PRIMARY KEY (code));CREATE INDEX areacode2020_parent_code_idx ON public.areacode2020 (parent_code);CREATE INDEX areacode2020_type_idx ON public.areacode2020 ("type");COMMENT ON TABLE public.areacode2020 IS '地址表2020';COMMENT ON COLUMN public.areacode2020.code IS '地址code';COMMENT ON COLUMN public.areacode2020.area_name IS '名字';COMMENT ON COLUMN public.areacode2020."type" IS '级别,1:省,2:市/州,3区县,4乡镇,5村';COMMENT ON COLUMN public.areacode2020.parent_code IS '父级code';'''return sql
def getItem(itemData, dataArray, parentRequestUrl, table, type):global sqlSaveIndexitem = {}# 名称if(type == 5):item['name'] = str(dataArray[2].get_text())else:item['name'] = str(dataArray[1].get_text())# 下一级请求urlhref = re.findall('(.*)/', parentRequestUrl)if type != 5:item['url'] = href[0] + "/" + dataArray[0].get('href')# 父级codeitem['parentCode'] = itemData.get('code')# 类型item['type'] = type# code码item['code'] = str(dataArray[0].get_text())[0:12]# if type == 4:#     print(item.get('url'))# 打印出sql语句#print('insert into areacodeinfo(area,code,type,parent_code) values (%s,%s,%s,%s)' % (item['name'], item['code'], item['type'], item['parentCode']) + ";")echoinfo(item['name'], item['code'])if sqlSaveIndex == 1:writeSql("insert into areacode2020(area_name,code,type,parent_code) values ('%s','%s',%s,'%s')" % (item['name'], item['code'], item['type'], item['parentCode']) + ",")elif sqlSaveIndex == sqlSaveIndexEnd:writeSql("('%s','%s',%s,'%s')" % (item['name'], item['code'], item['type'], item['parentCode']) + ";\n")sqlSaveIndex = 0else:writeSql("('%s','%s',%s,'%s')" % (item['name'], item['code'], item['type'], item['parentCode']) + ",")sqlSaveIndex +=1return item# 获取BeautifulSoup
def getSoup(requestUrl):htmls = requests.get(requestUrl, headers=request_headers)htmls.encoding = 'GBK'#soup = BeautifulSoup(htmls.text, 'html.parser', from_encoding='UTF-8')echo(htmls.text)soup = BeautifulSoup(htmls.text, 'html.parser')return soup# 循环处理
def forItem(soup, label, labelClass, labelChild, item, requestUrl, type, tableName, lists):for link in soup.find_all(label, labelClass):array = link.find_all(labelChild, class_='')if not len(array):continueitemData = getItem(item, array, requestUrl, tableName, type)lists.append(itemData)# 省列表
def getProvince(provinceList,proviceUrl):soup = getSoup(proviceUrl)for link in soup.find_all('a', class_=''):#for link in soup.find_all(href=re.compile('^52.html')):requestCityUrl = re.findall('(.*)/', proviceUrl)item = {}# 名称item['name'] = str(link.get_text())# 下一级请求urlhref = str(link.get('href'))item['url'] = requestCityUrl[0] + "/" + href# 父级codeitem['parentCode'] = '0'# 类型item['type'] = 1# code码#item['code'] = (href.split('.'))[0] + '0000000000'item['code'] = (href.split('.'))[0]provinceList.append(item)# 打印出sql语句# print('====>',types)writeSql("insert into areacode2020(area_name,code,type,parent_code) values ('%s','%s',%s,'%s')" % ((item['name']), item['code'], item['type'], item['parentCode']) + ";\n")echoinfo(item['name'],item['code'])return provinceList# 市/州列表
def getCityList(provinceList,cityList):for item in provinceList:cityRequestUrl = str(item.get('url'))soup = getSoup(item.get('url'))forItem(soup, 'tr', 'citytr', 'a', item, cityRequestUrl, 2, 'city', cityList)return cityList
# 区/县列表
def getCountyList(cityList,countyList):for item in cityList:countyRequestUrl = str(item.get('url'))soup = getSoup(item.get('url'))forItem(soup, 'tr', 'countytr', 'a', item, countyRequestUrl, 3, 'county', countyList)return countyList
# 城镇列表
def getTownList(countyList,townList):for item in countyList:townRequestUrl = str(item.get('url'))soup = getSoup(item.get('url'))forItem(soup, 'tr', 'towntr', 'a', item, townRequestUrl, 4, 'town', townList)return townList
# 村庄列表
def getVillageList(townList,villageList):for item in townList:villageRequestUrl = str(item.get('url'))soup = getSoup(item.get('url'))forItem(soup, 'tr', 'villagetr', 'td', item,villageRequestUrl, 5, 'village', villageList)return villageListdef main():proviceUrl = 'http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020/index.html'if not os.path.exists('data'):os.mkdir('data')provinceList = []cityList = []countyList = []townList = []villageList = []provinceList = getProvince(provinceList,proviceUrl)cityList = getCityList(provinceList,cityList)countyList = getCountyList(cityList,countyList)townList = getTownList(countyList,townList)getVillageList(townList,villageList)#将最后的,变成;replaceLastChar()if __name__ == "__main__":main()

详情请关注(最新代码及地址数据):https://github.com/hlinfocc/areacode

如何对您有帮助,请点个Star 呗

Python抓取国家统计局地址数据相关推荐

  1. python豆瓣影评_使用Python抓取豆瓣影评数据的方法

    抓取豆瓣影评评分 正常的抓取 分析请求的url https://movie.douban.com/subject/26322642/comments?start=20&limit=20& ...

  2. 微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”...

    微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友 ...

  3. 手把手教你入侵网站修改数据_手把手教你使用Python抓取QQ音乐数据(第四弹)...

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

  4. 手把手教你使用Python抓取QQ音乐数据!

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

  5. 电视剧《大秦赋》最近很火!于是我用Python抓取了“相关数据”,发现了这些秘密............

    前言 最近,最火的电视剧莫过于<大秦赋了>,自12月1日开播后,收获了不错的口碑.然而随着电视剧的跟新,该剧在网上引起了激烈的讨论,不仅口碑急剧下滑,颇有高开低走的趋势,同时该剧的评分也由 ...

  6. python爬取qq音乐歌曲链接为什么播放不出来_手把手教你使用Python抓取QQ音乐数据(第一弹)...

    原标题:手把手教你使用Python抓取QQ音乐数据(第一弹) [一.项目目标] 获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 由浅入深,层层递进,非常适合刚入门的同学练手. ...

  7. 手把手教你使用Python抓取QQ音乐数据(第四弹)(文末赠书)

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 千里之行,始于足下. [一.项目目 ...

  8. 如何用python抓取qq音乐_手把手教你使用Python抓取QQ音乐数据(第三弹)-阿里云开发者社区...

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

  9. python音乐的数据抓取与分析_手把手教你使用Python抓取QQ音乐数据!

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

  10. python抓取京东联盟优惠券_[爬虫]使用python抓取京东全站数据(商品,店铺,分类,评论)...

    网上抓取京东数据的文章,现在要么无法抓取数据,要么只能抓取部分数据,本文将介绍如何抓取京东全站数据,包括商品信息.店铺信息,评论信息,分类信息等. -------------------------- ...

最新文章

  1. python中文名字叫什么-什么是Python
  2. jQuery+css模拟下拉框模糊搜索的实现
  3. springboot 单元测试
  4. Opera视频出海非洲面临的技术挑战及应对
  5. android edittext 不滚动,EditText 设置可以垂直滑动但是不可输入
  6. 身体曲线如何反映出健康
  7. 使用python构建三层神经网络、softmax函数
  8. 使用jemalloc优化java_Jemalloc优化MySQL和Nginx
  9. python 内置数据类型之数字
  10. 20155305乔磊2016-2017-2《Java程序设计》第七周学习总结
  11. Java三大体系JavaSE、JavaEE、JavaME的区别
  12. 移植u-boot到stm32f407
  13. 使用python-docx将爬取结果保存到word
  14. 平方根和立方根怎么用计算机,用计算器探究平方根和立方根
  15. 【论文阅读】24-USAC: A Universal Framework for Random Sample Consensus
  16. oracle-表创建
  17. 【ML】机器学习数据集:sklearn中分类数据集介绍
  18. 公众号生成微信渠道二维码的方法?
  19. 通过css伪属性给div加小图标
  20. 终于,进入了蓝桥杯B组决赛,虽然低于CSDN平均水平,但也是值得庆幸的一件事。

热门文章

  1. 计算机用户要以ADSL,建设项目进度控制超星尔雅期末答案
  2. 4款最好的Android设备HTML编辑器
  3. Spring注解扫描原理浅析
  4. php采标教程,国内液压与气动行业标准大全
  5. 图片|视频|音频文件扩展名(后缀)
  6. 微信小程序 源码资源汇总
  7. android应用程序在哪找,找不到应用程序的错误android
  8. Groovy从入门到精通
  9. 康奈尔笔记法(5R笔记法)
  10. voc2007目标检测数据集制作