基于强智科技教务系统模拟登录实现数据爬虫的安卓版项目详解----适合Android新手

版权声明:本文为博主原创文章,未经博主允许不得转载.转载请注明博主链接哈! https://blog.csdn.net/Mmdapl/article/details/80787391

基于强智科技教务系统模拟登录实现数据爬虫的安卓版项目详解----适合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.哎呀,最近头很痛,小哥们微信骚一波吧,睡觉啦;


兄弟们,微信扫一扫

资源下载

            项目Android apk下载:Android APK文件点我下载

            项目源码下载:项目源码下载,扫一扫支持一下博主哦,谢谢啦


展开阅读全文

没有更多推荐了,返回首页