china-admin-area
Version:
中华人民共和国行政区域数据,适配element-ui antd级联组件
127 lines (118 loc) • 3.39 kB
JavaScript
const cheerio = require('cheerio')
const md5 = require('md5')
const fs = require('fs')
const request = require('superagent')
require('superagent-charset')(request)
const version = '2020'
async function getPage(url) {
let content = ''
const id = md5(url)
const file = `./temp/${id}.html`
if (fs.existsSync(file)) {
content = fs.readFileSync(file, 'utf-8')
} else {
await request.get(url)
.buffer(true)
.charset("gbk")
.then(function (res) {
content = res.text;
fs.writeFileSync(file, content)
})
.catch((err) => {
console.log(err)
})
}
return content
}
;
(async () => {
const cityIds = []
const rs = {
'86': {}
}
const level0 = await getPage(
`http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/${version}/index.html`)
const $ = cheerio.load(level0)
const list = $('.provincetr td a')
const provinces = []
const urls = []
list.each((index, el) => {
const url =
`http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/${version}/${$(el).attr('href')}`
const data = {
id: $(el).attr('href').split('.')[0] + '0000',
name: $(el).text()
}
rs['86'][data.id] = data.name
urls.push(url)
})
// 市级
for (const url of urls) {
const level1 = await getPage(url)
const $ = cheerio.load(level1)
const list = $('.citytr td a')
const countyUrls = []
list.each(async (index, el) => {
const url =
`http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/${version}/${$(el).attr('href')}`
// filter number
const text = $(el).text()
if (!/\d+/.test(text)) {
const data = {
id: $(el).attr('href').split('.')[0].slice(3) + '00',
name: $(el).text()
}
const parentId = data.id.slice(0, 2) + '0000'
if (!rs[parentId]) {
rs[parentId] = {}
}
cityIds.push(data.id)
rs[parentId][data.id] = data.name
}
countyUrls.push(url)
})
// 区县
for (const _url of countyUrls) {
const level2 = await getPage(_url)
const $ = cheerio.load(level2)
const list = $('.countytr td, .towntr td')
list.each(async (index, el) => {
const link = $(el).find('a')
let data = {}
if (link.length) {
if (!/\d+/.test($(el).text())) {
data = {
id: $(link[0]).attr('href').split('.')[0].split('/')[1],
name: $(el).text()
}
}
} else {
if (!/\d+/.test($(el).text())) {
data = {
id: $(list[index - 1]).text().replace(/0+$/g, ''),
name: $(el).text()
}
}
}
if (data.id) {
const parentId = data.id.slice(0, 4) + '00'
if (!rs[parentId]) {
rs[parentId] = {}
}
rs[parentId][data.id] = data.name
}
})
}
}
setTimeout(() => {
fs.writeFileSync('../data.json', JSON.stringify(Object.assign({}, rs), null, 2))
fs.writeFileSync('./data.json', JSON.stringify(Object.assign({}, rs), null, 2))
const _2levelCityIds = cityIds.filter(c => {
return Object.keys(rs[c] || {}).length > 0
})
fs.writeFileSync('./only_2_level_city_id.json', JSON.stringify(
_2levelCityIds, null, 2))
console.log('done')
process.exit(0)
}, 6000)
})()