基於網頁api(接口)實現查快遞


  之前在網上找到一款下載某慕課網站的java版軟件,我想知道他是怎么實現:對於視頻的下載的,畢竟網頁源碼中大都不會直接放視頻的地址,但是沒有公布源碼,我就反編譯,等到了部分“源碼”,邏輯上還是有些問題,所以還要自己修改一下。最終代碼還是能和原程序一樣跑,但是部分代碼無法理解,他是怎么實現的,或者說他是怎么得到的。

jsonDoc=Jsoup.connect("http://www.imooc.com/course/ajaxmediainfo/?mid=" + videoNo + "&mode=flash").timeout(10000).get();

代碼展現的不多,重要的不是代碼,重要的是我怎么解決了這個問題。周五忙碌了一下午,看網頁源碼,找getpost請求,都沒看到相關的網址,直到周五晚上,跟老師反映了問題,得到了解答。終於是理解了,但疑惑還是沒解決,原程序作者是怎么得到這個接口(網頁api)的。

 

  疑惑雖然沒有解決,但我還是對這接口感興趣,所以今天打算寫一個關於查快遞的程序。(ps:這樣的功能網頁、app上有的是,遭室友吐槽。)寫這個程序的目的是感受一下接口是怎么樣的,相比較直接重網頁中爬取自己想要的信息有什么區別。

 

直入正題:

1、百度搜索免費的網頁api,找到的不多,所以挑選了一個感覺相對有用的查快遞的接口。

這是網址:http://www.bejson.com/knownjson/webInterface/

2、代碼實現

需要json,jsoup第三方庫的支持。下載地址:鏈接:http://pan.baidu.com/s/1slayVzZ 密碼:pppe ,過期不補,網上有。

我認為這程序實現的關鍵在於對json的解析,之前學習爬蟲涉及到一些。

對於接口返回的數據可以用正則表達式解決,但是我感覺用json更fashion一點。

首先jsoup建立鏈接得到返回值

 Document jsondoc;
jsondoc= Jsoup.connect("http://www.kuaidi100.com/query?type="+CompanyNumber+"&postid="+OrderNumber).timeout(10000).get();
String jsonData=jsondoc.text();

然后對返回數據的解析,json的數據結構由對象,數組,對象數組混合這么幾種。可以通過http://www.bejson.com/整理數據,方便觀察數據結構。

JSONObject jsonObject=new JSONObject(jsonData);
JSONArray data=jsonObject.getJSONArray("data");

System.out.println("查詢結果:"+jsonObject.getString("message"));
if (jsonObject.getString("message").equals("ok")){
    System.out.println("快遞公司:"+jsonObject.getString("com"));
    System.out.println("快遞單號:"+jsonObject.getString("nu"));

     //具體信息
    for (int i=data.length()-1;i>0;i--){
        JSONObject object=data.getJSONObject(i);
        System.out.print(object.getString("time"));
        System.out.println(" "+object.getString("context"));
    }
}    

 

最后,時間關系,不詳細講解,直接上全部代碼。

  1 package com;
  2 
  3 import org.json.JSONArray;
  4 import org.json.JSONObject;
  5 import org.jsoup.Jsoup;
  6 import org.jsoup.nodes.Document;
  7 import java.io.IOException;
  8 import java.util.Scanner;
  9 
 10 public class Main {
 11 
 12     public static void main(String[] args) {
 13 
 14         Document jsondoc;
 15         Scanner input=new Scanner(System.in);
 16         boolean yesNo;
 17         while (true) {
 18 
 19             yesNo=true;
 20             System.out.println("快遞公司編碼:申通=\"st\" EMS=\"ems\" 順豐=\"sf\" 圓通=\"yt\" 中通=\"zt\" 韻達=\"yd\" " +
 21                     "天天=\"tt\" 匯通=\"ht\" 全峰=\"qf\" 德邦=\"db\" 宅急送=\"zjs\"");
 22             System.out.println("請輸入快遞公司編號和快遞單號,中間用逗號或空格隔開,如(sf,123456789;sf,123456789;sf 123456789)");
 23             try {
 24                 String string=input.nextLine();
 25                 int num=string.indexOf(',');
 26                 if (num==-1){
 27                     num=string.indexOf(',');
 28                     if (num==-1){
 29                         num=string.indexOf(' ');
 30                     }
 31                 }
 32 
 33                 String  CompanyNumber=string.substring(0,num);
 34                 String OrderNumber=string.substring(num+1);
 35 
 36 
 37                 switch (CompanyNumber){
 38                     case "st":
 39                         CompanyNumber="shentong";
 40                         break;
 41                     case "ems":
 42                         break;
 43                     case "sf":
 44                         CompanyNumber="shunfeng";
 45                         break;
 46                     case "yt":
 47                         CompanyNumber="yuantong";
 48                         break;
 49                     case "zt":
 50                         CompanyNumber="zhongtong";
 51                         break;
 52                     case "yd":
 53                         CompanyNumber="yunda";
 54                         break;
 55                     case "tt":
 56                         CompanyNumber="tiantian";
 57                         break;
 58                     case "ht":
 59                         CompanyNumber="huitongkuaidi";
 60                         break;
 61                     case "qf":
 62                         CompanyNumber="quanfengkuaidi";
 63                         break;
 64                     case "db":
 65                         CompanyNumber="debangwuliu";
 66                         break;
 67                     case "zjs":
 68                         CompanyNumber="zhaijisong";
 69                         break;
 70                     default:
 71                         System.out.println("編號錯誤或暫不支持該快遞公司的查詢");
 72                         yesNo=false;
 73                         break;
 74                 }
 75 
 76                 if (yesNo){
 77 
 78                     jsondoc= Jsoup.connect("http://www.kuaidi100.com/query?type="+CompanyNumber+"&postid="+OrderNumber).timeout(10000).get();
 79                     String jsonData=jsondoc.text();
 80                     JSONObject jsonObject=new JSONObject(jsonData);
 81                     JSONArray data=jsonObject.getJSONArray("data");
 82 
 83                     System.out.println("查詢結果:"+jsonObject.getString("message"));
 84                     if (jsonObject.getString("message").equals("ok")){
 85                         System.out.println("快遞公司:"+jsonObject.getString("com"));
 86                         System.out.println("快遞單號:"+jsonObject.getString("nu"));
 87 
 88                         //具體信息
 89                         for (int i=data.length()-1;i>0;i--){
 90                             JSONObject object=data.getJSONObject(i);
 91                             System.out.print(object.getString("time"));
 92                             System.out.println(" "+object.getString("context"));
 93                         }
 94                     }
 95 
 96                 }
 97 
 98             } catch (IOException e) {
 99                 e.printStackTrace();
100             }
101 
102             System.out.print("按回車鍵繼續!");
103             input.nextLine();
104         }
105     }
106 }

運行結果展示:

 

本人剛接觸java不久,語法結構不是很標准,嚴謹,希望大家諒解。如有問題可以相互交流。

謝謝閱讀

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM