无聊刷校会智慧之星题库

    前一段时间还是比较空的,不像最近被某些事情压得比较累,所以无聊就刷了下校邮汇的智慧之星题库.

    说来也是应实验室的XKS要求.废话不说了.

    题库网址为www.xyhui.com,登录名“学号@mysuda.com”,初始密码为111111

    首先,基本上可以到校邮汇的网站上进行登录,,然后就可以看到智慧之星的题目了:

    点击查看原图

 

    很漂亮的界面,一开始以为是提交的表单到服务器进行判断,然后将你的答题结果输出,结果抓了半天包也没有发现传出的包= =,于是我开始看他的网页源代码….然后就石化了…

    点击查看原图

    各位…所有的答案都在页面里…..只是通过一个JS进行判断…..于是乎人生观彻底崩塌,于是乎,抓取题库变得易如反掌.

    这边写这个程序需要使用Apache的httpclient4.0库,不知道的自己百度一下就知道了.

    首先,需要进行模拟登录,这一段的代码如下:   

httpClient = new DefaultHttpClient();
Login_Post = new HttpPost("http://xyhui.com/index.php?app=wap&mod=Public&act=doLogin");
List<NameValuePair> nvps = new ArrayList();  
nvps.add(new BasicNameValuePair("email", "*******@mysuda.com"));  
nvps.add(new BasicNameValuePair("password", "111111"));  
nvps.add(new BasicNameValuePair("remember", "1"));
Login_Post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
response = httpClient.execute(Login_Post);  
Login_Post.abort();

    然后就是判断是否是登录成功了,这边就不说了.接着就是进入该答题页面:

HttpGet Test_Get = new HttpGet("http://xyhui.com/index.php?app=exercise&mod=Index&act=go");
ResponseHandler<String> responseHandler = new BasicResponseHandler();  
String responseBody = "";  
responseBody = httpClient.execute(Test_Get, responseHandler); 

    这样,我们的httpclient就进入了答题的页面了,然后该页面的所有代码都在responsebody中了,接下来就是对内容进行判断,这边使用正则表达试会比较方便,这边只要将代码以特定字符分开,然后进入单个的题目进行正则判断,比如:

pattern = Pattern.compile("(class=\"exam_list_answer\">)(.+?)(</div>)");
matcher = pattern.matcher(string);
if(matcher.find()) {
	system.out.println(matcher.group(2));
	tmpKey += matcher.group(2);
}

  这样,答案就出来了,题目也是差不多的方法,是不是很简单? 确实很简单- -.

  但是每次都要找到不同的题目,那就很烦了.因为你需要不停的进行判断.所以,我们学习了关系型数据库,只要我们把题目设置为主键,然后,数据库就会做类似找错吴的工作了.

这边的代码就补贴出来了.

    一切准备就绪之后,一个大的while(true)循环,然后默默地泡杯咖啡,看着终端的输出,然后到总题目数到1671,默默的上一张图:

    点击查看原图

    然后,删除数据库,什么也不知道.

    完整代码在学校智慧之星决赛结束之后发上来.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.