一、问题
由于项目需要,要做一个课程表,所以需要获取学校中的课程表数据。
二、方法
模拟浏览器一样向服务器发送数据和获取数据
需要工具:抓包工具fiddler4和解析HTTP代码的Jsoup
三、代码
1、增加Jsoup依赖

 implementation 'org.jsoup:jsoup:1.8.3'

2、增加网络权限,因为需要访问服务器

<uses-permission android:name="android.permission.INTERNET"/>

3、Activity步骤
①获取登陆正方教务系统所需参数
②登陆正方教务系统
③抓取所需数据

1>从fiddler可以知道所需参数
打开fiddler,然后浏览器登陆正方教务系统,最后在fiddler中查看一个post请求,点击右边的WebForms可以查看所需参数,


__VIEWSTATEGENERATOR和__VIEWSTATE可以从源码中获得,TextBox1是登陆账号,TexBox2是登陆密码,TexBox3是验证码,RedioButtonList1是区别学生和老师,输入%D1%A7%C9%FA,是”学生”经过URL编码(gb2312)后的字符串。,Button1和IbLanguage填空就可以。
参数还需要cookies,身份的象征,之后的每一步操作都需要它。
2》获取cookit,__VIEWSTATE和__VIEWSTATEGENERATOR

 private  void send (){new Thread(new Runnable() {@Overridepublic void run() {try{//获取连接connection = Jsoup.connect("http://jwgl.hstc.edu.cn/(iy2jwg55wsqgy5nd2gfwdevw)/");//链接根据你们学校的地址,从fiddler中的Headers信息的Refererconnection.header("User-Agent",// 配置模拟浏览器"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0");response = connection.timeout(3000).execute();//保存Cookiescookies = response.cookies();// 将响应转换为Dom树,以便获取__VIEWSTATEdocument = Jsoup.parse(response.body());for(Element element:document.getElementsByTag("input")) {if (element.attr("name").equals("__VIEWSTATE")) {__VIEWSTATE = element.val();break;}}for(Element element:document.getElementsByTag("input")) {if (element.attr("name").equals("__VIEWSTATEGENERATOR")) {__VIEWSTATEGENERATOR = element.val();break;}}Log.d("Maint",__VIEWSTATE );Log.d("Maint",__VIEWSTATEGENERATOR);downloadCheckcode();}catch (IOException ex){ex.printStackTrace();}}}).start();}

3》获取验证码,显示在ImageView中

public void downloadCheckcode() {new Thread(new Runnable() {@Overridepublic void run() {try {String captcha_url = "http://jwgl.hstc.edu.cn/(iy2jwg55wsqgy5nd2gfwdevw)/CheckCode.aspx";//从fiddler中验证码的图片中看Refererresponse = Jsoup.connect(captcha_url).cookies(cookies).ignoreContentType(true) // 获取图片需设置忽略内容类型.userAgent("Mozilla").method(Connection.Method.GET).timeout(3000).execute();byte[] bytes = response.bodyAsBytes();//更新UI只能在handle,handle代码详见源代码Message message = new Message();message.obj = bytes;message.what = bytes.length;handler.sendMessage(message);}catch (Exception e){e.printStackTrace();}}}).start();}

②和③

public void login(final String stuNum, String password, String checkCode){this.stuNum = stuNum;stuName = "";//填充post数据Map<String, String> datas = new HashMap<>();datas.put("__VIEWSTATE",__VIEWSTATE);datas.put("__VIEWSTATEGENERATOR",__VIEWSTATEGENERATOR);datas.put("TextBox1",stuNum);datas.put("TextBox2",password);datas.put("TextBox3",checkCode);datas.put("RadioButtonList1","%D1%A7%C9%FA");datas.put("Button1","");datas.put("lbLanguage","");final Map<String, String> datas1 =datas;Log.d("Main","2");
new Thread(new Runnable() {@Overridepublic void run() {try{connection = Jsoup.connect("http://jwgl.hstc.edu.cn/(iy2jwg55wsqgy5nd2gfwdevw)/");connection.header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0");// 设置cookie和post上面的map数据response = connection.postDataCharset("GB2312").ignoreContentType(true).method(Connection.Method.POST).data(datas1).cookies(cookies).execute();document = response.parse();Log.d("Main","3");if(document.title().equals("欢迎使用正方教务管理系统!请登录")){Log.d("Main","15");String error = document.getElementsByTag("script").get(1).data();Pattern pattern = Pattern.compile("(?<=alert\\(')[^']*");Matcher matcher = pattern.matcher(error);while(matcher.find()){Log.d("Main","9");Log.d("Main","登陆失败,");Log.d("Main",matcher.group());}}else {Log.d("Main","16");stuName = document.getElementById("xhxm").text();stuName = stuName.substring(0,stuName.length()-2);Log.d("Main","10");Log.d("Main","登陆成功,欢迎你"+stuName+"!");try{String infoURL ="http://jwgl.hstc.edu.cn/(iy2jwg55wsqgy5nd2gfwdevw)/xsgrxx.aspx?xh="+stuNum+"&xm="+URLEncoder.encode(stuName,"GB2312")+"&gnmkdm=N121501";//点击你想获取的数据按钮,然后去fiddler查看地址,因为要所以人都可以用,所以账//号,密码要弄做通用的                   Log.d("Maint","http://jwgl.hstc.edu.cn/(iy2jwg55wsqgy5nd2gfwdevw)/xsgrxx.aspx?xh="+stuNum+"&xm="+URLEncoder.encode(stuName,"GB2312")+"&gnmkdm=N121501");connection = Jsoup.connect(infoURL);response = connection.ignoreContentType(true).method(Connection.Method.GET).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0").referrer("http://jwgl.hstc.edu.cn/(iy2jwg55wsqgy5nd2gfwdevw)/xsgrxx.aspx?xh="+stuNum).cookies(cookies).postDataCharset("GB2312").timeout(3000).execute();document = response.parse();if(document.getElementById("lbxsgrxx_xb") != null){Log.d("Maint","---基本信息---");Log.d("Maint",document.getElementById("lbxsgrxx_xb").text()+document.getElementById("lbl_xb").text());Log.d("MAInt",document.getElementById("lbxsgrxx_csrq").text()+document.getElementById("lbl_csrq").text());Log.d("main",document.getElementById("lbxsgrxx_xy").text()+document.getElementById("lbl_xy").text());
//                        System.out.println(document.getElementById("lbxsgrxx_dqszj").text()+document.getElementById("lbl_dqszj").text());
//                        System.out.println(document.getElementById("TDzymc").text()+document.getElementById("lbl_zymc").text());
//                        System.out.println(document.getElementById("lbxsgrxx_xzb").text()+document.getElementById("lbl_xzb").text());}else {Log.d("Maint","获取信息失败");}}catch (IOException ex){ex.printStackTrace();}}Log.d("Main","11");}catch (Exception ex){Log.d("Main","4");ex.printStackTrace();}Log.d("Main","8");}
}).start();}

四、其他
1、一定要先登录才能获取数据,参考网页
2、源码
3、URL一定要换,还有登录所需参数每个学校都可能不同,具体看fiddler
4、其实就是用fiddler查看浏览器向服务器发送了什么,然后用android模拟浏览器也向服务器发送,然后从服务器获得数据
5、获取数据就是获取界面,然后自己解析HTTP,发送数据就是用fiddler查看浏览器向服务器发送了什么,然后自己也发送什么给模拟器
6、注意,一定要在校园网中获取数据,不然不行
7、爬取正方教务管理系统获取学生信息
fiddler配置及使用教程

android之爬取正方教务管理系统获取信息相关推荐

  1. 爬取正方教务管理系统获取学生信息

    新版正方教务系统请点这里:模拟登陆新版正方教务管理系统(获取学籍信息.课表和成绩) 最近想学点爬虫玩玩,拿学校的教务系统练练手.学校与很多高校一样,用的是正方教务管理系统,非常的不好用,经常出现登陆不 ...

  2. Java爬取正方教务,获取成绩信息

    github.superwuit.cn /**  * 2018-2-3 21:15:16  * @Description: 模拟登陆正方教务获取成绩HTML页面,并利用正则表达式提取成绩信息  * @ ...

  3. 爬取正方教务系统完成成绩查询

    刚刚开始接触爬虫,在爬过起点中文网这种不要登陆的网页后转向教务系统这种需要登陆的网页,登录这个因为还有验证码,刚接触所以花费了很长时间,说到底其实就是把你的信息交给网站让它可以认得你的过程,而登录过后 ...

  4. python爬虫登录正方教务管理系统获取成绩数据

    本程序以四川理工学院教务管理系统为例.... 准备工作:1.ruquests库的使用(或者urllib也可行) 2.正则表达式的书写 3.HTTP通信基础 4.一些解析库的使用 准备一个浏览器监视工具 ...

  5. python爬取学校教务管理系统

    写这个爬虫的缘由 以前用java写过一个爬取学校的教务系统的爬虫 https://blog.csdn.net/ygdxt/article/details/81158321,最近痴迷Python爬虫,了 ...

  6. python爬取学校教务管理系统_python requests模拟登陆正方教务管理系统,并爬取成绩...

    最近模拟带账号登陆,查看了一些他人的博客,发现正方教务已经更新了,所以只能自己探索了. 登陆: 通过抓包,发现需要提交的值 需要值lt,这是个啥,其实他在访问登陆页面时就产生了 session=req ...

  7. python爬取学校教务管理系统_python爬虫模拟登陆学校教务处

    最近在学python爬虫,我想教务处官网可能是每个学生第一个自己动手爬取的网站吧.而且很多学校的教务处没有验证码,很适合初学者练手. 环境准备 本次模拟登陆用到的库除了requests外还有lxml, ...

  8. 爬取正方教务系统课程表

    被一个学长布置下的任务-有些地方可能不够完整- 思路: 首先你需要完成登录操作: (1) 首先根据教务系统网站的审查元素, 发现了一个验证码的网址:http://210.40.2.253:8888/( ...

  9. 模拟登陆新版正方教务管理系统

    写在前面 已经过了一年半,网站有所改版,目前是可以正常登录的,获取信息的那几个url不是直接返回JSON了,需要自己去解析数据. 引入 与很多高校一样,西安皇家邮电大学一直钟爱于正方教务管理系统. 前 ...

最新文章

  1. 如何通过SEO来提升网站转化率?
  2. JSON数据格式必知
  3. Kubernetes 1.5部署sonarqube
  4. 定时器取数据时实时进来的数据_Redis-数据淘汰策略amp;持久化方式(RDB/AOF)amp;Redis与Memcached区别...
  5. java 蓝桥杯 基础练习 Sine之舞
  6. 20180804的Test
  7. Struts学习之自定义拦截器
  8. 网站左侧悬浮框随着滚动条滚动代码
  9. 管理感悟:代码审查做哪些事情?
  10. 2022 基于SpringBoot/SSM的脚手架租赁系统
  11. 量子计算机与仿生论文,有关量子力学的论文
  12. 工资详情计算器-适用于2022年新税法累计扣税规则
  13. mysql中筛选不重复值_MYSQL中筛选不重复记录值的示例
  14. java.library.path和LD_LIBRARY_PATH的介绍与区别
  15. 秀和vs太田雄藏(依田纪基讲定式,欺骗感情)
  16. MIGO为玩家带来接近无限的可能
  17. 三星很陶醉:爷会成为智能手机之王
  18. 小科普:什么是5G垂直行业?
  19. let和const与var的区别
  20. java实现xml的xsd验证_Java通过XML Schema校验XML

热门文章

  1. Go 简介、应用场景
  2. 九州贯连:智能体重秤为什么卖得贵,是因为考研英语二会考嘛?
  3. 《定位》艾·里斯 杰克·特劳特.pdf完整电子版营销经典免费赠送!
  4. 0407fitness静态拉伸
  5. 古典中国风下载PPT模板
  6. Linux使用chrony让局域网内的服务器时间同步
  7. 国产系列卫星平台介绍——环境系列、资源系列
  8. 简单介绍快快网络游戏盾-云安全防护
  9. 拼题A基础篇32 计算圆周率
  10. 上海海事大学计算机专硕招得不满么,注意!近期大批院校初试科目调整汇总,这些院校专业停招全日制研究生...