当前位置:   article > 正文

免费查询快递物流_php物流查询免费

php物流查询免费

转载请注明: 藏羚骸的博客~免费查询快递物流.

网上有很多快递查询接口,如快递100、快递鸟等等,但使用接口并不是免费的,如何爬取免费查询快递物流呢,本文仅仅提供爬虫爱好者一个爬虫思路,仅供交流学习请勿用于商业用途。

页面地址:https://www.baidu.com/baidu?isource=infinity&iname=baidu&itype=web&tn=02003390_43_hao_pg&ie=utf-8&wd=%E5%BF%AB%E9%80%92

那么如何解析这个地址呢,右键打开开发者模式,再次点击查询,会发现有新增加的请求地址。如下图:

我们点击该链接,打开预览可以预览响应信息。如下图:

那么这个就是输出给百度这个页面的信息,这个地址就是正确快递信息请求地址。

看标头该地址请求为get请求,如下图:

故复制该地址用postman打开,也可以用其他测试接口软件。如下图:

可以看见正确返回了快递信息。

筛选无用参数发现必填参数为tokenV2和nu,如下图:

地址为:https://express.baidu.com/express/api/express?tokenV2=ax0Pz-mHAJ6vC__gfwtLpcz8OyOz35jgTbRglj_deaYouL6bbtDSKyoXPbwpF4zP&nu=773159319988898

nu为快递单号,tokenV2是如何生成的我们需要找一下,因为到目前为止我们只打开了一个百度快递页面,那么我选择检查源码,看看是否有用的到的信息。

搜索tokenV2果然找到了有用信息,前面页面刷新了一下,所以tokenV2发生了改变,可以再次打开检查上下图是一样的。

所以整个获取快递信息的接口和必填参数已经知道了。首先在快递页面源码里面获取tokenV2,之后与 https://express.baidu.com/express/api/express?tokenV2=tokenV2&nu=单号 即可。下面我用一个简单php程序,复盘一下。

获取tokenV2

  1. public function getinfo(){
  2. $url = 'https://www.baidu.com/s?tn=02003390_43_hao_pg&ie=utf-8&wd=%E5%BF%AB%E9%80%92';
  3. $header = array (
  4. "Host:www.baidu.com",
  5. "Content-Type:application/x-www-form-urlencoded",//post请求
  6. "Connection: keep-alive",
  7. 'Referer:http://www.baidu.com',
  8. //关键作用User-Agent 可是每次爬取结果都是无法爬取到百度搜索的内容,要验证 user-agent没有模拟好,所以不行。
  9. 'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36'
  10. );
  11. $ch = curl_init ();
  12. curl_setopt ( $ch, CURLOPT_URL, $url );
  13. curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );
  14. curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
  15. $content = curl_exec ( $ch );
  16. if ($content == FALSE) {
  17. echo "error:" . curl_error ( $ch );
  18. }
  19. curl_close ( $ch );
  20. // return $content;
  21. $pattern = '/tokenV2=(.*?)"/i';
  22. preg_match($pattern, $content, $match);
  23. return $match[1];
  24. }

获取这个tokenV2,curl或者这个页面源码通过正则获取tokenV2,

如果不加tn参数,会有百度安全验证,这样无法获取会不稳定。

tn– 提交搜索请求的来源站点。一个有用的tn:tn=baidulocal 表示百度站内搜索,返回的结果是很干净的,没有任何广告。另外,从做百度联盟搜索的网站A 搜索过来的都有这个tn参数,当你点击搜索结果中带“推广”的网站B,做百度“推广”的网站B的户主账户中就会被扣掉一部分费用,其中一部分百度留着,另外一小部分给网站A的户主,因为你从网站A搜索过来的。百度搜索中url的参数解

