前言
最近在做项目中要使用到快递的物流信息展示,当时是使用的第三方的接口快递鸟,但是昨天发现,现在快递鸟查询天天快递的物流信息是查询不到的。同时客户的商品物流运输就是使用天天快递,这就尴尬了。同时我发现快递网这个网站是可以动态查询物流信息http://m.kuaidi.com/index.html。
请求方式
使用快递网请求物流信息的方式是http://m.kuaidi.com/all/快递名称/订单号.html,我们在项目中只要把我们的参数拼接进行去请求这个地址就可以得到物流信息,但是显示的是一个页面。
获取数据
但是我们关心的也就是物流信息,也就是页面显示的数据,我们并不关心其他的无用的信息,当时我直接的想法是通过curl获取当前页面的信息。
但是打印出来的内容显示的确实“正在查询中”
到这里相信就会明白,当前网站是通过获取传递的参数又再次请求服务器才拿到真正的物流信息,通过开发者工具获取当前网页的请求,发现确实是这样的,当前网页会再次请求一个地址,而返回的就是真实的物流信息。
它在请求的地址是http://m.kuaidi.com/mindex-ajaxselectcourierinfo-886241079004-tiantian.html,而得到的数据是
可以看到这就是我们真正想要的信息,所以我们curl请求的真正地址的http://m.kuaidi.com/mindex-ajaxselectcourierinfo-订单号-快递名称.html,在我们写curl的时候要模拟我们请求是从浏览器发出的,不然它返回的数据是不对的。也就是在curl中添加
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
关于在PHP中使用curl发送请求,可以看curl详解我们得到的数据从上面可以看到是json数据,我们进行json转数组,转换后的数据如图
转换后的数据都是一个个对象,我们可以进行二次转换。
这次转换也就是对象转换成数组。转换后的数据如图所示
可以看到数据成功的转换成数据。也就是我们想要的数据。
源代码
源代码也就是把上面的所有操作封装起来,而使用时,只要调用方法传递两个参数(订单号,快递名称),返回的数据就是处理过的数据。
<?php
namespace Wxapi\Controller;
use Think\Controller;
class KuaidiController extends Controller{
/**
* @param $kd_number 快递名称
* @param $order_sn 订单号
* @return array
* 使用快递网获取物流信息
*/
public function getData($kd_number,$order_sn){
$pageURL="http://m.kuaidi.com/mindex-ajaxselectcourierinfo-{$order_sn}-{$kd_number}.html";
$contents=$this -> _url($pageURL);
$data = json_decode($contents);
$data = $this -> objectToArray($data);
return $data;
}
/**
* @param $url 请求的url
* @return mixed
*/
function _url($url){
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, "$url");
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$contents = curl_exec($ch);
curl_close($ch);
return $contents;
}
//转换成数组
function objectToArray($e){
$e=(array)$e;
foreach($e as $k=>$v){
if( gettype($v)=='resource' ) return;
if( gettype($v)=='object' || gettype($v)=='array' )
$e[$k]=(array)$this -> objectToArray($v);
}
return $e;
}
}
关于快递公司的名称,不是快递公司的编号。快递公司的编号可以下载文档自行查找。快递网编号
总结
这种方法等于说就是爬网页的数据,获取有利于我们的数据,现在有很多网站都提供了接口帮助我们获取物流信息,我们可以通过申请接口来对接到我们的项目中,并且大多数接口都是免费的。