感谢京东大哥的慷慨解囊

https://fts.jd.com/area/get?fid=4744

4744就是起始值,拿到的就是一级数据(全国各省的数据以及直辖市)

浏览器是经过编码的,unicode解码就可以看到数据,不过php不需要,直接就可以拿到数据

前三级的街道,一次性拿到,代码没有写请求失败后的处理,不过将请求失败时候,将complete改为flase,这样子请求完后只需要将为false的重新请求即可

/*** [CAN_POST].*/public function address(){set_time_limit(3600);$province = $this->get_address('4744');if (false == $province) {throw new Exception('一级省份请求失败,fid:4744');}foreach ($province as $value) {if ('海外' == $value['name']) {continue;}$value = (array) $value;$province_add_info = ['name' => $value['name'],'parent_id' => '','level' => 1,'order_no' => $value['id'],'complete' => true,];$province_id = $this->db->default->insert('province_city', $province_add_info);$city = $this->get_address($value['id']);if (false == $city) {$this->db->default->update('province_city', ['_id' => $province_id], ['complete' => false]);continue;}if(empty($city)){continue;}foreach ($city as $value) {$value = (array) $value;$city_add_info = ['name' => $value['name'],'parent_id' => $province_id,'level' => 2,'order_no' => $value['id'],'complete' => true,];$city_id = $this->db->default->insert('province_city', $city_add_info);$area = $this->get_address($value['id']);if (false == $area) {$this->db->default->update('province_city', ['_id' => $city_id], ['complete' => false]);continue;}if(empty($area)){continue;}foreach ($area as $value) {$value = (array) $value;$area_add_info = ['name' => $value['name'],'parent_id' => $city_id,'level' => 3,'order_no' => $value['id'],"complete" => true,];$this->db->default->insert('province_city', $area_add_info);}}}}

拿到第四级街道的数据

    /*** [CAN_POST].* [NOT_LOG].*/public function get_four_address(){// 由于默认是超时时间是60s,所以要设置超时时间久一些set_time_limit(7200);// 拿到第三级的数据$area = $this->db->default->get_rows('province_city', ['level' => 3]);if(empty($area)){throw new Exception("没有第三级数据");}foreach ($area as $area_info) {$street = $this->get_address($area_info['order_no']);if (false == $street) {// 如果请求失败,就把这一级的complete字段设置为false,下次跑数据就可以直接跳过完成了的$this->db->default->update('province_city', ['_id' => $area_info['id']], ['complete' => false]);continue;}if (empty($street)) {continue;}foreach ($street as $value) {$value = (array) $value;$area_add_info = ['name' => $value['name'],'parent_id' => $area_info['id'],'level' => 4,'order_no' => $value['id'],];// 插入数据$this->db->default->insert('province_city', $area_add_info);}}}

发起请求,通过传递fid参数来请求拿到下一级的数据

    public function get_address($fid){//再次感谢京东,接口开放,直接拿fid发起请求就能拿到数据$result = http_get('https://fts.jd.com/area/get?fid='.$fid);//php 似乎无法识别数据中的空格字符,本来是数据中作为空格的,但是php需要做一些处理$result = str_replace('\ ', ' ', $result);$result = json_decode($result, true);// 请求失败可能会返回一个{}或者falseif (!$result || is_object($result)) {return false;}return $result;}

拿到的数据,order_no既可以作为排序,也可以作为请求下一级的fid请求参数(比如天津的order_no是3,所以get_address(3)拿到的数据就是天津下一级的区,如果已经是叶子节点了,再往下就是[]空数组)

PHP抓取全国省市区数据相关推荐

  1. java 省市县数据_使用Jsoup抓取全国地区数据(省市县镇村)

    最近手头在做一些东西,需要一个全国各地的地域数据,从省市区到县镇乡街道的.各种度娘,各种谷歌,都没找到一个完整的数据.最后功夫不负有心人,总算找到一份相对来说比较完整的数据,但是这里的数据也只是精确到 ...

  2. Python爬虫小记(2) :抓取全国各省市疫情实时数据 绘制2019-nCoV疫情地图

     2021/07/15更新:         没有及时看到评论区反馈的问题,属实抱歉,拉下代码看了一下应该是Pyecharts中Map的data_pair数据类型发生了变化,现将dic_items转化 ...

  3. Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据流程分析【转】

    Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据&流程分析 QQ空间说说抓取难度比较大,花了一个星期才研究清楚! 代码请移步到GitHub GitHub地址:http ...

  4. 微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”...

    微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友 ...

  5. 如何使用浏览器控制台通过JavaScript抓取并将数据保存在文件中

    by Praveen Dubey 通过Praveen Dubey 如何使用浏览器控制台通过JavaScript抓取并将数据保存在文件中 (How to use the browser console ...

  6. directsound抓取麦克风PCM数据封装类

    directsound抓取麦克风PCM数据封装类 网上有很多方法从麦克风读取PCM数据,不想一一举例.只是在这里发布一个我自己写的directsound的麦克风PCM数据采集类,通过它,可以很方便的利 ...

  7. Python中使用PhantomJS抓取Javascript网页数据

    有些网页不是静态加载的,而是通过javascirpt函数动态加载网页,比如下面这个网页,表格中的看涨合约和看跌合约的数据都是通过javascirpt函数从后台加载.仅仅使用beautifulsoup并 ...

  8. Fiddler 详尽教程与抓取移动端数据包

    转载自:http://blog.csdn.net/qq_21445563/article/details/51017605 阅读目录 1. Fiddler 抓包简介 1). 字段说明 2). Stat ...

  9. 手把手教你入侵网站修改数据_手把手教你使用Python抓取QQ音乐数据(第四弹)...

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

最新文章

  1. Office 365和SFB更新
  2. WPF MVVM模式下的无阻塞刷新
  3. 配置Xmanager连接linux
  4. [转载] - QWidget、QMainWindow、QDialog和QFrame的区别
  5. Python入门100题 | 第055题
  6. python PyQt5 QPixmap()控件
  7. JDK1.8使用Dubbo时需注意
  8. NSLog的常用格式说明小释
  9. 合并数据 - 方法总结(concat、append、merge、join、combine_first)- Python代码
  10. git head指向老版本_Git最全总结
  11. Spark学习-SparkSQL--04-SparkSQL CLI 单节点运行与yarn集群运行
  12. C++编程基础一 27-二维数组
  13. 16.Nginx 服务器的 gzip 压缩
  14. 易进难出,“Vim 退出” 难住百万程序员
  15. SAP PS 第19节 里程碑开票
  16. MATLAB虚数矩阵不可随意转置
  17. Android FDE 加密过程
  18. c语言怎么让行末没有空格,新人提问:如何将输出时每行最后一个空格删除
  19. 2022起重机械指挥考试题库模拟考试平台操作
  20. Glassfish JAVA容器中间件使用(咋个办呢 zgbn)

热门文章

  1. QT学习之视图框架下的简单的碰撞检测
  2. 腾讯游戏数据资产管理实践之路
  3. NED下姿态转换到ENU下
  4. python使用fpdf生成pdf文件并添加页眉和页脚
  5. Qt实现钢笔、毛笔的笔锋效果
  6. 室内导航应用程序,基于自研引擎开发3D地图+导航应用-采用蓝牙定位方案
  7. elementary OS 发布代号由 Isis 改为 Freya
  8. Docker中安装Centos
  9. 统计一个字符串中数字的个数
  10. 楚留香服务器维护3月8,【3月8日】楚留香坐观万象打坐位置一览_打坐修炼地点介绍...