拼接请求快递信息地址发送curl

  1. public function getexpresstest(){
  2. echo("<pre>");
  3. $nu='773159319988898';
  4. $tokenV2=$this->getinfo();
  5. $url='https://express.baidu.com/express/api/express?tokenV2='.$tokenV2.'&nu='.$nu;
  6. var_dump($url);
  7. $header = array (
  8. "Host:express.baidu.com",
  9. "Content-Type:application/x-www-form-urlencoded",//post请求
  10. "Connection: keep-alive",
  11. 'Referer:http://www.baidu.com',
  12. //关键作用User-Agent 可是每次爬取结果都是无法爬取到百度搜索的内容,要验证 user-agent没有模拟好,所以不行。
  13. 'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36',
  14. );
  15. $ch = curl_init ();
  16. curl_setopt ( $ch, CURLOPT_URL, $url );
  17. curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );
  18. curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
  19. $content = curl_exec ( $ch );
  20. if ($content == FALSE) {
  21. echo "error:" . curl_error ( $ch );
  22. }
  23. curl_close ( $ch );
  24. var_dump(json_decode($content));
  25. }

返回结果为

这个请求地址在浏览器直接输出明明是正确的,自己请求却返回失败,大可能性是cookie没有或者将请求的参数都加上看看那个是决定性的东西,发现添加cookie后,结果成功了

所以在 https://express.baidu.com/express/api/express?tokenV2=tokenV2&nu=单号 基础上cur还需要加上cookie;

获取tokenV2和cookie

  1. public function getinfo(){
  2. $url = 'https://www.baidu.com/baidu?isource=infinity&iname=baidu&itype=web&tn=02003390_43_hao_pg&ie=utf-8&wd=%E5%BF%AB%E9%80%92';
  3. $header = array (
  4. "Host:www.baidu.com",
  5. "Content-Type:application/x-www-form-urlencoded",//post请求
  6. "Connection: keep-alive",
  7. 'Referer:http://www.baidu.com',
  8. //关键作用User-Agent 可是每次爬取结果都是无法爬取到百度搜索的内容,要验证 user-agent没有模拟好,所以不行。
  9. 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
  10. );
  11. $ch = curl_init ();
  12. curl_setopt ( $ch, CURLOPT_URL, $url );
  13. curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );
  14. curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
  15. curl_setopt ( $ch, CURLOPT_HEADER, 1 );
  16. $content = curl_exec ( $ch );
  17. if ($content == FALSE) {
  18. echo "error:" . curl_error ( $ch );
  19. }
  20. curl_close ( $ch );
  21. //获取tokenV2
  22. preg_match('/tokenV2=(.*?)"/i', $content, $match);
  23. //获取cookie
  24. preg_match_all('/^Set-Cookie:s*([^;]*)/mi', $content, $matches);
  25. $cookies=implode(';',$matches[1]);
  26. return ['tokenV2'=>$match[1],'cookie'=>$cookies];
  27. }

重新拼接请求快递信息地址发送curl

  1. public function getexpresstest(){
  2. echo("<pre>");
  3. $nu='773159319988898';
  4. $info=$this->getinfo();
  5. var_dump($info);
  6. $url='https://express.baidu.com/express/api/express?tokenV2='.$info['tokenV2'].'&nu='.$nu;
  7. $header = array (
  8. "Host:express.baidu.com",
  9. "Content-Type:application/x-www-form-urlencoded",//post请求
  10. "Connection: keep-alive",
  11. 'Referer:http://www.baidu.com',
  12. //关键作用User-Agent 可是每次爬取结果都是无法爬取到百度搜索的内容,要验证 user-agent没有模拟好,所以不行。
  13. 'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36',
  14. 'Cookie:'.$info['cookie']
  15. );
  16. $ch = curl_init ();
  17. curl_setopt ( $ch, CURLOPT_URL, $url );
  18. curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );
  19. curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
  20. $content = curl_exec ( $ch );
  21. if ($content == FALSE) {
  22. echo "error:" . curl_error ( $ch );
  23. }
  24. curl_close ( $ch );
  25. var_dump(json_decode($content));
  26. }

返回正确数据如下图:

转载请注明: 藏羚骸的博客~免费查询快递物流

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/271215
推荐阅读
相关标签
  

闽ICP备14008679号