无其他新鲜数据的情况下,这篇应该是国家统计局专栏的最后一篇
思路和之前爬国家统计局运用的根节点叶节点思路基本相同,先放代码,具体的说明想好再解释~(代码中有部分注释)
爬到最小的村级大概用时一个半小时(因为没用代理ip或者多进程,最后要访问40000+乡级网页比较耗时),总共630000+村级数据,但是网上的数据量分布在640000-740000之间,先不说和我数据不符,竟然体量也不尽相同,我也不知道是怎么回事qaq
(最新:看到这位博主的博客https://blog.csdn.net/xuemu2008/article/details/110262257,他的数据条目和这篇代码实现能完成的数目完全一致,所以应该是完全正确的)

import requests
import re
import xlsxwriter
import time
time_start=time.time()
agent={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
choose_ls=[depth*2 if depth<=3 else 3*(depth-1) for depth in range(1,6)]#根据深度大小取12位代码前**位
match_level=['provincetr','citytr','countytr','towntr','villagetr']
initurl='http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2020/index.html'
total_dict={}
depth=0
each_root={initurl:('','')}
max_depth=5#可选,1-5分别表示省级、地级、县级、乡级、村级,进而爬取固定深度范围内所有的叶节点以及该深度下的根节点
while depth<max_depth:total_count=0next_root={}for url in each_root:code_join=each_root[url][0]+'-' if depth!=0 else each_root[url][0]zone_join=each_root[url][1]+'-' if depth!=0 else each_root[url][1]change_root='/'.join(url.split('/')[:-1])+'/'while True:try:req=requests.get(url,headers=agent)req.encoding='GBK'#中文解码,不要用req.encoding=req.apparent_encoding,这样识别出来的req.encoding='gb2312',有好多复杂汉字解不出码text=req.texttext=text.replace('\n','\\n')#正则表达式会跳过换行符(无法识别下一行),因此将换行符替换special_sigh=Falseif match_level[depth] in text:match_text=re.findall(r"class='%s'>(.*?)</table"%match_level[depth],text)[0]breakelse:search=Falsefor level in range(depth,5):#东莞、中山、儋州缺县级单位,因此需要进行识别并放入下一节点存储if match_level[level] in text:match_text=re.findall(r"class='%s'>(.*?)</table"%match_level[level],text)[0]search=Truespecial_sigh=Trueprint('特殊区划:%s'%each_root[url][1])breakif search:breakelse:print('服务器繁忙')time.sleep(2)except:print('服务器繁忙')time.sleep(2)if special_sigh:next_root[url]=(code_join,zone_join)else:if depth!=0:has_tree=re.findall(r"href='(.*?)'>(\d+?)<.*?html'>(.*?)</a></td></tr>",match_text)else:base_tree=re.findall(r"href='(.*?)'>(.*?)<br/",match_text)has_tree=[(each[0],each[0].split('.html')[0],each[1]) for each in base_tree]base_no=re.findall(r"td>(\d+?)</td><td>(.*?)</td></tr>",match_text)no_tree=[(each[0],re.findall(r'<td>(.+)',each[1])[0] if 'td' in each[1] else each[1]) for each in base_no]for each in has_tree:each_dir=change_root+each[0]next_root[each_dir]=(code_join+each[1][:choose_ls[depth]],zone_join+each[2])if depth==3:if (total_count+1)%100==0:print('已爬取%d个,在路径%s处'%(total_count+1,zone_join+each[2]))else:print('在路径%s处'%(zone_join+each[2]))if no_tree:for each in no_tree:total_dict[code_join+each[0][:choose_ls[depth]]]=zone_join+each[1]if depth==4:if (total_count+1)%800==0:print('已爬取%d个,在路径%s处'%(total_count+1,zone_join+each[1]))else:print('已获取路径%s'%(zone_join+each[1]))total_count+=1depth+=1each_root=next_root
def decompose(each):if type(total_dict[each])==tuple:codelist=total_dict[each][0].split('-')namelist=total_dict[each][1].split('-')else:codelist=each.split('-')namelist=total_dict[each].split('-')if len(codelist)<depth:for i in range(len(codelist),depth):codelist.append('')namelist.append('')ziplist=list(zip(codelist,namelist))return [i for j in ziplist for i in j]
sort_name=['省级','地级','县级','乡级','村级']
real_column=[(sort_name[each]+'代码',sort_name[each]+'名称') for each in range(depth)]
flat_col=[i for each in real_column for i in each]
total_dict.update(each_root)
if depth<=3:#县级及以上数据量不大(约三千行),可以用excel存储wk=xlsxwriter.Workbook('五级联动.xlsx')sh=wk.add_worksheet('sheet1')for each in range(2*depth):sh.write(0,each,flat_col[each])totalrow=1for each in total_dict:flatlist=decompose(each)for i in range(2*depth):sh.write(totalrow,i,flatlist[i])totalrow+=1wk.close()
else:#县级往下数据较多,excel没有优势,因此写入csv存储book=open('五级联动.csv','w',encoding='utf-8')book.write(','.join(flat_col)+'\n')for each in total_dict:flatten=decompose(each)book.write(','.join(flatten)+'\n')book.close()
time_end=time.time()
rest_second=time_end-time_start
print('用时%d分%d秒'%divmod(rest_second,60))

村级经pandas sort_values排序后,如图所示:

爬取国家统计局2020年五级联动行政区划(精确)相关推荐

  1. 【Java】Java爬取国家统计局五级行政区划编码(省、市(州)、县(区)、乡(镇)、村)

    今天使用了idea+java爬取国家统计局12位行政区划编码,包括省.市(州).县(区).乡(镇).以及村委会/委员会等的行政编码和名称,将区划编码以及名称保存在数据库中. 本文内容包括数据库数据效果 ...

  2. Python3爬取国家统计局官网2019年全国所有城市(2020年更新)

    Python3爬取国家统计局官网2019年全国所有城市(2020年更新) 一级城市爬取 一级城市爬取 由于最近需要用到所有城市的数据,故从统计局爬取19年的一级城市数据 import random i ...

  3. 使用java爬取国家统计局的12位行政区划代码

    前言: 本文基于j2ee的原始url进行都写,解析指定内容时也是使用很傻的形式去查找指定格式的字符串来实现的. 更优雅的方式是可以使用apache的HttpClient和某些文档模型将HTML字符串构 ...

  4. Python爬取国家统计局行政区划信息

    1. 简介: 2020年统计用区划代码和城乡划分代码,将其中的行政区划爬取并保存成树状结构,以支持类似如下查询: dic['北京市']['市辖区'].keys() dict_keys(['东城区', ...

  5. Python3爬取国家统计局官网2017年全国所有城市县镇数据

    最近由于项目需要用到全国城镇乡的数据,网上找了下大部分都是很久之前的,或者不理想的数据,某文库更是无论文章好不好都要下载券,所以索性自己用Python写爬虫爬数据,以下是代码(Python3.6版本) ...

  6. 用python3的pyspider爬取国家统计局的行政区域(只到乡镇级,更新到2017年)

    按某个省的行政区域爬虫 一.爬虫遇到的问题 1.Mysql中文乱码问题: 2.pyspider的config设置问题 二.准备工作 1.安装pyspider.pymysql 2.新建3个mysql的库 ...

  7. Python 爬取国家统计局城市信息2019

    写个页面需要有省市区三级联动,缺少最新的城市信息,从网上找了些资源,发现写的各有特色,有的资源里面的语法奇葩到无语,灼瞎我的眼呀,无奈自己就简写了一个脚本,发现统计局的规律还是挺奇特的,开始用xpat ...

  8. python爬取国家统计局数据并做简单的数据缺失值处理

    准备工作: 需要先安装chrome浏览器 其次,下载chromedriver驱动,下载方式可点击这里,下载完毕放置的位置没有要求,只需要在下面的代码中将地址改成你的chromedriver驱动放置的位 ...

  9. Python爬取国家统计局数据并做简单的数据缺失值处理!

    准备工作: 需要先安装chrome浏览器 其次,下载chromedriver驱动,下载方式可点击这里,下载完毕放置的位置没有要求,只需要在下面的代码中将地址改成你的chromedriver驱动放置的位 ...

最新文章

  1. SAP SD基础知识之SD常用BAPI
  2. 小波变换和小波包变换
  3. python实现简单的api接口-对Python实现简单的API接口实例讲解
  4. 大名鼎鼎的红黑树,你get了么?2-3树 绝对平衡 右旋转 左旋转 颜色反转
  5. USB 3G驱动和USB HOST驱动加载
  6. 【大话数据结构算法】归并排序
  7. 记一次海外大型SLG游戏服务器进程被OOM的修复经历
  8. 认识oracle监听器配置文件
  9. SAP License:部分清帐和剩余清帐的区别(实例)
  10. jquery选择器_jQuery选择器
  11. 复变函数与积分变换小结
  12. java实现在线预览word(docx)功能
  13. Ubuntu 12.10下用Pidgin(pidgin-lwqq)登录QQ
  14. 英特尔推出SD卡巨细电脑 配Atom处理器
  15. Windows 控制台注册表工具 Reg
  16. BlenderGIS:No ImageIO解决办法 天地图地图资源
  17. MySQL 名次查询
  18. 计算机专用英语词汇1695个词汇表,这个收藏了
  19. 商业图表案例3-CO2排放量与人均GDP
  20. 6、API网关 Zuul

热门文章

  1. 关于开源授权协议 GPL 和 LGPL
  2. Matlab计算曲面的切平面
  3. 恩施城中心商铺7万起
  4. html代码转换成手机app,快速把html、手机网站打包成APP的工具和步骤流程
  5. 过年回家啦用python写一个宝石消消乐的游戏哄小朋友
  6. 升级全域兴趣电商:看见更大的生意机会
  7. 数的三次方根(二分查找:浮点数)
  8. java中elapseTime设置新时间,Jmeter系列(44)- 详解 Elapsed time、Latency、Connect Time的含义...
  9. Notepad++开源替代NotepadNext
  10. windows下protobuf下载、安装、使用