在 京东商城
商品详情页 找到了一个 省市区街道 API 接口, 这是一个没有跨域问题 JSONP用的接口, 如果我们不传 callback 就可以直接使用。
接口放在下面
js
例如查国家(全球国家):
https://fts.jd.com/area/get?fid=-1
// 直接浏览器运行即可
// fid=-1 为国家,查其它可以将fid 为 接口 返回的id,进行下级查询。
// 后面查省直接把fid换成对应国家的id的值
// 查地区直接把fid换成对应省的id的值
// 如查中国的省份(fid换成中国的id)
https://fts.jd.com/area/get?fid=4744
// 查河南省的市(fid换成河南省的id)
https://fts.jd.com/area/get?fid=7
// 查河南省周口市的街道(fid换成周口市的id)
https://fts.jd.com/area/get?fid=527
如果想爬取下来所有 中国的省市区 信息,可以可运行下面的 NodeJS 代码
js
const axios = require('axios')
const fs = require('fs')
const sleep = async ms => new Promise(resolve => setTimeout(resolve, ms))
async function getArea(fid = -1) {
const { data } = await axios.get(`https://fts.jd.com/area/get?fid=${fid}`)
return data
}
async function makePlainArea(plain = [], fid = 4744) {
await sleep(500 + Math.random() * 500)
let areas = await getArea(fid)
// areas = areas.slice(0, 3) // 测试
if (!areas.length) {
return
}
for (let area of areas) {
area.pid = fid
plain.push(area)
console.log('即将获取:' + area.name)
await makePlainArea(plain, area.id)
}
}
async function main() {
const plain = []
await makePlainArea(plain, 4744)
fs.writeFileSync('./plain-area.json', JSON.stringify(plain))
console.log('生成完毕')
}
main().catch(console.log)
将 扁平的 数据 转 树结构 参考: