999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于HttpClient的Android客戶端的設(shè)計與實現(xiàn)

2014-04-29 06:12:42王超閭陳莉吳迪項英杰
計算機時代 2014年3期

王超 閭陳莉 吳迪 項英杰

摘 要: 移動設(shè)備的普及和移動互聯(lián)網(wǎng)的高速發(fā)展讓人們開始依賴通過移動設(shè)備獲取信息,但普通頁面在移動端的體驗很難滿足用戶的需求。為此研究了HttpClient和Jsoup等技術(shù),分析了一般網(wǎng)站的登錄原理,成功實現(xiàn)了對一般網(wǎng)站的模擬登錄和頁面信息的提取,在此基礎(chǔ)上實現(xiàn)的系統(tǒng)可以在目標網(wǎng)站中獲取用戶所需的信息,并將這些信息整合應(yīng)用到Android平臺,從而設(shè)計出用戶體驗更佳的網(wǎng)站Android客戶端。

關(guān)鍵詞: HttpClient; Jsoup; Android; 模擬登錄

中圖分類號:TP311 文獻標志碼:A 文章編號:1006-8228(2014)03-30-03

0 引言

客戶端(Client)或稱為用戶端,是指與服務(wù)器相對應(yīng),為客戶提供本地服務(wù)的程序。而Android系統(tǒng)上90%的客戶端軟件具有一個共性:為了改善網(wǎng)頁在Android系統(tǒng)上體驗不佳而生。這類軟件最突出的特點是:先有網(wǎng)站再有客戶端。由于網(wǎng)絡(luò)技術(shù)發(fā)展的多樣性,手機瀏覽器往往無法跟隨它的步伐,為改善用戶體驗,網(wǎng)站客戶端軟件應(yīng)運而生。

由于一般網(wǎng)站不提供服務(wù)端的開放平臺,我們無法調(diào)用所提供的API接口來開發(fā),所以需要對頁面信息進行處理分析。在對網(wǎng)頁信息進行處理分析時,不可能采用瀏覽器人工閱覽的方法,因此需要自己編寫分析處理程序,提取出有用的信息,為進一步分析做準備。由于原始HTML頁面的數(shù)據(jù)格式并不適合進行處理[1],本研究將結(jié)合HttpClient與Jsoup對HTML頁面進行抓取解析。

1 開發(fā)工具與環(huán)境的介紹

1.1 HttpClient

網(wǎng)頁抓取,就是把URL地址中指定的網(wǎng)絡(luò)資源從網(wǎng)絡(luò)流中讀取出來,保存到本地。類似于使用程序模擬IE瀏覽器的功能,把URL作為HTTP請求的內(nèi)容發(fā)送到服務(wù)器端,然后讀取服務(wù)器端的相應(yīng)資源[2]。雖然java.net包中已經(jīng)提供了訪問HTTP協(xié)議的基本功能,但是對于大部分應(yīng)用程序來說還不夠豐富和靈活。

HttpClient[3]是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的、支持HTTP協(xié)議的客戶端編程工具包,并且支持HTTP協(xié)議最新的版本和建議。HttpClient能夠處理HTTP連接中的各種問題,使用十分方便,只需導入HttpClient.jar包,就可以模擬IE瀏覽器來獲取網(wǎng)頁內(nèi)容。

1.2 Jsoup

Jsoup分析網(wǎng)頁結(jié)構(gòu)和內(nèi)容的功能遠遠強大于HtmlParser,無論是獲取整個頁面的文本,還是分析特定內(nèi)容的網(wǎng)頁結(jié)構(gòu),都十分方便。Jsoup數(shù)據(jù)獲取有兩大方法:①通過分析dom模型的網(wǎng)頁標簽和元素;②select元素選擇器,類似Jquery方式。

1.3 Android

Android是一種基于Linux的自由及開放源代碼的操作系統(tǒng),主要適用于移動設(shè)備,如智能手機和平板電腦,由Google公司和開放手機聯(lián)盟領(lǐng)導及開發(fā)。2011年第一季度,Android在全球的市場份額首次超過塞班系統(tǒng),躍居全球第一。2012年11月的數(shù)據(jù)顯示,Android占據(jù)全球智能手機操作系統(tǒng)市場76%的份額,中國市場占有率為90%。在2013年09月24日Android操作系統(tǒng)迎來5歲生日時,全球采用這款系統(tǒng)現(xiàn)有設(shè)備數(shù)量已經(jīng)達到10億臺。

