根据快递单号和快递公司编号获取物流信息(爬虫,免费)


使用快递100的服务,网址:http://www.kuaidi100.com/

其实快递100有专门提供快递物流信息查询的API,只不过要申请,如下:

TIM图片20171212142315

那现在我只需要,提供快递公司和快递单号得到物流信息这个功能。

正好发现,使用快递100的官网首页查询的话,没有其他多余的限制,所以就能够利用起来,做成免费且没有查询次数限制的接口了。


代码

利用其官网的首页查询接口,将信息拼成url,直接curl获取内容,其中发现还有一层限制就是UA的现在,所以在curl需要设置下UA。

<?php
/**
* 快递100查询类
*/
class express
{
        public $company = array('ems','shunfeng');

        public function query($company,$no){     $return_data = array();     if (in_array($company, $this->company)) { $url = "http://www.kuaidi100.com/query?type=$company&postid=$no&id=1.html";//快递100 $res = $this->curl($url); if($res){ $data = json_decode($res,true); if(empty($data)||!is_array($data)) return false; $return_data['state'] = $data['state']; $return_data['status'] = $data['status']; $return_data['message'] = $data['message']; $return_data['list'] = array(); if(!empty($data['data'])){//查询成功 foreach ($data['data'] as $k => $v) { $return_data['list'][$k]['time'] = $v['time']; $return_data['list'][$k]['context'] = $v['context']; } } $query_id = $company.'_'.$no; $query_info = '';//从缓存中取 根据query_id if($return_data['status'] == 200){ if(empty($query_info)){//插入 $query_info = serialize($return_data); //写入缓存 }else{ $query_info = serialize($return_data); //更新缓存 } }else{ if(!empty($query_info)){ $return_data = unserialize($query_info); } } return $return_data; }     }     return false;         } private function curl($url){     $curl = curl_init($url);     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);     $UserAgent = 'Mozilla/4.0 ....';//UA     curl_setopt($curl, CURLOPT_USERAGENT, $UserAgent);     $res = curl_exec($curl);     curl_close($curl);     return $res; } }

因为这个接口的不稳定性,所以我做了一个查询的缓存。其实可以做的更精细一点,比如收货了就不在继续查询了,直接从缓存中获取内容等等,这些自行考虑。

这里就是个简单的例子,如果要追求接口性能,接口稳定性,实时性等等的话,还是花钱买个企业版吧,over

php skill


上一篇:CakePHP3实现i18n(国际化)多语言例子

YPHP后台中RBAC实现整理(角色篇):下一篇