如何让android 获得当前时间获得网页上的数据

一直对手机怎么访问网页很好奇,比如网页上填的姓名密码之类的,在手机上怎么填上去,怎么把网页的内容解析完放在手机上。这次就手机访问教务系统举个简单的例子,相信看完你就懂啦,以后就可以随心所欲的解析网页啦。
君欲善其事,必先利其器。首先要准备两个工具:1.(网页数据分析工具,利用它抓取网页内容),2.一个Jar包:(解析网页内容)。有了这两个东西剩下的事就好办啦。
我是大连海事大学的学生就用海事大学的教务系统为例,实现一个简单的课程表App。
& & & & & & & & & & & & &&& & & & &
& 把课程信息读取出来啦,当然啦界面很low,我也没优化。。。下面开始一步步实现。
&一、用HttpWatch分析网页数据:
& & & & & &
(这部分高手直接略过,这是给新手看的,步骤也很简单)这是输入账号密码的网页,下边就是HttpWatch,可以看到有个红的Record(记录)这时先不点,等输入完账号密码再点它。如下图:
& & & & & & & & & & & & &&
Record点击后变灰,这时点击登录,进入教务系统。
进入后的界面:
& & & & & & & & &&
加载完界面后,点击stop,这时可以看到有好多post,get请求,URL等等。在URL这一列就是我们访问的网址,在代码中会用到。而我们需要第一个post请求,选中它,可以看到下方就会出来它的的详细内容:
& & & & & & & & &
有Headers头信息,Cookie, POST Data等等,这些后边都会用到。我们挨个点开看看,先是Headers头信息:
& & & & & & & & & & &
& 可以看到这里边有好多信息,用的到就是Cookie,Cookie就相当于你浏览网页的身份证,也就是说你在接下来的网页操作中,Cookie可以证明操作对象是你而不是别人。其余的参数,如果你感兴趣的话可以深究,而我们现在用不到。 &再看POSTData:
& & & & & & & & & & &
&可以看到这里就是刚才填的账号密码的信息,密码被我涂红啦(这个是不能给看的,嘿嘿)。 &最后看下Cookie,这个在程序中会用到:
& & & & & & & & & &&
还有个挺重要的Content:
& & & & & & & & & &&
& 这里原来就是是请求网页的内容。。可以看到我这个网页有两个框架(frame),分上下,上边的是48像素,剩下的就被下边的网页占啦,当然啦,每个学校的不一样。
到这里,你就应该对怎么用手机访问网页有个大致的了解啦,填写的账号密码是Post到指定的URL,就会打开下一个网页。下面就实现第一步,进入教务系统,我是先用java实验的,因为用java上实现简单,直接用android还得真机调试,有点麻烦,但是原理是一样的,取的数据是一样的,明白之后只需把代码移植到android项目中就行,下边上代码:
& 二、用Java进入教务系统:
只上关键代码,代码上多了也没用。
//post的网址
private static String PATH = "http://202.118.88.140/loginAction.do";static List&String& &//保存获取的cookie &
  这是账号密码,就是post请求体的内容。
