前一篇教程中,我们学习了如何在手机上请求登录正方管理系统,那么我们登录成功之后,就可以执行其他的操作了。本文给大家介绍的是如何查询成绩;
以及用Jsoup
解析html网页。
首先需要添加Jsoup
依赖
compile 'org.jsoup:jsoup:1.9.1'
然后我们开始吧
抓包查看请求数据
首先进入成绩查询页面,可以看到想要查成绩,需要选择学年,学期,以及查询方式,我们先试着查询一下成绩,并用chrome开发者工具抓包。
成绩查询页面通过抓包可以得到请求的表单信息;
表单其中前面两个不用管,直接复制就可以,这里要注意的,查询方式不一样,第一个值是不一样的,所以一定要区别开来,查询方式指的是:按学期查询,按学年查询...还有就是
txtQSCJ
,txtZZCJ
这两个值也是不变的,可能不同的学校这个值也不一样。ddlXN
这个是学年,ddlXQ
学期,看最后一个Button1
,这个值是什么呢?直接复制就好!哈哈。
获得参数
不过这里我们还有一个步骤需要做;先看看Request Url
http://210.44.159.4/xscj.aspxxh=201311011011&xm=%BA%FA%BA%E9%D4%B4&gnmkdm=N121605
我们可以看到url里面包含xh
学号,还有xm
,其中姓名是中文姓名url编码,所以,这个url我们是需要拼接出来的。怎么对中文进行url编码呢,这个就简单了,有java api帮助我们;
public static String encoding(String text) {
try {
text = URLEncoder.encode(text, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return text;
}
这样,我们需要的就都有了。那就开始查询吧;
final PostFormBuilder post = OkHttpUtils.post();
post.url(cjcxUrl)
.addHeader("Host", "210.44.159.4")
.addHeader("Referer", cjcxUrl)
.addParams("__VIEWSTATE", VIEWSTATE)
.addParams("__VIEWSTATEGENERATOR", "8963BEEC")
.addParams("ddlXN", ddlXN)
.addParams("ddlXQ", ddlXQ)
.addParams("txtQSCJ", "0")
.addParams("txtZZCJ", "100")
.addParams("Button1", "%B0%B4%D1%A7%C6%DA%B2%E9%D1%AF")
.build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e) {
Toast.makeText(mContext, "查询失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(String response) {
//查询成功
});
查询成功之后呢,我们获得了这个页面的源代码
成绩#######解析成绩
想要解析html网页得到成绩数据,就需要Jsoup
的帮助了。
我们现在电脑上看一下它的源代码是什么样的。
我们可以看到,所有的成绩,都放在一个id为
DataGrid1
的表格中的<tbody>
标签中,并且每一个<tr>
里面都包含着一个课程的信息,每个信息又都在<td>
中,这样我们的思路就屡清楚了;就可以使用Jsoup
来帮助我们解析了。关于Jsoup
的使用可以参考这篇文章,Jsoup库使用完全解析,本文不做研究。
public static List<ScoreBean> parseScore(String reponse) {
List<ScoreBean> scoreList = new ArrayList<>();
Document document = Jsoup.parse(response);
Element dataGrid1 = document.getElementById("DataGrid1");
Elements trs = dataGrid1.select("tbody").select("tr");
for (int i = 0; i < trs.size(); i++) {
ScoreBean bean = new ScoreBean();
Elements tds = trs.get(i).select("td");
for (int j = 0; j < tds.size(); j++) {
switch (j) {
case 0:
bean.setCourseId(tds.get(j).text());
break;
case 1:
bean.setCourseName(tds.get(j).text());
break;
case 2:
bean.setCourseXz(tds.get(j).text());
break;
case 3:
bean.setCourseCj(tds.get(j).text());
break;
case 4:
bean.setCourseGs(tds.get(j).text());
break;
case 5:
bean.setCourseBk(tds.get(j).text());
break;
case 6:
bean.setCourseCx(tds.get(j).text());
break;
case 7:
bean.setCourseXf(tds.get(j).text());
break;
case 8:
bean.setCourseBj(tds.get(j).text());
break;
}
}
scoreList.add(bean);
}
return scoreList;
}
ScoreBean
可以根据你的需要选择需要的属性,我这里贴一份完整的;
public class ScoreBean {
private String courseId;
private String courseName;
private String courseXz;
private String courseCj;
private String courseGs;
private String courseBk;
private String courseCx;
private String courseXf;
private String courseBj;
public String getCourseBj() {
return courseBj;
}
public void setCourseBj(String courseBj) {
this.courseBj = courseBj;
}
public String getCourseBk() {
return courseBk;
}
public void setCourseBk(String courseBk) {
this.courseBk = courseBk;
}
public String getCourseCj() {
return courseCj;
}
public void setCourseCj(String courseCj) {
this.courseCj = courseCj;
}
public String getCourseCx() {
return courseCx;
}
public void setCourseCx(String courseCx) {
this.courseCx = courseCx;
}
public String getCourseGs() {
return courseGs;
}
public void setCourseGs(String courseGs) {
this.courseGs = courseGs;
}
public String getCourseId() {
return courseId;
}
public void setCourseId(String courseId) {
this.courseId = courseId;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCourseXf() {
return courseXf;
}
public void setCourseXf(String courseXf) {
this.courseXf = courseXf;
}
public String getCourseXz() {
return courseXz;
}
public void setCourseXz(String courseXz) {
this.courseXz = courseXz;
}
}
这样我们的所有成绩信息就都保存在了List中了,然后就可以利用ListView
或者RecylerView
展示在页面上了;
交给你吧!
网友评论