跳转至

公司地址智能解析(基于JavaScript接口)

在研究当中可能需要用到公司地址信息,尽管很多数据库都提供这一数据,但其对公司所处行政区划的细分可能不符合我们的要求。例如,我们想获取省、市、区三级行政区划,但CSMAR数据库没有相应的细分数据,只能自行构建。

这篇文章介绍如何部署JavaScript接口,从而在Python中调用接口进行公司地址的智能解析。

graph TD
  A(输入:广东省深圳市福田区益田路5023号平安金融中心B座);
  A --> B(解析);
  B --> C(省份:广东省);
  B --> D(城市:深圳市);
  B --> E(城区:福田区);
  B --> F(邮政编码:440304);
  B --> G(...);

自行提取行政区划的可行思路是将公司地址进行切分,然后与全国行政区划进行对照,但我们其实不应该在研究中这种细枝末节的地方花费太多时间精力。联想到快递寄件时基本都有智能地址解析功能,说明这一技术已经成熟。

的确,GitHub上有不少国内地址解析的项目,但大多都基于JavaScript语言,这一语言通常活跃在互联网应用领域,我们接触不多。好在我们可以通过简单几行JavaScript代码部署一个智能地址解析的接口,然后在Python当中通过这个接口来对我们的公司地址数据进行解析。

部署接口-JavaScript

我选择了zh-address-parse这个智能地址解析项目,要将其部署首先需要安装JavaScript开发环境Node.js

安装完成后在任意位置新建一个文件夹用来放置接口所需要的代码。然后,我们要安装所需的JavaScript库。在刚刚新建的文件夹下打开命令行,输入下列命令安装用于部署接口的express库和刚刚提到用于智能地址解析的zh-address-parse库:

npm install express

npm i zh-address-parse -s

接着,我们编写接口的JavaScript代码,JS也属于面向对象编程的语言,与python相似。在文件夹下新建文本文档,命名为app.js,写入下列代码:

// 导入express框架
const express = require('express');

// 导入刚刚安装的地址解析库
const AddressParse = require('./node_modules/zh-address-parse/dist/zh-address-parse.min.js')

Tip

npm所下载的框架/库会放置在node_modules文件夹下,对于zh-address-parse这个库我们只导入了zh-address-parse.min.js这个文件,.min.js表明该文件包含了这个库的完整功能

我们继续向app.js中写入代码:

const app = express();  // 实例化express对象,取名为app,它就是我们的服务器
app.use(express.json());  // 服务器接收json格式的输入

// 定义向服务器的/parse路径进行发送的post请求
app.post('/parse', (req, res) => {
    // post请求中需要包含options和address两个属性
    const address = req.body.address; // address即为待解析地址
    const options = req.body.options; // options为解析时的一些选项
    // 将address和options传入地址解析库AddressParse,返回的结果保存在result变量里
    const result = AddressParse(address, options);
    // 定义post的相应为json格式,内容为result
    res.json(result);
});

// 定义向服务器根目录发送的get请求
// 用来测试我们的服务是否正常工作:对根目录发送get请求时,显示一些提示文字
app.get('/', (req, res) => {
  res.send('服务正在运行');
});

// 将服务器映射到本地的3000端口上
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Parse server running on port ${PORT}`);
});

编写完JavaScript代码之后,在文件夹中打开命令行输入node app.js即可运行我们的接口,在浏览器中访问http://localhost:3000/ 便可以测试我们的接口运行情况。

调用接口-Python

接口部署完毕后,我们就可以在python中调用接口了。我们需要构造一个字典,包含address和options两个键,address对应的值就是我们待解析的地址,而options对应的值是解析时的选项,应该参考zh-address-parse的说明

address = "广东省深圳市福田区益田路5023号平安金融中心B座"

# 根据zh-address-parse的说明:
options = {"type": 1, # 哪种方式解析,0:正则,1:树查找
           "textFilter": [], # 预清洗的字段
           "nameMaxLength": 4, # 查找最大的中文名字长度
           "extraGovData": {
               "city": [{"name": "name", "code": "code", "provinceCode": "provinceCode"}],
               "province": [{"name": "name", "code": "code"}],
               "area": [{"name": "name", "code": "code", "provinceCode": "provinceCode", "cityCode": "cityCode"}]
           }
          }

json = {"address": address,
        "options": options}

最后,我们使用requests库对接口的urlhttp://localhost:3000/parse 发送post请求。在返回的结果中,province,city和area就对应了省、市、区三级行政区划:

url = "http://localhost:3000/parse"
response = requests.post(url, json=json)
response.json()

# output
# {'phone': '',
#  'province': '广东省',
#  'city': '深圳市',
#  'area': '福田区',
#  'detail': '益田路5023号平安金融中心B座',
#  'name': '',
#  'postalCode': '',
#  'areaCode': '440304'}

Warning

如果Python是运行在Docker容器当中,http://localhost:3000/parse对应的是虚拟机自身的本地3000端口,但地址解析接口是部署在宿主机的3000端口上,因此需要将url改为http://host.docker.internal:3000/parse以表明是向宿主机进行请求