基於強智科技教務系統模擬登入實現資料爬蟲的安卓版專案詳解----適合Android新手
基於強智科技教務系統模擬登入實現資料爬蟲的安卓版專案詳解----適合Android新手(文末有驚喜)
開發背景
早在去年寒假的時候,就因為在寫個人網站專案的時候,想要對接學校的學生資料庫,這樣能夠繫結學生資訊來更加方便的管理個人網站---菜鳥的自我救贖 的使用者物件,,於是在不斷的學習瞭解中,最終做好了簡單的java模擬登入學生教務系統網站,實現資料爬取,解析和顯示管理;
最初的版本是在用java的Web Project做的一個簡單的Servlet Demo來實現簡單的功能,具體可以參照我之前的部落格---基於java的Servlet爬蟲詳解,有對這個專案詳細講解;
開發目的
在做好Web服務的這個爬蟲專案之後,自己常常會想到很多,因為在通過web專案訪問進行模擬登入的時候,會有很多的界限,在功能方面,不是很好的體現Jsoup在http模擬登入和html資料解析上的強大,於是,在寫作業累了,停下來的時候,就常常想想有沒有可能之前的這些專案做個更好的功能上的優化以及提高在使用上的便捷,於是有一天,我在開啟我大一寒假準備寫的Demo發現,我有做一點點,,,,,,,,強迫症的我,,就碼起了這個Android專案的Code,在電腦面前坐了一天,,,算好,做好,能夠實現通過學生的學號,密碼來登入教務系統,顯示該學生的學生成績,等級考試成績等.接下來詳細說明功能的實現
功能需求
1.教務系統中驗證碼的下載和在Android中顯示;
2.利用Thread來進行點選切換驗證碼效果;
3.Android登入介面的UI設計和相關控制元件的監聽等;
4.利用Jsoup提交資料,做post請求,模擬登入系統;(重點)
5.利用web前端框架amazingUI來顯示成績資訊;
6.系統中爬取的html程式碼和成績資訊的解析;(難點)
專案須知
1.由於大學本科老師教Android的時候使用的是Eclipse(ADT)來開發Android,這個專案就單純用ADT來寫,就不用Android studio來考驗電腦記憶體了(哈哈哈哈...)
2,建議使用海馬玩手機模擬器,我覺得非常好用
3.當然專案可以用Android Studio來開發,,如果有需要,後期可以嘗試寫寫看,原理一樣;
開發步驟
1.使用者登入介面的UI設計;
佈局原始碼:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/back">
<TextView
android:layout_width="fill_parent"
android:layout_height="100dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_margin="10dp"
android:text="學 號:"
android:textSize="20dp" />
<EditText
android:id="@+id/num_edittext"
android:layout_width="0dp"
android:layout_height="30dp"
android:layout_margin="10dp"
android:layout_weight="1"
android:singleLine="true"
android:maxLines="1"
android:background="#FFFFFF"
android:hint="請輸入教務系統學號"
android:padding="3dp"
android:textSize="14dp" />
</LinearLayout>
<TextView
android:layout_width="fill_parent"
android:layout_height="20dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_margin="10dp"
android:text="密 碼:"
android:textSize="20dp" />
<EditText
android:id="@+id/pwd_edittext"
android:layout_width="0dp"
android:layout_height="30dp"
android:layout_margin="10dp"
android:layout_weight="1"
android:background="#FFFFFF"
android:singleLine="true"
android:maxLines="1"
android:hint="請輸入教務系統密碼"
android:padding="3dp"
android:password="true"
android:textSize="14dp" />
</LinearLayout>
<TextView
android:layout_width="fill_parent"
android:layout_height="20dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_margin="10dp"
android:text="驗證碼:"
android:textSize="20dp" />
<EditText
android:id="@+id/code"
android:layout_width="0dp"
android:layout_height="30dp"
android:layout_margin="10dp"
android:layout_weight="1"
android:background="#FFFFFF"
android:hint="請輸入驗證碼"
android:singleLine="true"
android:maxLines="1"
android:padding="3dp"
android:textSize="14dp" />
<ImageView
android:id="@+id/code_image"
android:layout_width="0dp"
android:layout_height="30dp"
android:layout_margin="10dp"
android:layout_weight="1" />
</LinearLayout>
<TextView
android:layout_width="fill_parent"
android:layout_height="30dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_marginTop="20dp"
android:orientation="horizontal" >
<Button
android:id="@+id/loginbtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:text="登 錄"
android:textSize="20dp" />
</LinearLayout>
</LinearLayout>
2.開發介面(有點Low)
3.下載和顯示驗證碼圖片
private void DoGetVerifation() {
new Thread(new Runnable() {
@Override
public void run() {
// 用post來請求
HttpPost httPost = new HttpPost(codeUrl);
HttpClient client = new DefaultHttpClient();
try {
// 獲取cookies
getCookie();
httPost.setHeader("cookie", "JSESSIONID=" + JSESSIONID);
Log.i("TAG", "圖片的httppost內容為:" + httPost);
HttpResponse httpResponse = client.execute(httPost);
byte[] bytes = new byte[1024];
bytes = EntityUtils.toByteArray(httpResponse.getEntity());
code_image_Bitmap = BitmapFactory.decodeByteArray(bytes, 0,
bytes.length);
} catch (IOException e) {
e.printStackTrace();
}
if (code_image_Bitmap == null)
// 初始圖片,當獲取不到 驗證碼
code_image.setImageResource(R.drawable.code);
Message msg = new Message();
msg.arg1 = 10;// 傳值
handler.sendMessage(msg);
}
}).start();
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
// 控制元件宣告
getCookie();
initView();
// 載入activity,獲取驗證碼圖片
// 監聽的事件
initEvent();
// 接收handle訊息
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.arg1) {
case 10:
// 獲取到圖片的bitmap物件,填充控制元件
code_image.setImageBitmap(code_image_Bitmap);
break;
}
}
@Override
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
// TODO Auto-generated method stub
return super.sendMessageAtTime(msg, uptimeMillis);
}
};
4.基於資料庫的封裝和物件的持久化package com.example.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import android.util.Log;
import com.example.dto.Score;
import com.example.utils.DBUtils;
/**
*
* @author Taylor
* @Time 2018年6月22日
*/
public class ScoreDAO {
public boolean insert(Score score) {
String sql = "insert into score(sid,kkxq,kcmc,zcj,cjurl,kcxz,type,time,xf,ksxz,bkxq) values(?,?,?,?,?,?,?,?,?,?,?)";
return DBUtils.exeUpdate(sql, score.getSid(), score.getKkxq(),
score.getKcmc(), score.getZcj(), score.getCjurl(),
score.getKcxz(), score.getType(), score.getTime(),
score.getXf(), score.getKsxz(), score.getBkxq());
}
public Score findScoreBySid(String sid) throws ClassNotFoundException,
SQLException {
String sql = "select * from score where sid=?";
Log.i("title", "指標"+sid+sql);
ResultSet rs = DBUtils.exeQuery(sql, sid);
Score score = null;
if (rs.next()) {
int id = rs.getInt("id");
String sid1 = rs.getString("sid");
String kkxq = rs.getString("kkxq");
String kcmc = rs.getString("kcmc");
String zcj = rs.getString("zcj");
String cjurl = rs.getString("cjurl");
String kcxz = rs.getString("kcxz");
String type = rs.getString("type");
String time = rs.getString("time");
String xf = rs.getString("xf");
String ksxz = rs.getString("ksxz");
String bkxq = rs.getString("bkxq");
score = new Score(id, sid1, kkxq, kcmc, zcj, cjurl, kcxz, type,
time, xf, ksxz, bkxq);
}
DBUtils.close(rs, null, null);
return score;
}
public Score findScoreBySidAndKcmc(String sid, String kcmc)
throws ClassNotFoundException, SQLException {
String sql = "select * from score where sid=? and kcmc=?";
ResultSet rs = DBUtils.exeQuery(sql, sid, kcmc);
Score score = null;
if (rs.next()) {
int id = rs.getInt("id");
String sid1 = rs.getString("sid");
String kkxq = rs.getString("kkxq");
String kcmc1 = rs.getString("kcmc");
String zcj = rs.getString("zcj");
String cjurl = rs.getString("cjurl");
String kcxz = rs.getString("kcxz");
String type = rs.getString("type");
String time = rs.getString("time");
String xf = rs.getString("xf");
String ksxz = rs.getString("ksxz");
String bkxq = rs.getString("bkxq");
score = new Score(id, sid1, kkxq, kcmc1, zcj, cjurl, kcxz, type,
time, xf, ksxz, bkxq);
}
DBUtils.close(rs, null, null);
return score;
}
public Score findScoreByKKXQ(String kkxq) throws ClassNotFoundException,
SQLException {
String sql = "select * from score where kkxq=?";
ResultSet rs = DBUtils.exeQuery(sql, kkxq);
Score score = null;
if (rs.next()) {
int id = rs.getInt("id");
String sid1 = rs.getString("sid");
String kkxq1 = rs.getString("kkxq");
String kcmc = rs.getString("kcmc");
String zcj = rs.getString("zcj");
String cjurl = rs.getString("cjurl");
String kcxz = rs.getString("kcxz");
String type = rs.getString("type");
String time = rs.getString("time");
String xf = rs.getString("xf");
String ksxz = rs.getString("ksxz");
String bkxq = rs.getString("bkxq");
score = new Score(id, sid1, kkxq1, kcmc, zcj, cjurl, kcxz, type,
time, xf, ksxz, bkxq);
}
DBUtils.close(rs, null, null);
return score;
}
public List<Score> getTermBySid(String sid) throws ClassNotFoundException,
SQLException {
String sql = "SELECT kkxq from score WHERE sid=? GROUP BY kkxq ";
List<Score> scores = new ArrayList<>();
ResultSet rs = null;
try {
rs = DBUtils.exeQuery(sql, sid);
Score score = null;
while (rs.next()) {
String kkxq = rs.getString("kkxq");
score = new Score(kkxq);
scores.add(score);
}
} catch (SQLException e) {
e.printStackTrace();
}
return scores;
}
public List<Score> getScoreBySid(String sid) throws ClassNotFoundException,
SQLException {
String sql = "SELECT * from score WHERE sid=? order by kkxq ASC";
List<Score> scores = new ArrayList<>();
ResultSet rs = null;
try {
rs = DBUtils.exeQuery(sql, sid);
Score score = null;
while (rs.next()) {
int id = rs.getInt("id");
String sid1 = rs.getString("sid");
String kkxq1 = rs.getString("kkxq");
String kcmc = rs.getString("kcmc");
String zcj = rs.getString("zcj");
String cjurl = rs.getString("cjurl");
String kcxz = rs.getString("kcxz");
String type = rs.getString("type");
String time = rs.getString("time");
String xf = rs.getString("xf");
String ksxz = rs.getString("ksxz");
String bkxq = rs.getString("bkxq");
score = new Score(id, sid1, kkxq1, kcmc, zcj, cjurl, kcxz,
type, time, xf, ksxz, bkxq);
scores.add(score);
}
} catch (SQLException e) {
e.printStackTrace();
}
return scores;
}
public boolean update(Score score) throws ClassNotFoundException,
SQLException {
return DBUtils
.exeUpdate(
"update score set zcj=?,cjurl=?,ksxz=?,bkxq=? where sid=? and kcmc=?",
score.getZcj(), score.getCjurl(), score.getKsxz(),
score.getBkxq(), score.getSid(), score.getKcmc());
}
public boolean deleteBySid(String sid) {
String sql = "delete from score where sid=?";
return DBUtils.exeUpdate(sql, sid);
}
public static void main(String[] args) throws ClassNotFoundException, SQLException {
ScoreDAO sDao = new ScoreDAO();
Score score = new Score();
score=sDao.findScoreBySid("015301714211");
System.out.println(score.getSid());
}
}
5.Android中AndroidManifest.xml的基本配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.scoredemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="17" />
<!-- 網路許可權 -->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@drawable/logo"
android:label="成績查詢助手Beta"
android:theme="@style/AppBaseTheme" >
<activity
android:name="com.example.login.LoginActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.example.login.ShowActivity"
android:label="@string/app_name" >
</activity>
</application>
</manifest>
6.專案效果展示安裝介面 登入介面 成績顯示介面 學習成績的顯示介面是可以滑動的,可以顯示全部學生資訊專案小結
1.雖然功能單一,但是專案設計到的技術較多,適合Android新手學習,使用;
2.如果你對本專案感興趣,不妨給我點個贊,關注一波,天南地北,點贊關注博主一波(博主在農村學java開發)
3.哎呀,最近頭很痛,小哥們微信騷一波吧,睡覺啦;
兄弟們,微信掃一掃
資源下載