来自与京东的省市县数据扩展包-内置爬虫可自行更新-Composer 安装

6月9号高考结束后更新

  1. 加入了乡镇街道
  2. 可以将本地的资源插入数据库,不需要爬虫抓取。开箱即用
  3. 优化了一下命令行的显示和插入速度

php artisan pca:refreshData
您选择从本地文件中载入省市县数据
如果您要强制从京东获取,请执行php artisan pca:refreshData -d jd
已从本地加载数据完毕,共48054条
数据最后更新时间:2019-06-08 22:50:30
正在插入数据库
48054/48054 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
数据已更新完成
共插入:48054条数据,其中省级行政区:34,城市:457,区县:5171,乡镇街道:42392

每次做新东西,涉及到地址的时候都要写一遍,或者找一个更新的省市县数据包
试过了很多数据来源(国家统计局、网上其他开发者提供的json等)
发现还是会有小部分省市有遗漏。
于是自己做了个,数据是来自于京东,毕竟做电商的,相对来说会更准确、详尽一些。

来自与京东的省市县数据扩展包-内置爬虫可自行更新-composer安装

哈哈哈,发现京东把钓鱼岛也写入进去了。真棒

可以通过composer安装,

安装好了以后,执行一下爬虫,就能获取到京东那边的数据了。

内部自带京东省市县数据爬虫,用户可以自行运行爬取最新的省市县数据

项目地址

https://github.com/aoxiang594/laravel-prov...

安装

composer require aoxiang/province-city-area

添加provider

Aoxiang\Pca\ProvinceCityAreaServiceProvider::class复制到config.phpproviders数组内

生成数据库迁移文件:

php artisan vendor:publish --provider="Aoxiang\Pca\ProvinceCityAreaServiceProvider" --tag="migrations"

执行数据库迁移

php artisan migrate

从京东获取新的省市县数据

php artisan pca:refreshData

来自与京东的省市县数据扩展包-内置爬虫可自行更新-Composer 安装

来自与京东的省市县数据扩展包-内置爬虫可自行更新-Composer 安装

Demo

<?php

namespace App\Http\Controllers;

use Aoxiang\Pca\ProvinceCityArea;
use Illuminate\Routing\Controller as BaseController;

class Controller  extends BaseController{
    public function getProvinceList()
    {
        return response()->json(ProvinceCityArea::getProvinceList());
    }

    public function getCityList()
    {
        ProvinceCityArea::getCityList(1);
    }

    public function test()
    {
        echo ProvinceCityArea::getName(21, 1827, 40847);
        //echo "江西南昌市红谷滩新区";
    }
}

第一次发帖,第一次写轮子,翻迎拍砖~

本帖已被设为精华帖!
本帖由系统于 1个月前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 10

已经star 并且fork,优化了两个地方,提了merge request。 :yum:感谢分享

11个月前 评论

@丁海军 感谢大佬优化,当时写的时候,就一直在想能不能truncate来着。还有其他写的不好的地方,大佬随时指正。感谢.

11个月前 评论

@aoxiang594 互相学习

11个月前 评论
坐忘

已 star , 感觉不错. :+1:

11个月前 评论

这个 有国外的地址吗?

11个月前 评论
aoxiang594 (楼主) 11个月前
gyp719 (作者) 11个月前

搭车安利一份来自淘宝菜鸟物流的扩展包:wi1dcard/china-divisions,同样带爬虫,支持省市区县街道最大五级数据。

11个月前 评论
aoxiang594 (楼主) 11个月前
Wi1dcard (作者) 11个月前

@gyp719 全球地址可参考来自 Google 的数据:https://github.com/google/libaddressinput/...(英文文档),测试过十分详细。

11个月前 评论

我在使用php artisan pca:refreshData -d jd命令时发生一个错误:

  • 我的依赖版本是

    "aoxiang/province-city-area": "^1.2"
  • 错误详情

    https://fts.jd.com/area/get?fid=2667&callback=getAreaList_callbackF&sceneval=2
    解析数据失败.
    
      ErrorException  : Invalid argument supplied for foreach()
    
     at \vendor\aoxiang\province-city-area\src\Commands\RefreshData.php:130
       126|                                         'street_list' => [],
       127|                                     ];
       128|                                     $streetList = $this->getStreet($area['id']);
       129|                                     if ($streetList !== false) {
     > 130|                                         foreach ($streetList as &$street) {
       131|                                             $street['type'] = 'street';
       132|                                             $street['parent_id'] = $area['id'];
       133|                                             $this->line('获取数据成功:'.$province.$city['name'].$area['name'].$street['name']);
       134|                                             unset($street['areaCode']);
    
     Exception trace:
    
     1   Illuminate\Foundation\Bootstrap\HandleExceptions::handleError("Invalid argument supplied for foreach()", \vendor\aoxiang\province-city-area\src\Commands\RefreshData.php")
         \vendor\aoxiang\province-city-area\src\Commands\RefreshData.php:130
    
     2   Aoxiang\Pca\Commands\RefreshData::handle()
         \vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:29
    
     Please use the argument -v to see more details.
  • 错误原因:id为60398的记录 name 中出现了空格(类似的资源应该有很多加了空格)

    [{"id":52693,"name":"\u57CE\u533A"},{"id":14854,"name":"\u62C9\u65AF\u594E\u9547"},{"id":14855,"name":"\u8096\u5C14\u5DF4\u683C\u4E61"},{"id":14853,"name":"\u7389\u9F99\u5580\u4EC0\u9547"},{"areaCode":"","id":60459,"name":"\u53E4\u6C5F\u5DF4\u683C\u8857\u9053"},{"areaCode":"","id":60583,"name":"\u5410\u6C99\u62C9\u4E61"},{"areaCode":"","id":60642,"name":"\u7EB3\u5C14\u5DF4\u683C\u8857\u9053"},{"areaCode":"","id":60692,"name":"\u4F0A\u91CC\u5176\u4E61"},{"areaCode":"","id":60435,"name":"\u5317\u4EAC\u5DE5\u4E1A\u56ED\u533A"},{"areaCode":"","id":60398,"name":"\ \u5409\u4E9A\u4E61"},{"areaCode":"","id":60352,"name":"\u5974\u5C14\u5DF4\u683C\u8857\u9053"},{"id":60324,"name":"\u53E4\u52D2\u5DF4\u683C\u8857\u9053"},{"areaCode":"","id":60727,"name":"\u53E4\u6C5F\u5DF4\u683C\u4E61"}]
  • 解决方案:过滤字符串中的空格

      public function parseJson($data = '')
      {
          $data = preg_replace('/^getAreaList_callback(\w)\(/', '', $data);
          $data = preg_replace('/\)$/', '', $data);
          $data = preg_replace('/[(\xc2\xa0)|\s]+/','', $data);
    
          $data = json_decode($data, true);
          if (is_array($data)) {
              return $data;
          } else {
              return false;
          }
      }

有点粗暴,但是问题解决了

1个月前 评论
aoxiang594 (楼主) 1个月前
Liuzhipeng_laravel (作者) 1个月前
Liuzhipeng_laravel (作者) 1个月前
aoxiang594 (楼主) 1个月前
Liuzhipeng_laravel (作者) 1个月前

@Liuzhipeng_laravel 我也是 这个报错,你写在了 src 包RefreshData.php 文件下,希望作者能合并呢

5天前 评论
Liuzhipeng_laravel 4天前
aoxiang594 (楼主) 20小时前
aoxiang594 (楼主) 20小时前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!