之前在网上找到一款下载某慕课网站的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不久,语法结构不是很标准,严谨,希望大家谅解。如有问题可以相互交流。
谢谢阅读