本人最近在做一个校园APP,其功能主要是查询学生课表、成绩等等。当然,学校教务处肯定不会给我们提供现成的API,那么就要使用Java来模拟浏览器登陆教务处网页。

其实用Java模拟登陆就是抓取浏览器所做的工作后,用Java语言实现这些工作。

第一步:用浏览器登陆教务处网站,抓取浏览器所做的工作

输入学号和密码及选择用户类型为学生后,点击登陆,抓取到浏览器的工作:

通过抓取到的浏览器所做的工作,我们知道:请求的URL、请求方法及POST发送的用户信息、请求头内容,还得到了响应头信息,因为这个请求返回的还不是学生课表页面,因此返回内容对我们没有用,我们只需要响应头中返回给我们的Cookie。

第二步:用Java来实现浏览器登陆这一行为

public class GetEverythingPrepared {public static String LOGIN_URL = "http://sso.jwc.whut.edu.cn/Certification//login.do";private String cerlogin;private String jsessionid;private int content_length;public void login(String studyNumber, String password, String type) {String postContent = "systemId=&xmlmsg=&userName="+studyNumber+"&password="+password+"&type="+type+"&imageField.x=60&imageField.y=24";content_length = postContent.length;  //请求消息长度List<String> cookie = null;try {HttpURLConnection huc = (HttpURLConnection) new URL(LOGIN_URL).openConnection();huc.setDoOutput(true);huc.setRequestMethod("POST");huc.setReadTimeout(6000);loginSetRequestProperty(huc);OutputStream postOS = huc.getOutputStream();postOS.write(postContent.getBytes());Map<String, List<String>> headerFields = huc.getHeaderFields();cookie = headerFields.get("Set-Cookie");cerlogin = cookie.get(0);jsessionid = cookie.get(1);} catch (MalformedURLException e) {System.out.println("ERROR 1");e.printStackTrace();} catch (IOException e) {System.out.println("ERROR 2");e.printStackTrace();}}public String getCerlogin() {return cerlogin;}public String getJsessionid() {return jsessionid;}private void loginSetRequestProperty(HttpURLConnection huc) {huc.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");huc.setRequestProperty("Accept-Encoding", "gzip, deflate");huc.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8");huc.setRequestProperty("Cache-Control", "max-age=0");huc.setRequestProperty("Connection", "keep-alive");huc.setRequestProperty("Content-Length", content_length);huc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");huc.setRequestProperty("Host", "sso.jwc.whut.edu.cn");huc.setRequestProperty("Origin", "http://sso.jwc.whut.edu.cn");huc.setRequestProperty("Referer", "http://sso.jwc.whut.edu.cn/Certification//toIndex.do");huc.setRequestProperty("Upgrade-Insecure-Requests", "1");huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36");}}

第三步:在浏览器中点击“学生选课系统”,抓取浏览器行为


我们发现,在这一请求过程中,教务处服务器“狡猾”地弄了四次请求重定向,没关系,Java中HttpURLConnection对象也支持重定向啊,可是不行,查看每次重定向的请求,服务器在这些重定向响应中给我们返回了几个重要的Cookie。没办法,我们不能使用HttpURLConnection的重定向一跑到底,那我们就让HttpURLConnection不执行重定向,我们获得每个响应中的Location,自己再实现跳转到Location指向的地方,并且我们要获取和在每次重定向请求中附带上相应的Cookie。

第一次:

第二次:

第三次:

第四次:

第五步终于访问到了最接近课表的页面(终于结束了纠结的重定向):

最后一步:根据前面获得数据Cookie、Referer请求得到课表:

注意,在最后的请求中有一个请求参数_:1459141710284。对直觉敏锐的人来说,一眼就可以看出这就是请求的时间啊!如此整个抓取工作就结束了。接下来就要用Java代码重写这整个个请求过程啦。

第四步:用Java实现这整个请求过程

public class Pages {private String cerlogin;private String jsessionid;private String JSESSION_TRANS;private String LOCATION_TRANS;public Pages(String cerlogin, String jsessionid) {this.cerlogin = cerlogin;this.jsessionid = jsessionid;}public void getCourseRootPage() {try {URL courseURL = new URL("http://202.114.90.180/Course");HttpURLConnection.setFollowRedirects(false);HttpURLConnection huc = (HttpURLConnection) courseURL.openConnection();courseSetRequestProperty(huc);InputStream is = huc.getInputStream();String location = huc.getHeaderField("Location");URL courseURL2 = new URL(location);HttpURLConnection huc2 = (HttpURLConnection) courseURL2.openConnection();courseSetRequestProperty(huc2);InputStream is2 = huc2.getInputStream();String location2 = huc2.getHeaderField("Location");String JSESSIONcookie = huc2.getHeaderField("Set-Cookie").split(";")[0];JSESSION_TRANS = JSESSIONcookie;URL courseURL3 = new URL(location2);HttpURLConnection huc3 = (HttpURLConnection) courseURL3.openConnection();courseSetRequestProperty(huc3);huc3.setRequestProperty("Cookie", cerlogin.split(";")[0]);InputStream is3 = huc3.getInputStream();String location3 = huc3.getHeaderField("Location");URL courseURL4 = new URL(location3);HttpURLConnection huc4 = (HttpURLConnection) courseURL4.openConnection();courseSetRequestProperty(huc4);huc4.setRequestProperty("Cookie", jsessionid.split(";")[0]+";"+cerlogin.split(";")[0]);InputStream is4 = huc4.getInputStream();String location4 = huc4.getHeaderField("Location");LOCATION_TRANS = location4;URL courseURL5 = new URL(location4);HttpURLConnection huc5 = (HttpURLConnection) courseURL5.openConnection();courseSetRequestProperty(huc5);huc5.setRequestProperty("Cookie", JSESSIONcookie);InputStream is5 = huc5.getInputStream();} catch (MalformedURLException e) {System.out.println("ERROR 3");e.printStackTrace();} catch (IOException e) {System.out.println("ERROR 4");e.printStackTrace();}}public void getCoursePage(File coursePage){getCourseRootPage();long queryDate = System.currentTimeMillis();URL courseURL6;try {courseURL6 = new URL("http://202.114.90.180/Course/grkbList.do?_="+queryDate);HttpURLConnection huc6 = (HttpURLConnection) courseURL6.openConnection();course6setRP(huc6);BufferedReader br = new BufferedReader(new InputStreamReader(huc6.getInputStream(), "utf-8"));String mess;PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(coursePage), "utf-8"), true);while((mess=br.readLine())!=null){pw.println(mess);}} catch (MalformedURLException e) {System.out.println("ERROR 5");e.printStackTrace();} catch (IOException e) {System.out.println("ERROR 6");e.printStackTrace();}}private void courseSetRequestProperty(HttpURLConnection huc) {huc.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");huc.setRequestProperty("Accept-Encoding", "gzip, deflate, sdch");huc.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8");huc.setRequestProperty("Connection", "keep-alive");huc.setRequestProperty("Host", "202.114.90.180");huc.setRequestProperty("Referer", "http://sso.jwc.whut.edu.cn/Certification//login.do");huc.setRequestProperty("Upgrade-Insecure-Requests", "1");huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36");}private void course6setRP(HttpURLConnection huc) {huc.setRequestProperty("Accept", "*/*");huc.setRequestProperty("Accept-Encoding", "gzip, deflate, sdch");huc.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8");huc.setRequestProperty("Connection", "keep-alive");huc.setRequestProperty("Cookie", JSESSION_TRANS);huc.setRequestProperty("Host", "202.114.90.180");huc.setRequestProperty("Referer", LOCATION_TRANS);huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36");huc.setRequestProperty("X-Requested-With", "XMLHttpRequest");}}

第五步:验证结果


哈哈!获得了课表的HTML文档,最终只需要从HTML解析出课表就好了。

使用Java模拟浏览器登陆网站(以抓取武汉理工大学教务处学生个人课表网页为例)相关推荐

  1. php 模拟客户端访问,PHP通过伪造和模拟客户端COOKIE登陆来采集抓取远程网址

    平时开发中经常会遇到抓取某个页面内容,但是有时候某些页面需要登陆才能访问,最常见的就是论坛,这时候我们需要来使用curl模拟登陆. 以下讨论的是和伪造模拟客户端COOKIE登陆采集抓取远程网址相关的P ...

  2. 分享:Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据

    Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据 http://my.oschina.net/leopardsaga/blog/94774

  3. Python爬虫入门5:模拟浏览器访问网站

    ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.引言 在前面两节中分别介绍了使用Google浏览器和IE浏览器怎么获取网站访问的htt ...

  4. 根据专利号到专利查询的网站上抓取想要的信息(上)

    前述:前几天看到有人论要请别人写一个从从网页上抓取某个专利号的收费信息的一个程序,说实话我自己知道那里面的原理是什么,但一直没有自己动手实现以下.根据自己的实际的工作需要一般是有一张Excel表,第一 ...

  5. 如何使用浏览器控制台通过JavaScript抓取并将数据保存在文件中

    by Praveen Dubey 通过Praveen Dubey 如何使用浏览器控制台通过JavaScript抓取并将数据保存在文件中 (How to use the browser console ...

  6. 为何大量网站不能抓取?爬虫突破封禁的6种常见方法

    为何大量网站不能抓取?爬虫突破封禁的6种常见方法 在互联网上进行自动数据采集(抓取)这件事和互联网存在的时间差不多一样长.今天大众好像更倾向于用"网络数据采集",有时会把网络数据采 ...

  7. 第十一章 从网站图片中抓取文字

    #!/usr/bin/env python # _*_ coding:utf-8 _*_ #这一节是数144页从网站图片抓取文字的代码, #需要安装tesseract,它是开源的可以通过训练识别出字体 ...

  8. 浅析搜索引擎对网站的抓取规则有哪些方面

    众多网络优化公司都有一个共识,那就是每个搜索引擎的排名实际上都是综合网站各方面因素进行综合判定的.在某种情况下凑巧让一些网站得出了一些所谓的优化结论,实际上关于搜索引擎的算法谁都不能确保自己完全了解, ...

  9. 百度SEO网站链接抓取器 v1.0

    简介: 网站链接抓取器可以帮助用户对网站上面的各个内容进行抓取,操作很简单,用户只需要输入网址域名就能够获取相应的源代码,从而获取网站上面的图片.脚本等等,适用于需要淘宝抓图或者仿站的用户,支持批量抓 ...

  10. WordPress快速增加百度收录,加快网站内容抓取

    本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. 利用百度站长平台提供的链接 ...

最新文章

  1. winSockets编程(二)socket函数
  2. SQVI和SAP查询QUERY的区别和使用注意事项
  3. GitHub上个最有意思的项目合集(技术清单系列)
  4. 设计用例测试下面的python程序def do_你能变形python的unittest测试用例吗?
  5. linux caffe生成的模型,深度学习之pytorch转caffe转ncnn模型转换(三)
  6. Windows 10 下 转移MySQL 8.0的数据库文件夹(靠谱版)
  7. R语言领跑 大数据岗位霸占IT薪酬榜单
  8. xftp显示隐藏的文件夹及传输文件发生错误问题
  9. 必读| 关于机器学习最全面无痛的入门路径和资源!(下)
  10. ROS学习|Behavoir Tree(BT树)--c++实现
  11. [渝粤教育] 西南科技大学 电子测量与仪表 在线考试复习资料
  12. 设置文字为计算机屏幕保护,win10系统设置炫酷三维文字屏幕保护的具体技巧
  13. ArrayList.toArray()
  14. 用“牛顿迭代法”求根号2的近似值
  15. js的exports
  16. 行人重识别(ReID) ——技术实现及应用场景
  17. Oracle删除数据后恢复
  18. 【HTML + CSS】如何引入icon图标
  19. 基于haar特征的adaboost算法_目标检测算法介绍
  20. 逐步实现一个简易的飞机大战(c++)

热门文章

  1. tan和cot的梗_“sin对cos说 我们今晚是tan呢?还是cot呢?”啥意思
  2. 远程服务器键盘变成快捷键?
  3. 【python实现网络爬虫21】天眼查企业数据获取
  4. python爬取天眼查存入excel表格_python爬取企查查江苏企业信息生成excel表格
  5. 8052单片机英文缩写参考全称
  6. 怎么看cpu的好坏 图文告诉你电脑cpu怎么看
  7. 常用的网络进行广告推广的落实措施都有哪些渠道呢
  8. 电脑总是弹出广告弹窗怎么办?
  9. luogu P2381 圆圆舞蹈
  10. matlab sor解线性方程组,解线性方程组的SOR迭代法及其MATLAB实现.pdf