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.adcode
taskList.push(function(callback) {
https.get(
`https://restapi.amap.com/v3/config/district?key=您的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).districts
console.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
完成