2 網(wǎng)站客戶端開發(fā)的設(shè)計

2.1 獲取數(shù)據(jù)的原理

圖1是一個簡單的示意圖,告訴我們,數(shù)據(jù)是由網(wǎng)頁從數(shù)據(jù)庫中取出,要為這個系統(tǒng)做客戶端,就應(yīng)該按照該數(shù)據(jù)獲取的原理去改造它,如圖2所示。

[網(wǎng)頁] [數(shù)據(jù)]

圖1 網(wǎng)頁從數(shù)據(jù)庫中提取數(shù)據(jù)

[安卓客戶端][網(wǎng)頁] [數(shù)據(jù)]

圖2 客戶端間接訪問數(shù)據(jù)庫

通過這樣間接的方法來訪問數(shù)據(jù)庫,只要網(wǎng)頁能看到的內(nèi)容,我們的客戶端都能獲取到,而UI是由用戶自行制作,可以使用戶體驗上一個臺階。

2.2 HttpClient模擬登錄原理

現(xiàn)如今不論是網(wǎng)站還是論壇,又或是一般的信息管理系統(tǒng),登錄功能都是必不可少的。因此我們?nèi)粝胍L問所需要的網(wǎng)站并從中獲取數(shù)據(jù),登錄是無法跳過的一個環(huán)節(jié)[4]。

因為HTTP協(xié)議是無狀態(tài)的,也就是連接的有效期只限于當前請求,請求內(nèi)容結(jié)束后連接就關(guān)閉了。在這種情況下為了保存用戶的登錄信息必須使用Cookie機制[5]。以JSP/Servlet為例,當瀏覽器請求一個JSP或者是Servlet頁面時,應(yīng)用服務(wù)器會返回一個參數(shù),名為jsessionid(因不同應(yīng)用服務(wù)器而異),其值是一個較長的惟一字符串的Cookie,這個字符串也就是當前訪問該站點的會話標識。瀏覽器每在訪問該站點的其他頁面時都要帶上jsessionid這樣的Cookie信息,應(yīng)用服務(wù)器根據(jù)這個會話標識來獲取對應(yīng)的會話信息。

對于需要用戶登錄的網(wǎng)站,一般在用戶登錄成功后會將用戶資料保存在服務(wù)器的會話中,當訪問其他的頁面時,應(yīng)用服務(wù)器根據(jù)瀏覽器送上的Cookie讀取當前請求對應(yīng)的會話標識以獲得對應(yīng)的會話信息,然后就可以判斷用戶資料是否存在于會話信息中,如果存在則允許訪問頁面,否則跳轉(zhuǎn)到登錄頁面中要求用戶輸入帳號和口令進行登錄。這就是一般使用JSP開發(fā)的網(wǎng)站在處理用戶登錄時比較通用的方法。

對于HTTP的客戶端而言,如果要訪問一個受保護的頁面,就必須模擬瀏覽器所做的工作,首先是請求登錄頁面,讀取Cookie值;其次是請求登錄頁面并加入登錄頁所需的每個參數(shù);最后是請求最終所需的頁面。當然,除第一次請求之外,其他的請求都需要附帶上Cookie信息以便服務(wù)器能判斷當前請求是否已經(jīng)通過驗證。

在本研究中,通過HttpClient,可以方便地模擬出登錄的http請求,并獲取已經(jīng)通過驗證的Cookie,之后再通過該Cookie來進行所需頁面的http請求,最終獲取其數(shù)據(jù)。雖然HttpClient自身具有自動調(diào)去Cookie的機制,但仍建議能夠自行調(diào)用代碼傳送Cookie。

3 網(wǎng)站客戶端的實現(xiàn)

本次模擬登錄和頁面信息獲取是在Java項目中完成的,由于Java項目可以完美移植到Android項目中,方便被調(diào)試,而且模擬Http請求這一過程并沒有用到任何Android功能。運用HttpClient和 Jsoup技術(shù)的版本是HttpClient 3.x和Jsoup 1.6。

