用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.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 

完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值