Skip to content

Commit

Permalink
新增通过淘宝接口获取4级地址(街道)
Browse files Browse the repository at this point in the history
  • Loading branch information
maxsky committed Mar 19, 2018
1 parent a64d76c commit e89d75c
Show file tree
Hide file tree
Showing 8 changed files with 48,411 additions and 9,436 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/.idea
/tmp
/node_modules/*
.DS_Store
25 changes: 15 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# taobao-area-php
根据淘宝国家省市区,自动生成CSV和SQL文件
根据淘宝国家省市区,自动生成CSV和SQL文件<br/>
四级地址可选,建议通过命令行 php-cgi ./index.php 运行<br/>
四级地址执行时间略长.....大概需要 10 分钟以上<br/>
数据在 48000 条左右<br/>
通过控制台可见进度,显示数字为区县 ID<br/>
优化了原作者的 SQL 语句

# 说明

Expand All @@ -9,7 +14,7 @@
执行 `index.php` 程序自动建立 `tmp`目录 ,下载`淘宝省市区js`文件存储为`taobao-area.js`,根据`taobao-area.js`文件 自动生成 `area.csv``area.sql`文件,这2个文件 就是你需要的 淘宝全套国家省市区数据


如果你不需要国家数据,把`index.php`中的`$c->setIsCountry(true);`改为`$c->setIsCountry(false);`重新执行程序就是不包含国家数据的 淘宝全套省市区数据
如果你不需要国家数据,把`index.php`中的`$c->setIsCountry(true);`改为`$c->setIsCountry(false);`重新执行程序就是不包含国家数据的淘宝全套省市区数据


# csv 使用说明
Expand All @@ -21,13 +26,13 @@
- 打开`数据`选项卡
- 在界面中,选择 `从文本`
- 在弹出的界面中选择 `area.csv`文件,点击确定
- 会弹出一个 警告 `固定宽度字体 宋体 不存在`直接点击 确定 忽略 这个提示
- 在会话中,选中 `分隔符号`,文件原始格式`Unicode(UTF-8)`,点击 下一步
- 分隔符选择 `制表符`,点击 下一步
- 列数据格式 修改,先选择 `ID` 这列,然后 选择 `文本` 格式,再 选择 `上级ID`这列,然后 选择 `文本` 格式,最后点击 完成
- 最后 直接点击 确定
- 会弹出一个警告 `固定宽度字体 宋体 不存在`直接点击确定 忽略这个提示
- 在会话中,选中 `分隔符号`,文件原始格式 `Unicode(UTF-8)`,点击下一步
- 分隔符选择 `制表符`点击 下一步
- 列数据格式修改,先选择 `ID` 列,然后选择 `文本` 格式,再选择 `上级ID` 列,然后选择 `文本` 格式,最后点击完成
- 最后直接点击确定

# sql 说明
文件编码为 `UTF-8`格式
# SQL 说明
文件编码为 `UTF-8`

会自动创建 2张表 `area``area_ext`其他请看SQL 文件
会自动创建两张表 `area``area_ext`详情请看 SQL 文件
100 changes: 77 additions & 23 deletions area.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ class area {
private $file_name = 'taobao-area.js';
private $is_country = true;
private $make_csv = false;
private $make_sql = true;
private $make_sql = false;
private $make_js_data = false;
private $ext_data = [];
//省
Expand Down Expand Up @@ -84,14 +84,14 @@ public function setMakeSql($make_sql) {
*
* @param array $ext_data
*/
public function setExtData($ext_data) {
public function setExtData($ext_data = []) {
$this->ext_data = $ext_data;
}

/**
* @param bool $make_js_data
*/
public function setMakeJsData($make_js_data) {
public function setMakeJsData($make_js_data = false) {
$this->make_js_data = $make_js_data ? true : false;
}

Expand Down Expand Up @@ -267,8 +267,45 @@ private function processArea() {
$add['other_name'] = '';//类别名称
$add['name_format'] = '';//格式化全称
$this->province_city[] = $add;
}
if (!$this->make_js_data) {
// 以下代码删除后仅生成三级地区(到区县)
if (substr($val[0], -3, 3) !== '100') {
echo $val[0] . "\n";
ob_flush();
// 简中
$streets_SC = file_get_contents('http://lsp.wuliu.taobao.com/locationservice/addr/output_address_town_array.do?l1=' . $val[2] . '&l2=' . $val[0] . '&lang=zh-S');
$streets_SC = substr($streets_SC, 30);
$streets_SC = substr($streets_SC, 0, -3);
$streets_SC = str_replace("'", '"', $streets_SC);
$arr_streets_SC = json_decode($streets_SC, true);

// 繁中
$streets_TC = file_get_contents('http://lsp.wuliu.taobao.com/locationservice/addr/output_address_town_array.do?l1=' . $val[2] . '&l2=' . $val[0] . '&lang=zh-T');
$streets_TC = substr($streets_TC, 30);
$streets_TC = substr($streets_TC, 0, -3);
$streets_TC = str_replace("'", '"', $streets_TC);
$arr_streets_TC = json_decode($streets_TC, true);

foreach ((array)$arr_streets_SC as $s_sc) {
$add = [];
$add['id'] = $s_sc[0];
$add['name'] = $s_sc[1];
foreach ((array)$arr_streets_TC as $s_tc) {
if ($s_sc[0] === $s_tc[0]) {
$add['name_traditional'] = $s_tc[1];
break;
}
}
$add['parent_id'] = $s_sc[2];
$add['type'] = 0;
$add['type_name'] = '';//类别名称
$add['other_name'] = '';//类别名称
$add['name_format'] = '';//格式化全称
$this->province_city[] = $add;
}
}
}
}
}
}
// echo $html;
Expand Down Expand Up @@ -440,42 +477,46 @@ private function makeCsv() {
private function makeSql() {
$sql = [];
$sql[] = <<<EOF
DROP TABLE IF EXISTS `area`;
CREATE TABLE `area` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` CHAR(50) DEFAULT '' COMMENT '名称',
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT '' COMMENT '名称',
`name_traditional` VARCHAR(50) DEFAULT '' COMMENT '繁体名称',
`name_en` VARCHAR(100) DEFAULT '' COMMENT '英文名称',
`parent_id` INT(11) DEFAULT '0' COMMENT '上级栏目ID',
`type` TINYINT(4) DEFAULT '0' COMMENT '类别;0默认;1又名;2;3属于;11已合并到;12已更名为',
`sort` INT(11) DEFAULT '0' COMMENT '排序',
`parent_id` INT(10) UNSIGNED DEFAULT '0' COMMENT '上级栏目ID',
`type` TINYINT(2) UNSIGNED DEFAULT '0' COMMENT '类别;0默认;1又名;2;3属于;11已合并到;12已更名为',
`sort` INT(10) UNSIGNED DEFAULT '0' COMMENT '排序',
`type_name` VARCHAR(50) DEFAULT '' COMMENT '类别名称',
`other_name` VARCHAR(50) DEFAULT '' COMMENT '根据类别名称填写',
`name_format` CHAR(80) DEFAULT NULL COMMENT '格式化全称',
`name_format` VARCHAR(80) DEFAULT '' COMMENT '格式化全称',
PRIMARY KEY (`id`),
KEY `id` (`id`,`parent_id`,`sort`) USING BTREE,
KEY `name` (`name`),
KEY `name_format` (`name_format`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='地区表';
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='地区表';
DROP TABLE IF EXISTS `area_ext`;
CREATE TABLE `area_ext` (
`ext_id` INT(11) NOT NULL AUTO_INCREMENT,
`id` INT(11) DEFAULT '0' COMMENT 'ID',
`name` CHAR(50) DEFAULT '' COMMENT '名称',
`ext_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`id` INT(10) UNSIGNED DEFAULT '0' COMMENT 'ID',
`name` VARCHAR(50) DEFAULT '' COMMENT '名称',
`name_traditional` VARCHAR(50) DEFAULT '' COMMENT '繁体名称',
`name_en` VARCHAR(100) DEFAULT '' COMMENT '英文名称',
`parent_id` INT(11) DEFAULT '0' COMMENT '上级栏目ID',
`type` TINYINT(4) DEFAULT '0' COMMENT '类别;0默认;1又名;2;3属于;11已合并到;12已更名为',
`sort` INT(11) DEFAULT '0' COMMENT '排序',
`parent_id` INT(10) UNSIGNED DEFAULT '0' COMMENT '上级栏目ID',
`type` TINYINT(2) UNSIGNED DEFAULT '0' COMMENT '类别;0默认;1又名;2;3属于;11已合并到;12已更名为',
`sort` INT(10) UNSIGNED DEFAULT '0' COMMENT '排序',
`type_name` VARCHAR(50) DEFAULT '' COMMENT '类别名称',
`other_name` VARCHAR(50) DEFAULT '' COMMENT '根据类别名称填写',
`name_format` CHAR(80) DEFAULT NULL COMMENT '格式化全称',
`name_format` VARCHAR(80) DEFAULT '' COMMENT '格式化全称',
PRIMARY KEY (`ext_id`),
KEY `id` (`id`,`parent_id`,`sort`) USING BTREE,
KEY `name_format` (`name_format`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='地区扩展表';
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='地区扩展表';
EOF;
$t = 0;
foreach ($this->province_city as $val) {
$t++;
$val['id'] = (int)$val['id'];
$val['parent_id'] = (int)$val['parent_id'];
$val['type'] = (int)$val['type'];
Expand All @@ -490,10 +531,18 @@ private function makeSql() {
} else {
$val['name_format'] = '';
}
$sql[] = "INSERT INTO `area` (`id`,`name`,`name_traditional`,`name_en`,`parent_id`,`type`,`type_name`,`other_name`,`name_format`)VALUE ('{$val['id']}', '{$val['name']}', '{$val['name_traditional']}', '{$val['name_en']}', '{$val['parent_id']}', '{$val['type']}', '{$val['type_name']}', '{$val['other_name']}', '{$val['name_format']}');";
if ($t === 1) {
$sql[] = "INSERT INTO `area` (`id`,`name`,`name_traditional`,`name_en`,`parent_id`,`type`,`type_name`,`other_name`,`name_format`) VALUES ('{$val['id']}', '{$val['name']}', '{$val['name_traditional']}', '{$val['name_en']}', '{$val['parent_id']}', '{$val['type']}', '{$val['type_name']}', '{$val['other_name']}', '{$val['name_format']}')";
} else {
$sql[] = ", ('{$val['id']}', '{$val['name']}', '{$val['name_traditional']}', '{$val['name_en']}', '{$val['parent_id']}', '{$val['type']}', '{$val['type_name']}', '{$val['other_name']}', '{$val['name_format']}')";
}
}
$sql[] = ';';

//扩展
$t = 0;
foreach ($this->province_city_ext as $val) {
$t++;
$val['id'] = (int)$val['id'];
$val['parent_id'] = (int)$val['parent_id'];
$val['type'] = (int)$val['type'];
Expand All @@ -508,8 +557,13 @@ private function makeSql() {
} else {
$val['name_format'] = '';
}
$sql[] = "INSERT INTO `area_ext` (`id`,`name`,`name_traditional`,`name_en`,`parent_id`,`type`,`type_name`,`other_name`,`name_format`)VALUE ('{$val['id']}', '{$val['name']}', '{$val['name_traditional']}', '{$val['name_en']}', '{$val['parent_id']}', '{$val['type']}', '{$val['type_name']}', '{$val['other_name']}', '{$val['name_format']}');";
if ($t === 1) {
$sql[] = "INSERT INTO `area_ext` (`id`,`name`,`name_traditional`,`name_en`,`parent_id`,`type`,`type_name`,`other_name`,`name_format`) VALUES ('{$val['id']}', '{$val['name']}', '{$val['name_traditional']}', '{$val['name_en']}', '{$val['parent_id']}', '{$val['type']}', '{$val['type_name']}', '{$val['other_name']}', '{$val['name_format']}')";
} else {
$sql[] = ", ('{$val['id']}', '{$val['name']}', '{$val['name_traditional']}', '{$val['name_en']}', '{$val['parent_id']}', '{$val['type']}', '{$val['type_name']}', '{$val['other_name']}', '{$val['name_format']}')";
}
}
$sql[] = ';';
//写入存储文件
file_put_contents($this->getTmpPath() . 'area.sql', implode("\n", $sql));
}
Expand Down Expand Up @@ -537,7 +591,6 @@ private function processExtData() {
$this->province_city[] = $add;
}
}

}
}
}
Expand Down Expand Up @@ -568,9 +621,11 @@ public function process() {
}
if ($this->make_csv) {
$this->makeCsv();
echo "Make csv data file SUCCESS\n";
}
if ($this->make_sql) {
$this->makeSql();
echo "Make sql data file SUCCESS\n";
}
//生成js 数据
if ($this->make_js_data) {
Expand All @@ -581,7 +636,6 @@ public function process() {
$makeJs->setCityExt($this->province_city_ext);
$makeJs->process();
}
echo "make SUCCESS \n";
return true;
}
}
18 changes: 7 additions & 11 deletions index.php
Original file line number Diff line number Diff line change
@@ -1,26 +1,22 @@
<?php

include "area.php";
include "area_ext.php";
//淘宝收货地址页面
// 淘宝收货地址页面
$js_url = 'https://g.alicdn.com/vip/address/6.0.14/index-min.js';

//生成 SQL 和CSV
// 生成 JS DATA
$c = new area();
$c->setUrl($js_url);
$c->setIsCountry(true);
$c->setMakeCsv(true);
// 扩展数据,
$c->setExtData($ext);
$c->setMakeJsData(true);
$c->process();


// 生成 JS DATA

//生成 SQL 和CSV
$c = new area();
$c->setUrl($js_url);
$c->setIsCountry(false);
$c->setIsCountry(true);
$c->setMakeCsv(false);
$c->setMakeSql(false);
$c->setMakeJsData(true);
$c->setExtData($ext);
$c->setMakeSql(true);
$c->process();
2 changes: 1 addition & 1 deletion makeJsData.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public function process() {
EOF;
//写入存储文件
file_put_contents($this->path . 'city-picker.data.js', $str);
echo "make js data Success ";
echo "Make js data file Success\n";
return true;
}
}
Loading

0 comments on commit e89d75c

Please sign in to comment.