3.1 模擬登錄實現(xiàn)

/*對HttpClient 的初始化*/

private HttpClient client;

client=new HttpClient();

client.getParams().setHttpElementCharset("GBK");

client.getHostConfiguration().setHost(host_url, 80, "http");

/*設(shè)置PostMethod */

PostMethod post=new PostMethod(login_url);

post.addRequestHeader("Accept", "*/*");

post.addRequestHeader("Accept-Encoding", "gzip, deflate");

post.addRequestHeader("Host", host_url);

post.addRequestHeader("Connection", "Keep-Alive");

/*設(shè)置http request的body值*/

post.setRequestBody(new NameValuePair[]{

new NameValuePair("__VIEWSTATE",viewstate),

new NameValuePair("textBox1",xh),

new NameValuePair("textBox2",pwd),

new NameValuePair("Button1",""),

new NameValuePair("lbLanguage","")

});

/*獲取cookie*/

client.executeMethod(post);

Cookie cookies[]=client.getState().getCookies(); //得到cookies

for(int i=0; i

if(i==0) {

cookie=cookies[i].toString();

}

else {

cookie+=cookies[i]+";";

}

}

3.2 中文亂碼問題的解決

在實際開發(fā)中,以上代碼獲得的content可能會出現(xiàn)中文亂碼。在開發(fā)這類客戶端時,中文編碼往往是個很具難度的問題。由于中文網(wǎng)頁的編碼可能是UTF-8或GB2312格式的,如果沒有采用對應(yīng)的編碼格式進行解析,則會產(chǎn)生亂碼的問題。

據(jù)調(diào)查,80%以上的網(wǎng)頁都沒有設(shè)置response Header的charset,所以直接通過HttpClient獲取charset是不可靠的;但是99%的網(wǎng)頁設(shè)置了meta元素的charset,所以可以先根據(jù)一個默認編碼(ISO-8859-1)獲得HTML文檔,再根據(jù)Jsoup或正則表達式獲得該文檔的charset。

因此以上代碼中若有中文參數(shù),可將

new NameValuePair("value_name" ,”中文”);

修改為

new NameValuePair("value_name", new String(“中文”.getBytes(),

"ISO-8859-1"));

3.3 訪問所需頁面

//設(shè)置所需訪問的url

String mainUrl="/content.aspx;

//設(shè)置GetMethod

GetMethod get=new GetMethod(mainUrl);

//設(shè)置http Header,主重cookie信息

get.setRequestHeader("Accept-Language", "zh-CN");

get.setRequestHeader("Connection", "Keep-Alive");

get.setRequestHeader("Cache-Control", "no-cache");

get.setRequestHeader("Cookie", cookie);

//獲取所需頁面的html

client.executeMethod(get);

content=get.getResponseBodyAsString();

3.4 Android平臺的移植

這一模塊的實現(xiàn)需要運用到Jsoup技術(shù),解析已經(jīng)得到的html,從中獲取需要的數(shù)據(jù)。以下代碼是從上文的content中提取相關(guān)的通知標題,標題由標簽等包含。

//將剛才的html轉(zhuǎn)化成Document

Document document=Jsoup.parse(content);

//一個Document由elements組成

//選擇”tr”開頭的標簽,存入 trs元素群中

Elements trs=document.select("tr");

for(int i=0; i

//觀察HTML,從第i+2個tr開始,包含的才是我們要的信息

//從每個tr中選出td標簽元素群

Elements tds=trs.get(i+2).select("td");

//得到每個tr中td的個數(shù)

int totalTds=tds.size();

//一個臨時的HashMap,里面是String-Object鍵值對

Map map=new HashMap();

//j是一個標識數(shù)

for(int j=0; j

switch (j) {

//0表示第一個,即標題

//put方法即向map加入一條鍵值對

//html()方法就得到標簽括起來的內(nèi)容

case 0:

map.put("title", tds.get(j).html().toString());

break;

case 1:

//1表示第二個,即作者

map.put("author", tds.get(j).html().toString());

break;

default:

break;

}

}

list.add(map);

}

//list就是所需要的ArrayList

