用Node抓取 全国省市区县的code,并生成树形据结构数据

编程入门 行业动态 更新时间:2024-10-12 05:55:59

用Node抓取 全国省市<a href=https://www.elefans.com/category/jswz/34/1751175.html style=区县的code,并生成树形据结构数据"/>

用Node抓取 全国省市区县的code,并生成树形据结构数据

1、抓取资源高德地图,调用高德web api 

使用API前您需先申请Key,若无高德地图API账号需要先申请账号

安装node第三方模块 

npm install async

 创建 get-all-code-list.js文件,拷贝以下代码

const https = require('https');
const fs = require('fs');
const async = require('async');const provinceList = [{"name": "北京市","adcode": 110000
}, {"name": "天津市","adcode": 120000
}, {"name": "河北省","adcode": 130000
}, {"name": "山西省","adcode": 140000
}, {"name": "内蒙古自治区","adcode": 150000
}, {"name": "辽宁省","adcode": 210000
}, {"name": "吉林省","adcode": 220000
}, {"name": "黑龙江省","adcode": 230000
}, {"name": "上海市","adcode": 310000
}, {"name": "江苏省","adcode": 320000
}, {"name": "浙江省","adcode": 330000
}, {"name": "安徽省","adcode": 340000
}, {"name": "福建省","adcode": 350000
}, {"name": "江西省","adcode": 360000
}, {"name": "山东省","adcode": 370000
}, {"name": "河南省","adcode": 410000
}, {"name": "湖北省","adcode": 420000
}, {"name": "湖南省","adcode": 430000
}, {"name": "广东省","adcode": 440000
}, {"name": "广西壮族自治区","adcode": 450000
}, {"name": "海南省","adcode": 460000
}, {"name": "重庆市","adcode": 500000
}, {"name": "四川省","adcode": 510000
}, {"name": "贵州省","adcode": 520000
}, {"name": "云南省","adcode": 530000
}, {"name": "西藏自治区","adcode": 540000
}, {"name": "陕西省","adcode": 610000
}, {"name": "甘肃省","adcode": 620000
}, {"name": "青海省","adcode": 630000
}, {"name": "宁夏回族自治区","adcode": 640000
}, {"name": "新疆维吾尔自治区","adcode": 650000
}, {"name": "台湾省","adcode": 710000
}, {"name": "香港特别行政区","adcode": 810000
}, {"name": "澳门特别行政区","adcode": 820000
}]//任务队列
let taskList = []//所有code列表
let codeList = []// 遍历树
const mapTree = ({tree,pCode
}) => {tree.forEach(item => {codeList.push({adcode: item.adcode,name: item.name,pCode})if (item.districts && item.districts.length) {mapTree({tree: item.districts,pCode: item.adcode})}})
}const writeFile = (file) => {fs.writeFile(`./cityList/listFromAPI.json`, JSON.stringify(file), function(error) {if (error) {console.log(`listFromAPI.json 文件写入失败`);} else {console.log(`listFromAPI.json 文件写入成功`);}});
}// keywords
// 规则:只支持单个关键词语搜索关键词支持:行政区名称、citycode、adcode
// 例如,在subdistrict=2,搜索省份(例如山东),能够显示市(例如济南),区(例如历下区)// subdistrict
// 规则:设置显示下级行政区级数(行政区级别包括:国家、省/直辖市、市、区/县4个级别)
// 可选值:0、1、2、3
// 0:不返回下级行政区;
// 1:返回下一级行政区;
// 2:返回下两级行政区;
// 3:返回下三级行政区;// extensions
// 此项控制行政区信息中返回行政区边界坐标点; 可选值:base、all;
// base:不返回行政区边界坐标点;
// all:只返回当前查询district的边界值,不返回子节点的边界值;// 遍历省份,获取所有城市列表
console.log('开始任务');
console.time('访问时间统计');
provinceList.forEach(province => {const adcode = province.adcodetaskList.push(function(callback) {https.get(`=您的key&keywords=${adcode}&subdistrict=3&extensions=base`,function(res) {var jsonFile = "";res.on("data", function(data) {jsonFile += data;});res.on('end', function() {const treeData = JSON.parse(jsonFile).districtsconsole.log(`${province.name}完成`)mapTree({tree: treeData,pCode: null})callback(null)})})})
})async.waterfall(taskList, function(err, result) {console.timeEnd('访问时间统计');if (err) return console.log(err);console.log('全部访问成功');codeList = codeList.filter(item => item.adcode != item.pCode)fs.access("./cityList", (err) => {if (err) {fs.mkdir("cityList", function(error) {if (error) {console.log(`cityList文件夹创建失败:${error}`);return false;} else {console.log(`cityList文件夹创建成功`);writeFile(codeList)}});} else {writeFile(codeList)}})})

2、查询省市区街道code

运行以下代码 

node get-all-code-list.js

 

 

 此时所有的数据已经抓取完成

3、生产树形结构数据

 创建 formatTree.js文件,拷贝以下代码

const fs = require('fs');
const path = require('path'); //解析需要遍历的文件夹const filePath = path.resolve('./cityList/listFromAPI.json');fs.readFile(filePath, 'utf8', (err, result) => {if (err) throw err;writeFile(JSON.stringify(getTreeData(JSON.parse(result))))
})function writeFile(file) {fs.writeFile(`./cityList/formatTree.json`, file, function(error) {if (error) {console.log(`formatTree.json 文件写入失败`);} else {console.log(`formatTree.json 文件写入成功`);}});
}function getTreeData(arr) {let parents = arr.filter(item => !item.pCode); //取出根节点let childrens = arr.filter(item => item.pCode); //取出子节点function translator(parents, childrens) {parents.forEach(item => {childrens.forEach(items => {if (items.pCode === item.adcode) {item.children ? item.children.push(items) : item.children = [items];translator([items], childrens);}})})}translator(parents, childrens);return parents
}

 运行以下代码 ,生成数据 会存放在/cityList/formatTree.json文件当中

node formatTree.js 

完成

更多推荐

用Node抓取 全国省市区县的code,并生成树形据结构数据

本文发布于:2024-03-09 05:13:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1723927.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:区县   省市   结构   数据   全国

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!