抓取县市地图json数据

找了网上很多资源,不是数据太老数据有问题,就是要收费☹,于是自己抓取了一下阿里的数据

数据源

项目源码


数据都是异步获取写入,所以使用了axios,node版本是12.10.0 引入需要的资源:

import http from 'axios'
import fs from 'fs'

地址和地址拼接函数:

const baseUrl = 'http://datavmap-public.oss-cn-hangzhou.aliyuncs.com/areas/'

function ug(sort, code1, code2 = '00') {
    return baseUrl + sort + '/51' + code1 + code2 + '.json'
}

nodejs里面异步接口都是回调函数,在这里不太好用,转换成基于promise的:

function promisify(fn, t, argsNum = 3) { //t:this  args:参数个数
    return (...args) => {
        let arr = Array.from(args).slice(0, argsNum - 2)
        return new Promise((resolve, reject) => {
            fn.call(t, ...arr, args[argsNum - 2] || {}, (err, res) => {
                return err ? reject(err) : resolve(res)
            })
        })
    };
}

const rmdir = promisify(fs.rmdir, fs),
    mkdir = promisify(fs.mkdir, fs),
    appendFile = promisify(fs.appendFile, fs, 4)

promise更易用,代码可读性也高,相应的性能会下降一些。bluebird性能做过优化,相对promise会高一些,这里数据比较小就先自己搞一哈。

有两种获取方式,并发获取:

const children = [...Array(35).keys()]
const bound = [...Array(100).keys()]
bound.shift()
async function getConcurrent() {
    try {
        await rmdir('./map', {recursive: true})
        await mkdir('./map', {recursive: true})
    } catch (e) {
        console.log(e)
    }
    children.map(async (i) => {
        let code1 = i.toString().padStart(2, '0')
        try {
            let r = await http.get(ug('children', code1))
            await (async (r) => {
                await console.log('获取children/51' + code1 + '00成功')
                await appendFile('./map/51' + code1 + '00.json', JSON.stringify(r.data))
                console.log('保存children/51' + code1 + '00成功')
            })(r)
        } catch (e) {
        }
        bound.map(async (j) => {
            let code2 = j.toString().padStart(2, '0')
            try {
                let r = await http.get(ug('bound', code1, code2))
                await (async (r) => {
                    await console.log('###获取bound/51' + code1 + code2 + '成功')
                    await appendFile('./map/51' + code1 + code2 + '.json', JSON.stringify(r.data))
                    console.log('###保存bound/51' + code1 + code2 + '成功')
                })(r)
            } catch (e) {
            }
        })
    })
}

继发:

async function getSuccessive() {
    try {
        await rmdir('./map', {recursive: true})
        await mkdir('./map', {recursive: true})
    } catch (e) {
        console.log(e)
    }

    for (let i = 0; i < 35; i++) {
        let code1 = i.toString().padStart(2, '0')
        try {
            let r = await http.get(ug('children', code1))
            await (async (r) => {
                await console.log('获取children/51' + code1 + '00成功')
                await appendFile('./map/51' + code1 + '00.json', JSON.stringify(r.data))
                console.log('保存children/51' + code1 + '00成功')
            })(r)
        } catch (e) {
        }

        for (let j = 1; j < 100; j++) {
            let code2 = j.toString().padStart(2, '0')
            try {
                let r = await http.get(ug('bound', code1, code2))
                await (async (r) => {
                    await console.log('###获取bound/51' + code1 + code2 + '成功')
                    await appendFile('./map/51' + code1 + code2 + '.json', JSON.stringify(r.data))
                    console.log('###保存bound/51' + code1 + code2 + '成功')
                })(r)
            } catch (e) {
            }
        }
    }
}

并发明显比继发快很多 运行:

function run(option = false) {
    option ? getSuccessive() : getConcurrent()
}

run()

抓取其他地区的修改下数据和编号就可以,后续会抓取国家地理信息网的数据

原文链接:segmentfault.com

上一篇:TypeScript学习8:高级类型-交叉类型、联合类型
下一篇:JavaScript中的数组排序:sort、冒泡和二分法

相关推荐

  • 高效遍历匹配Json数据,避免嵌套循环

    工作中经常会遇到这样的需求: 1.购物车列表中勾选某些,点击任意一项,前往详情页,再返回购物车依旧需要呈现勾选状态 2.勾选人员后,前往别的页面,再次返回,人员依旧程勾选状态 3.等等.......

    2 年前
  • 面试题|手写JSON解析器

    这周的 Cassidoo 的每周简讯有这么一个面试题:: 写一个函数,这个函数接收一个正确的 JSON 字符串并将其转化为一个对象(或字典,映射等,这取决于你选择的语言)。

    3 个月前
  • 隐藏某些价值观输出stringify() JSON。

    Evan CarrollNilesh(https://stackoverflow.com/users/124486/evancarroll)提出了一个问题:Hide certain values in...

    2 年前
  • 随着Nodejs JSON对象响应(转换对象数组JSON字符串)

    Rudolf Olahclimboid(https://stackoverflow.com/users/9903/rudolfolah)提出了一个问题:Responding with a JSON o...

    2 年前
  • 铬sendrequest错误:列表的循环结构转换到JSON

    SomeKittensSkizit(https://stackoverflow.com/users/1216976/somekittens)提出了一个问题:Chrome sendrequest err...

    2 年前
  • 重新认识 package.json

    前言 🤔 在每个项目的根目录下面,一般都会有一个 package.json 文件,其定义了运行项目所需要的各种依赖和项目的配置信息(如名称、版本、许可证等元数据)。

    4 天前
  • 重新认识 package.json

    前言 🤔 在每个项目的根目录下面,一般都会有一个 package.json 文件,其定义了运行项目所需要的各种依赖和项目的配置信息(如名称、版本、许可证等元数据)。

    19 天前
  • 遍历json获得数据的几种方法小结

    Json在Web开发的用处非常广泛,作为数据传递的载体,如何解析Json返回的数据是非常常用的。下面介绍下四种解析Json的方式: Part 1 Part 2 解释: countryO...

    3 年前
  • 通过jsonp获取json数据实现AJAX跨域请求

    AJAX()是用于创建快速动态网页的一种技术,它在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页,ajax 使用对象在后台与服务器交换数据,XMLHttpRequest 是 AJAX 的基...

    3 年前
  • 通过JavaScript创建JSON对象动态(无级连字符串)

    Waqar Alamgirohadinho(https://stackoverflow.com/users/457124/waqaralamgir)提出了一个问题:Create JSON object...

    2 年前

官方社区

扫码加入 JavaScript 社区