1 Map&String, String& params = new HashMap&String, String&();
params.put("mm", "*****");
params.put("zjh", "");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(3000);
connection.setDoInput(true);//表示从服务器获取数据
connection.setDoOutput(true);//表示向服务器写数据
connection.setRequestMethod("POST");//post请求方式
//连接成功int responseCode = connection.getResponseCode();
if(responseCode == HttpURLConnection.HTTP_OK){
// 获取返回的cookie
cookies = connection.getHeaderFields().get("Set-Cookie");
System.out.println("cookie:"+cookies);
return changeInputeStream(connection.getInputStream(),encode);//把输入流转换成String
//返回的内容,就是网页的源代码
cookie:[JSESSIONID=bedUsety1XWvS6EpLTg-u; path=/]
&title&学分制综合教务&/title&
&meta http-equiv="Content-Type" content="text/ charset=gb2312"&
&frameset rows="48,*" frameborder="NO" border="0" framespacing="0"&
&frame src="/menu/top.jsp" name="topFrame" scrolling="NO" noresize frameborder="NO" border="0" framespacing="0"&
&frame src="/menu/mainFrame.jsp" name="bottomFrame" scrolling="Auto" frameborder="NO" border="0" framespacing="0"&
&/frameset&
&noframes&&body&
&/body&&/noframes&
  到这里第一步就成功啦,在这一步很关键的要把cookie保存下来,要不然后边访问不了。下边进行第二步,进入选课的网页,查看课程表。
& 三、获取课程表信息
点击选课管理,点击学期课表,当然啦,每个学校的网站不一样,点击完可以看到HttpWatch上出现了好多内容,就是打开一个新的网页,就得发送一次请求,可以看到选课,学期课表,正好和我点的一样。接下来的步骤就和上边是一样的啦,会的可以直接跳过。
选中第一个get请求,就会在下边看到它的详细内容:
可以看到Content中显示本学期课表,get后边的url就是请求的网址。访问它就可以获得网页的内容,在把课表解析出来。
public static String sendGetXueQiKeBiao(String encode){//encode就是网页编码,在网页上可以看到。
InputStream inputStream =
String URL_PATH="http://202.118.88.140/xskbAction.do?actionType=1";//这就是那个url
URL url = new URL(URL_PATH);
if(url != null){
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
//超时时间
httpURLConnection.setConnectTimeout(3000);
//表示设置本次http请求使用GET方式
httpURLConnection.setRequestMethod("GET");
for(String cookie: cookies){
httpURLConnection.addRequestProperty("Cookie", cookie.split(";",2)[0]);//把cookie添加到请求属性。
int responsecode = httpURLConnection.getResponseCode();
if(responsecode == HttpURLConnection.HTTP_OK){
inputStream = httpURLConnection.getInputStream();
return changeInputeStream(inputStream,encode);//把输入流转换成String
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
  代码很简单,就一个get请求,返回的照样是网页内容:这里我只粘贴了很小的一部分,因为返回的实在是有点多,你可以自己打开个网页,然后查看源码,相信你肯定会头晕眼花的............
&th width="5%" class="sortable"&课程号&/th&
&th width="15%" class="sortable"&课程名&/th&
&th width="4%" class="sortable"&课序号&/th&
&th width="4%" class="sortable"&学分&/th&
&th width="6%" class="sortable"&课程属性&/th&
&th width="6%" class="sortable"&考试类型&/th&
&th width="8%" class="sortable"&教师&/th&
&th width="6%" class="sortable"&修读方式&/th&
&th width="6%" class="sortable"&选课状态&/th&
&th width="8%" class="sortable"&周次&/th&
&th width="5%" class="sortable"&星期&/th&
&th width="5%" class="sortable"&节次&/th&
&th width="6%" class="sortable"&教学楼&/th&
&th width="8%" class="sortable"&教室&/th&
&/tr&//这是一个课的信息
&tr class="odd" onMouseOut="this.className='even';" onMouseOver="this.className='evenfocus';"&
&td align="center" rowspan="2"&&/td&
&td align="center" rowspan="2"&英语(二外)&/td&
&td align="center" rowspan="2"&02&/td&
&td align="center" rowspan="2"&4.0&/td&
&td align="center" rowspan="2"&限选&/td&
  到这里课表的信息你就得到啦,很简单有木有,那么把它解析出来,你就成功啦。解析网页就用前边说的Jsoup,我前边有一篇博文就是讲怎么解析网页的:
上代码:这里边我是根据我这个的网页解析的,解析网页只解析自己需要的还是很简单的可以根据标签的属性解析,想要完全搞懂用Jsoup解析网页还是很难的。
String nbsp = Jsoup.parse("&").text().toString();//解析&也就是网页中的空格,出现乱码,这里先保存一下。
Document doc =
InputStream in = new ByteArrayInputStream(html.getBytes("gb2312"));
doc = Jsoup.parse(in, "gb2312", "http://202.118.88.140/xskbAction.do?actionType=1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Elements tables = doc.select("table[class=displayTag]");
Elements trs = tables.select("tr");
Elements tds = trs.select("td[rowspan=2]" );//td[rowspan=2]
for(org.jsoup.nodes.Element table : tables){
String text = table.text();
//System.out.println("tabletext:"+text);
System.out.println(".............................");
int line_shu = 0;
for(org.jsoup.nodes.Element tr : trs){
//行,表格中的一行
line_shu++;
if(line_shu &=3){ //跳过前两行
Elements tdss = tr.select("td");
System.out.println("tdssSize:"+tdss.size());
for(org.jsoup.nodes.Element td : tdss){
//表格中的一个格子
String text1 = td.text();
//String text2 = text.replaceAll(nbsp, " ");
String text2 = text1.replace(nbsp, " ");
System.out.println("tdtext:"+text2);
System.out.println("..............");
  这是解析完的内容:
trtext:1-2节 08:00-09:35 信息系统分析与设计_03 谢益武 ?3-19周 百川楼302(多媒体) ? 英语(二外)_02 时永文 ?1-18周 励志楼304(多媒体) ? 信息系统分析与设计_03 谢益武 ?3-19单周 百川楼302(多媒体) 嵌入式系统软件设计_01 陈军亮 ?2-18双周 励志楼301(多媒体) ? ? 计算机组织与结构_02 李辉 ?1-18周 四海楼303(多媒体) ? ? ?
tdssSize:8
tdtext:1-2节 08:00-09:35
..............
tdtext:信息系统分析与设计_03 谢益武
3-19周 百川楼302(多媒体)
..............
tdtext:英语(二外)_02 时永文
1-18周 励志楼304(多媒体)
..............
tdtext:信息系统分析与设计_03 谢益武
3-19单周 百川楼302(多媒体) 嵌入式系统软件设计_01 陈军亮
2-18双周 励志楼301(多媒体)
..............
  到这里课程信息你就获得啦,这时候就可以建个android项目,把这些代码粘过去,在自己建个界面,把数据和界面适配一下,你的课程表app就诞生啦。当然啦在android上可以用HttpCient,HttpPost代替HttpURLConnection会更好,我就代替啦。
如果有需要android源码的,可以告诉我,写到现在不少啦,还有作业呢。。。。。
& 转发请注明出处:&
&下载源码地址:
& &java方式:
& 下载源码请注意:这个源码只适合我的学校,因为每个人的教务系统不一样的,只能用来参考。。 &&
阅读(...) 评论()&nbsp&#8250&nbsp&nbsp&#8250&nbsp
谈谈android客户端和网站数据交互的实现
android客户端一般不直接访问网站数据库,而是像浏览器一样发送get或者post请求,然后网站返回客户端能理解的数据格式,客户端解析这些数据,显示在界面上,常用的数据格式是xml和json。可以理解客户端其实是一个你自己定义标记语言的浏览器,一般浏览器能解析的是html+css的数据,而android客户端能解析的是xml和json(或者都不是而是你自己定义的火星格式),服务端为了能满足客户端输出这种数据格式的需求,不得不专门针对客户端开发不同于浏览器访问的接口。所以要开发一个网站的客户端你需要:1.在客户端模拟get和post请求,请求最终还是通过http协议以url的形式发送2.在客户单解析服务器返回的数据3.在服务端根据请求生成相应的json数据(强烈建议使用json而不是xml,相同字符的json能返回更多的有用数据而且解析方便速度快)这里要讨论的是1、2两点.一、发送get或者post请求虽然java本身的HttpURLConnection类完全可以实现get和post,但是非常麻烦,我们还是使用HttpClient这个开源代码来实现。先讲讲get方法的实现:不管是get方法还是post方法,都需要httpclient来执行,通过HttpClient httpClient = newHttpClient()可以获得一个httpClient对象,httpClient对象可以给联网操作设定一些预定值,比如超时时间、字符集等。下面的函数在获得httpclient对象的同时设置预定值,同时返回这个httpclient,你可以在后面的代码中直接调用这个函数来获得设置好的httpclient对象:private static HttpClient getHttpClient() {
HttpClient httpClient = new HttpClient();
// 设置 HttpClient 接收 Cookie,用与浏览器一样的策略
//httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
// 设置 默认的超时重试处理策略
httpClient.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
// 设置 连接超时时间
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(TIMEOUT_CONNECTION);
// 设置 读数据超时时间
httpClient.getHttpConnectionManager().getParams().setSoTimeout(TIMEOUT_SOCKET);
// 设置 字符集
httpClient.getParams().setContentCharset(UTF_8);
return httpC
}httpclient对象可以执行get方法(GetMethod),GetMethod对象代表这个请求是通过get发出的,它的构造方法中包含请求地址url参数,下面是我写的一个能获得GetMethod对象的方法:private static GetMethod getHttpGet(String url,String cookie, String userAgent) {
GetMethod httpGet = new GetMethod(url);
// 设置 请求超时时间
httpGet.getParams().setSoTimeout(TIMEOUT_SOCKET);
httpGet.setRequestHeader("Host", "");
httpGet.setRequestHeader("Connection","Keep-Alive");
httpGet.setRequestHeader("Cookie", cookie);
httpGet.setRequestHeader("User-Agent", userAgent);
return httpG
}其中GetMethod httpGet = new GetMethod(url);是必须的,下面的httpGet.setRequestHeader("Host", "");
httpGet.setRequestHeader("Connection","Keep-Alive");
httpGet.setRequestHeader("Cookie", cookie);
httpGet.setRequestHeader("User-Agent", userAgent);可以暂时不理会。然后Httpclient对象调用executeMethod()方法,并且将包含了url的GetMethod对象作为executeMethod()方法的参数,executeMethod其实就是发送了一个get请求;int statusCode = httpClient.executeMethod(httpGet);根据executeMethod()方法的返回码statusCode判断请求是否成功,如果成功则读取返回的数据。BufferedReader reader = new BufferedReader(new InputStreamReader(httpGet.getResponseBodyAsStream()));
StringBuffer stringBuffer = new StringBuffer();
String str = "";
while((str = reader.readLine())!=null){
stringBuffer.append(str);
responseBody = stringBuffer.toString();responseBody中保存的就是get请求所返回的数据。结合上面getHttpClient()方法和getHttpGet()方法,写一个完整的http get请求实现方法:public static String http_get(String url) throws AppException {
HttpClient httpClient =
GetMethod httpGet =
String responseBody = "";
int time = 0;
httpClient = getHttpClient();
httpGet = getHttpGet(url);
int statusCode = httpClient.executeMethod(httpGet);
Log.i("http","url="+url);
if (statusCode != HttpStatus.SC_OK) {
throw AppException.http(statusCode);
else if(statusCode == HttpStatus.SC_OK){
BufferedReader reader = new BufferedReader(new InputStreamReader(httpGet.getResponseBodyAsStream()));
StringBuffer stringBuffer = new StringBuffer();
String str = "";
while((str = reader.readLine())!=null){
stringBuffer.append(str);
responseBody = stringBuffer.toString();
//System.out.println("XMLDATA=====&"+responseBody);
} catch (HttpException e) {
if(time & RETRY_TIME) {
Thread.sleep(1000);
} catch (InterruptedException e1) {}
e.printStackTrace();
throw AppException.http(e);
} catch (IOException e) {
if(time & RETRY_TIME) {
Thread.sleep(1000);
} catch (InterruptedException e1) {}
// 发生网络异常
e.printStackTrace();
throw AppException.http(e);
} finally {
// 释放连接
httpGet.releaseConnection();
httpClient =
}while(time & RETRY_TIME);
return responseB
}其中AppException是我自定义的一个异常累,可以不用理会。回到安卓开发中,假如客户端需要通过get请求访问一个url地址,则可以直接调用上面的 http_get(String url) 就可以得到服务器返回的数据了,你可以直接访问,或者其他任意一网址,都能得到返回数据,不过这些数据是html的。客户端解析返回的数据通过上述方法去请求一个普通网址得到的是一般的html,html包含了很多与数据本身无关的东西,比如决定布局的&div&等标签,因此我们在android客户端开发中一般都是去请求能返回xml或者json数据的url,将这些json数据解析出来,得到我们要的数据,这里以一个第三方物流查询网站返回的json数据格式为例,讲解如何用java解析。通过抓包我获得了某第三方物流查询网站的查询接口网址(声明,我仅仅是用于讲解未经过别人允许用作商业用途是不道德的):/query通过这个网址查询一个快递需要至少传入两个参数type:快递类型(EMS,圆通等),postid(快递编号)这里涉及到将请求参数组合为一个完整请求地址的过程,因为客户端请求的生成都是动态的,比如博客的客户端,每篇文章的id不一样,url是变动的,往往需要将级别较大的url在代码运行的时候动态组合请求参数之后才能用,网上已经有了一个现成的方法:private static String _MakeURL(String p_url, Map&String, Object& params) {
StringBuilder url = new StringBuilder(p_url);
if(url.indexOf("?")&0)
url.append('?');
for(String name : params.keySet()){
url.append('&');
url.append(name);
url.append('=');
url.append(String.valueOf(params.get(name)));
//不做URLEncoder处理
//url.append(URLEncoder.encode(String.valueOf(params.get(name)), UTF_8));
return url.toString().replace("?&", "?");
}使用这个方法将物流请求的完整url组合的代码如下 & & & &url = _MakeURL(&/query&, new HashMap&String, Object&(){{ & & & & & &put(&type&, &ems&); & & & & & &put(&postid&, &2&); & & & &}});url最后等效于你可以将上面的url输入浏览器,就可以看到返回的json数据了。运用java解析json:其实别想太复杂,都是调用库函数实现的,具体解析请看下面的例子(包含了请求和解析,当中的某些方法用到了上面的代码,比如http_get方法和 _MakeUR) private void getData(){
Handler handler = new Handler(){
public void handleMessage(Message msg) {
if(msg.what == 1){
JSONArray array = new JSONArray( (String)msg.obj );
for(int i=0; i&array.length(); i++){
JSONObject obj = array.getJSONObject(i);
PostItem item =new PostItem(obj.getString("context") , obj.getString("time"));
mListDatas.add(item);
orderList(mListDatas);
mAdapter.notifyDataSetChanged();
mLayer.setVisibility(View.GONE);
}catch (Exception e){
e.printStackTrace();
}else if(msg.what == 0){
}else if(msg.what == -1 && msg.obj != null){
new Thread(){
public void run() {
Message msg = new Message();
String result =
result = getPostInfo();
} catch (AppException e) {
e.printStackTrace();
msg.what = -1;
S //查询结果代码
S //反馈消息
S //反馈消息
JSONObject jsonO
jsonObj = new JSONObject(result);
resultcode
= jsonObj.getString("state");
message = jsonObj.getString("message");
if(Integer.parseInt(resultcode) == 3 || message.equals("ok")){
msg.what = 1;
datas = jsonObj.getString("data");
msg.what = 0;
}catch (Exception e){
e.printStackTrace();
handler.sendMessage(msg);
}.start();
}其中,getPostInfo()代码如下:public static String getPostInfo()
String url=AppContext.POST_URL;
url = _MakeURL(url, new HashMap&String, Object&(){{
put("type", "ems");
put("postid", "2");
return http_get(url);
}catch(Exception e){
e.printStackTrace();
return "erro";
}是不是很简单,这里用到了handle来处理网络数据。我们将解析到的结果都保存在了一个list中。如何使用post就不需要讲了吧。
上一篇: 我们要实现的是如下的效果, 1.该view在设置属性之后时候会有数字和圆圈不断增长的效果 2.该view在按下和放开状态下显示不同的样式。 这种效果逻辑上并不复杂,底层灰色圆圈和蓝色扇形圆圈都是用canvas.drawArc()绘制出来的,中间的数字用drawtext绘制,数字
下一篇: 新版本的zaker更换了全新的UI,让我一亮的是他第一次启动时引导界面的效果: 画面中,手机中的图像会随着外面红色部分手指的滑动而跟着滑动,而且当外面翻过一页时,手机中的画面也刚好翻过一页,而且如果你的手指只是在手机内部滑动,外面也会跟着滑动,总}

我要回帖

更多关于 android 获得当前时间 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信