中国统计局省市区镇(街道)采集器
node-china-region-spider 是一个基于 nodejs 技术,通过访问中国统计局网,获取省、地级市、区(县)、镇(街道)多层行政级别地区的名字 与 编号,并将数据保存到 SQLite 数据库。
目录结构
程序特点 数据来源 技术构成 安装 运行 参数 数据结构 年度数据对比 1. 程序特点 支持采集不同的行政级别深度 支持采集指定的年份数据,并且支持不同年份数据对比,为每年升级提供数据帮助 支持自定义多并发采集,提高整体的运行效率 访问超时自动重试 支持断点续采,避免被拦截后重新开始采集的代价 通过访问频率控制,避免容易被服务器察觉并禁止访问 2. 数据来源数据来源于国家统计局网。
其中,不同年份的行政区域划分: http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/
3. 技术构成数据采集:puppeteer
Puppeteer 是一个通过 DevTools Protocol 控制 headless Chrome or Chromium 浏览器的高级 node 库。
文档:https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md
数据存储: SQLite 文件数据库
使用 sequelize orm 进行数据库操作。
推荐安装 Navicat 客户端,可以查看 SQLite 文件的数据。
nodejs 库依赖管理:Yarn
默认的源安装 puppeteer 经常因为网络问题导致失败,需要采用一下方式:
方式一:修改了源 .npmrc(npm)
type puppeteer_download_host = https://npm.taobao.org/mirrors
for yarn
// 生成 ~/.yarnrc 源配置
$ yarn config set puppeteer_download_host https://npm.taobao.org/mirrors
方式二:使用 npm 单独安装 puppeteer
PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org npm i puppeteer
4. 安装
# 安装所有的 js 依赖 yarn 5. 运行
# 获取最新的记录 node index.js # 获取指定年份的记录 node index.js -y 2016 # 获取指定行政级别深度的数据(支持 province, city, district, town) node index.js -d 3 6. 参数
# 查看参数指令 $ node index.js --help
参数 | 简写 | 值 | 默认值 | 描述 |
---|---|---|---|---|
headless | h | y/n | n | 无头模式(没有界面) |
depth | d | 1/2/3/4 | 3 | 采集指定行政级别深度的地区数据 (provice/city/district/town) |
year | y | 数字 | 2016 | 采集指定年份的数据。查看年份 |
concurrency | c | 数字 | 3 | 并发请求数 |
interval | i | 毫秒 | 500 | 采集数据休息的间隙 |
timeout | t | 毫秒 | 3000 | 超时重试的时间 |
数据 | 表名 | 字段 |
---|---|---|
省 | provinces | id, name, code, year, citiesCount |
地级市 | cities | id, name, code, year, districtsCount, provinceId |
区/县 | districts | id, name, code, year, townsCount, cityId |
镇/街道办 | towns | id, name, code, year |
以下是对比 2016年 与 2015年的数据。如果需要对比其他时间,直接更新下面 SQL 脚本上的数字即可。
A. 已经删除的区(县)SQL查询脚本
select p.year, p.name as province_name, c.name as city_name, d1.name as district_name, d1.code as district_code, d1.townsCount as towns_count, 'remove' as result from districts as d1 inner join cities as c on c.id=d1.cityId inner join provinces as p on p.id=c.provinceId left join districts d2 on d2.year=2016 and d2.code=d1.code and d2.name=d1.name where d1.year=2015 and d2.code is null
结果输出
SQL查询脚本
select p.year, p.name as province_name, c.name as city_name, d1.name as district_name, d1.code as district_code, d1.townsCount as towns_count, 'new' as result from districts as d1 inner join cities as c on c.id=d1.cityId inner join provinces as p on p.id=c.provinceId left join districts d2 on d2.year=2015 and d2.code=d1.code and d2.name=d1.name where d1.year=2016 and d2.code is null
结果输出
假设某系统使用的是2015年的数据,需要升级到2016年数据,那么需要以下操作:
找出关联了该区(县)的数据,找替代的区(县)重新关联到该数据 删除上面已移除的区(县) 增加上面新增的区(县) 8.2 地级市的变更同理,脚本稍微调整
移除的城市
select p.year, p.name as province_name, c1.name as city_name, c1.code as city_code, c1.districtsCount as districts_count, 'remove' as result from cities c1 inner join provinces as p on p.id=c1.provinceId left join cities c2 on c2.year=2016 and c2.code=c1.code and c2.name=c1.name where c1.year=2015 and c2.code is null
新增的城市
select p.year, p.name as province_name, c1.name as city_name, c1.code as city_code, c1.districtsCount as districts_count, 'new' as result from cities c1 inner join provinces as p on p.id=c1.provinceId left join cities c2 on c2.year=2015 and c2.code=c1.code and c2.name=c1.name where c1.year=2016 and c2.code is null 地图的行政区域信息更新更快(推荐使用)
高德地图:获取行政区划数据 https://lbs.amap.com/api/webservice/guide/api/district/?sug_index=0
百度地图:百度地图行政区划adcode映射表 http://lbsyun.baidu.com/index.php?title=open/%E5%BC%80%E5%8F%91%E8%B5%84%E6%BA%90
版权声明:
1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。2、网站不提供资料下载,如需下载请到原作者页面进行下载。