|
吾爱游客
发表于 2015-3-29 20:44
1、申 请 I D : jason19659
2、个人邮箱:jason19659@163.com
3、原创技术文章:httpclient以及jsoup的初级应用,抓课表前一阵要做微信平台,要回复课表并绑定帐号之后就可以回复今天的课表.也就是查课表功能.由于我们学校用的是青果教务系统(大部分学校都是这个)最后的过程如下,写的不好请见谅.
首先,登录教务系统并抓取数据
我的学校的教务系统是这样的.用chrome F12的network抓数据
之后使用httpclient发送请求模拟登录
Java代码
- String result = ""; //结果页面
- System.out.println("========================");
- List<Cookie> cookies = null; // 保存获取的cookie
- HttpClient client = new DefaultHttpClient();
- HttpClient clientGet = new DefaultHttpClient();
- HttpResponse httpResponse = null;
- String uriAPI = "教务系统登录请求发送的网址";
- HttpPost httpRequest = new HttpPost(uriAPI);
- HttpGet httpRequestGet = new HttpGet("教务系统网址");
- HttpResponse httpResponseGet = clientGet.execute(httpRequestGet);
- httpResponseGet.getAllHeaders();
- CookieStore cookieStore = ((AbstractHttpClient) clientGet).getCookieStore();
- cookies = cookieStore.getCookies();
我的代码可能有点臃肿,我是这样拿到了cookie.
之后把header和请求头信息\原封不动的写下来
然后
httpResponse = client.execute(httpRequest); 执行请求
用了一段别人封装好的代码 抓去源码
Java代码
- private static String showResult(HttpResponse h) throws IllegalStateException, IOException {
- StringBuffer sb = new StringBuffer();
- HttpEntity entity = h.getEntity();
- InputStream is = entity.getContent();
- BufferedReader br = new BufferedReader(new InputStreamReader(
- is, "GB2312"));
- String data = "";
- while ((data = br.readLine()) != null) {
- sb.append(data);
- }
- return sb.toString();
- }
并且用同样的方法抓取查课表发送的数据
发现请求地址如下../jwweb/znpk/Pri_StuSel_rpt.aspx
IDA Console, monospace">发送的数据如下
- Sel_XNXQ:
20130 - rad:
1 - px:
0 - 这个数据Sel_XNXQ: 学年+学期(0,1,2)
- rad是课表的格式
- 因为我们学校是3个学期
然后按照上面的方法发送请求
Java代码
- params2.add(new BasicNameValuePair("rad", "0"));
- params2.add(new BasicNameValuePair("px", "0"));
- params2.add(new BasicNameValuePair("Sel_XNXQ", "20130"));
这里只写了数据
抓到后的源代码是这样的
整理之后 发现我们需要的是第4个table里面的tr标签然后提取出需要里面的td里有valign=top的就可以了
所以我写了一个处理的方法
Java代码
- private static Elements dealCurriculumHTMLPrivate(String html) {
- html = html.replace("<br>", "");
- Document doc = Jsoup.parse(html);
- Element link = doc.select("table").get(3);
- Elements linksTRs = link.getElementsByTag("tr");
- return linksTRs;
- }
- /**
- * 批量处理课表页面到友好格式
- *
- * @param html
- * html源码
- * @return 处理好的文本
- */
- public static String dealCurriculumHTML(String html) {
- Elements linksTRs = dealCurriculumHTMLPrivate(html);
- return linksTRs.select("td[valign=top]").html().trim();
- }
这样处理之后就拿到了 文本的课表
封装之后..最后抓到的数据就是这样的了
[52001CC166]软件测试技术康玲[1-2,4-16周]二[3-4节]教学楼A7-217[74005CC165]实用英语口语(一)Nady[1-2,4-16周]二[5-6节]教学楼A6-427[74005CC163]实用英语(三)张春艳[1-2,4-7,9-16周]二[7-8节]教学楼A7-202-----------------------------------------------------------------------------
总结一下,新手写的大家见谅
学会最基本的抓数据 之后模拟发送数据再提取数据就可以了 总之还是非常简单的我之后把它做成了一个web项目,封装了接口,做了数据库缓存(因为我的学校的教务系统奇慢).每次先从数据库读内容,然后数据库再更新.供微信平台调用.这样实现了5秒内返回结果.--------------------------------------------有什么问题可以联系我..
|
QQ截图20140218150435.png (0 Bytes, 下载次数: 0)
另外还有一个抓视频的教程 http://www.acfun.tv/v/ac1550432
|
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|