之前在網上找到一款下載某慕課網站的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不久,語法結構不是很標准,嚴謹,希望大家諒解。如有問題可以相互交流。
謝謝閱讀