上面所有代碼調(diào)試通過后,只需一些簡單的復制、粘貼操作,就可以放在Android工程中,再加上一段簡單的代碼就可以讓ListView顯示這個ArrayList。

4 結(jié)束語

本文基于對HttpClint和Jsoup等技術(shù)的研究,成功實現(xiàn)了模擬登錄網(wǎng)站,并從所需頁面中提取有價值的信息,運用到Android設(shè)備中。通過本文所研究的方法,可以有效改善一般網(wǎng)站在移動設(shè)備上的體驗不佳現(xiàn)狀,從而提升其用戶體驗。雖然本文方法能夠有效地應(yīng)對目前大多數(shù)網(wǎng)站,但對于使用https協(xié)議的網(wǎng)站或者存在其他特殊驗證的站點,還有一定的局限性。因此今后的研究方向是提高對多種網(wǎng)頁結(jié)構(gòu)的適應(yīng)性,以及感知信息和網(wǎng)頁結(jié)構(gòu)的更新變化,同時減少其復雜性,提高其自動化和智能性。

參考文獻:

[1] 洪輝,劉子敏.智能Web信息提取系統(tǒng)的研究和設(shè)計[J].微計算機信

息,2005.21(11).

[2] 羅剛,王振東.自己動手寫網(wǎng)絡(luò)爬蟲[M].清華大學出版社,2010.

[3] http://hc.apache.org/httpclient-3.x

[4] 付聰.基于Smack庫與HttpClient登陸的實現(xiàn).中國科技論文在線,

2009.

[5] http://www.blogjava.net/Alpha/archive/2007/01/22/95216.html

主站蜘蛛池模板: 欧洲一区二区三区无码| 国产精品亚洲一区二区三区z| 国产成人亚洲精品色欲AV| 国产成人精品免费视频大全五级| 国产成在线观看免费视频| 97成人在线观看| 日本在线国产| 亚洲日本一本dvd高清| 99视频精品全国免费品| www.youjizz.com久久| 免费久久一级欧美特大黄| 国产美女在线观看| 91免费精品国偷自产在线在线| 国产无遮挡猛进猛出免费软件| 亚洲资源站av无码网址| 激情无码视频在线看| 色爽网免费视频| 新SSS无码手机在线观看| 国产成人AV大片大片在线播放 | 天堂久久久久久中文字幕| 亚洲精品中文字幕午夜| 永久免费av网站可以直接看的| 草逼视频国产| 五月激情综合网| 思思99热精品在线| 午夜精品区| 91伊人国产| 精品视频一区二区观看| 成人毛片免费观看| 思思热在线视频精品| 成人毛片免费观看| 中国一级毛片免费观看| 国产97视频在线| 色婷婷综合在线| 欧美福利在线| 中文字幕在线欧美| 国产屁屁影院| 国产白浆视频| 亚洲成人在线免费| 乱人伦视频中文字幕在线| 中文字幕亚洲乱码熟女1区2区| 欧美日韩国产在线人| 免费看黄片一区二区三区| 精品亚洲欧美中文字幕在线看| 91在线日韩在线播放| 国产精品30p| 青青青国产视频| 亚洲欧洲日本在线| 国产男女免费视频| 狠狠久久综合伊人不卡| 欧美一级夜夜爽| 亚洲综合精品香蕉久久网| 狠狠综合久久| 精品综合久久久久久97超人| 亚洲人成网站在线观看播放不卡| 青青青草国产| 国产丝袜91| 欧美色图第一页| 欧美综合区自拍亚洲综合绿色| 毛片一级在线| a毛片基地免费大全| 午夜精品国产自在| 欧美一级在线| 青青草原偷拍视频| 國產尤物AV尤物在線觀看| 亚洲青涩在线| 国产精品成人观看视频国产 | 天堂成人在线| 亚洲一级毛片在线播放| 无码有码中文字幕| 亚洲美女久久| 欧美精品aⅴ在线视频| 亚洲国产综合精品一区| 免费不卡视频| 国产欧美日韩在线在线不卡视频| 伊人网址在线| 日本不卡视频在线| 91娇喘视频| 久草视频中文| 国产精品无码翘臀在线看纯欲| 国产小视频a在线观看| 久久久久无码精品|