1、首先你要知道什麼是抓包
抓包就是將網絡傳輸發送與接收的數據包進行截獲、重發、編輯、轉存等操做,也用來檢查網絡安全,但每每被某些無恥之徒用來網遊做弊。
這是我大三上學期經過抓包作的小型教務系統--La吧(喇叭),能夠查成績,查全部班級的課表,公告欄,機構通知,圖書館查詢書籍,查詢借書狀況、意見反饋等等的功能。後臺數據經過Bmob移動後端雲服務進行數據存儲。
下面就讓我經過我作的小項目進行闡述如何抓包吧。html
2、你所須要的工具
抓取數據的分析工具備不少,不一樣瀏覽器也自帶不少開發人員工具,若是你的是IE內核的瀏覽器的話,好比360安全瀏覽器,你能夠安裝一個HttpWatch,相對web開發的人員來講對這個工具很熟悉,HttpWatch是一款強大的網頁數據分析工具。集成在Internet Explorer工具欄。包括網頁摘要。Cookies管理。緩存管理。消息頭髮送/接受。字符查詢。
若是你的是Firefox火狐瀏覽器的話,恭喜你,它裏面自帶了一個比較好用的工具firebug,它的功能是和HttpWatch差很少,區別不大,我就是用Firefox自帶的工具進行抓包分析的。
下面就讓我用圖片展現firebug的安裝吧:
web
3、你最關心的代碼實現。
我作的做品是經過抓取我校(廣東石油化工學院)的教務系統的數據進行分析和操做的,看到圖片上的我畫的,誒,是否是真是你想作和抓取的呀?數據庫
好了,如今要用的firebug終於到場了,咱們點擊瀏覽器小蟲子的圖標,或者直接按下F12快捷鍵,便出現這個頁面,這個頁面正是咱們所須要的抓包分析頁面。json
有木有很激動,看到數據了沒有?這些數據正是咱們所須要的抓取的數據。
可是問題來了。我是先登陸才能到這個頁面的啊。
其實咱們登錄時是經過cookie進行驗證的,若是返回的cookie不爲null,那麼則是登錄成功後端
那麼問題來了。我要怎麼才能到到cookie了。cookie其實就至關於咱們的身份證同樣,裏面有惟一的信息。很少說,直接上代碼:瀏覽器
/** * 登陸時獲得cookie * @param xueHao 學號,便是登錄帳號 * @param password 登錄密碼 * @return */ public List<Cookie> getCookie(String xueHao,String password) { List<Cookie> cookies = null; // 保存獲取的cookie try { HttpClient client = new DefaultHttpClient(); String uriAPI = "http://218.15.22.136:3008/"; HttpPost httpPost = new HttpPost(uriAPI); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair( "Window1$SimpleForm1$rdl_shenFen", "學生")); params.add(new BasicNameValuePair("Window1$SimpleForm1$tbx_XueHao", xueHao)); params.add(new BasicNameValuePair("Window1$SimpleForm1$tbx_pwd", password)); params.add(new BasicNameValuePair("Window1_Collapsed", "false")); params.add(new BasicNameValuePair("Window1_Hidden", "false")); params.add(new BasicNameValuePair("Window1_SimpleForm1_Collapsed", "false")); params.add(new BasicNameValuePair("X_AJAX", "true")); params.add(new BasicNameValuePair("X_CHANGED", "true")); params.add(new BasicNameValuePair("X_STATE", "e30=")); params.add(new BasicNameValuePair("X_TARGET", "Window1_Toolbar1_btn_login")); params.add(new BasicNameValuePair("__EVENTARGUMENT", "")); params.add(new BasicNameValuePair("__EVENTTARGET", "Window1$Toolbar1$btn_login")); // 發出HTTP request httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); // 取得HTTP response HttpResponse httpResponse = client.execute(httpPost); // 執行 // 若狀態碼爲200 ok if (httpResponse.getStatusLine().getStatusCode() == 200) { // 返回值正常 // 獲取返回的cookie cookies = ((AbstractHttpClient) client).getCookieStore() .getCookies(); //System.out.println("cookies=" + cookies); if (cookies.isEmpty()) System.out.println("cookies empty"); } else { } } catch (Exception e) { System.out.println("getCookie error:" + e); } return cookies; }
你會問params.add(new BasicNameValuePair("X_AJAX", "true")) 這些東西是什麼啊?別急!再看圖緩存
怎麼樣?懂了吧?其實就是post傳帶的參數。
ok,進入系統以後,咱們就要對本身感興趣的數據進行抓取了,繼續如圖:安全
選擇本身想要抓取的頁面,點擊cookies能夠知道,我本身已經登錄,cookie不爲空。點擊響應能夠看到服務器
本身想要抓取的數據已經存在,不難發現本身想要數據部分是以json的形式顯示出來的,如今就是獲得這些數據進行分解抓取了。你會說,這個什麼東西,我看不懂,看不懂不要緊,你只要數據就好了,對於這響應的數據,實際上是asp的格式而已,若是點擊的網頁時htmll的話,那麼響應的即是html,一樣是能夠進行解析的。cookie
那怎麼獲得這個頁面呢,先看代碼,再解釋吧:
/** * 獲得成績數據 */ public ArrayList<HashMap<String, Object>> getMyGrade(List<Cookie> cookies) { String result = null; ArrayList<HashMap<String, Object>> list = null; String uriPath = "http://218.15.22.136:3008/ChengJiChaXun.aspx"; try { HttpPost httpPost = new HttpPost(uriPath); httpPost.setHeader("Cookie", "ASP.NET_SessionId=" + cookies.get(0).getValue() + ";XingMing=" + cookies.get(1).getValue()); HttpResponse httpResponse = new DefaultHttpClient() .execute(httpPost); if (httpResponse.getStatusLine().getStatusCode() == 200) { result = EntityUtils.toString(httpResponse.getEntity()); if (result != null && !result.isEmpty()) { list = new ArrayList<HashMap<String, Object>>(); list = toGradeData(result); } } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; }
首先呢,你的獲得你想要抓取的頁面的地址,如http://218.15.22.136:3008/ChengJiChaXun.aspx,可是這僅僅是不夠的,由於你要告訴系統的你的身份,否則誰均可以查分數了。沒錯,你要把cookie的內容傳到系統中, httpPost.setHeader("Cookie", "ASP.NET_SessionId=" + cookies.get(0).getValue() + ";XingMing=" + cookies.get(1).getValue());讓系統知道你是否有權限查詢數據。很少說,看下圖:
固然代碼中的 list = toGradeData(result)你可能看不懂,這是我本身寫的獲取我須要的數據的方法,最後把數據裝進ArrayList<HashMap<String,Object>>中返回,那麼接下來,你應該知道怎麼作了吧?和listview綁定,就能夠把數據顯示在手機界面了。如圖:
至於對源碼的解析,能夠同jsoup解析網頁來進行抓取數據
固然,個人項目作了消息通知,公告欄,機構通知,如圖:
那麼我是怎麼作的呢?
在這裏。我就得向你們介紹一個很好用的移動雲服務器了。Bmob移動後端雲服務,它是一個很是好用的免費的雲數據庫,咱們作的項目若是不能聯網獲取數據那麼這樣的應用是沒人用的,或者說是失敗的,可是聯網獲得數據咱們得有服務器啊,通常我的開發者是沒有本身的服務器,特別是學生來講更是如此,可是,如今你不用擔心了,Bmob能夠幫你搞定全部的繁瑣的後臺開發,而讓你更有時間和精力去開發你的應用。
具體我很少說,省得覺得我在打廣告,若是本身感興趣的話,能夠到Bmob官網瞭解。
首先來看,上圖的數據我並非存在SQLite的,也不是存在文件中的,我是直接經過聯網從個人雲服務中獲得的,一旦個人雲服務器中的數據有改變,我下拉就能夠獲得最新消息。即可以作到相似新聞同樣的消息通知了。
你們請看我後臺的雲端數據庫
怎麼樣?不錯吧?其實你看Bmob的文檔,你會發現,其實這些都不難,代碼說真的挺簡單的。裏面能夠設置本身應用的的官網之類的一堆功能,建議都去看看吧,相信大家能作的更好更厲害。這個就是我在Bmob中下載個人應用的官網http://downloadlaba.bmob.cn
最後呢,但願我寫的這些對大家有幫助吧,尊重原創,轉發請寫上原創地址。謝謝啦~若有疑問歡迎245105136@qq.com