前一段时间还是比较空的,不像最近被某些事情压得比较累,所以无聊就刷了下校邮汇的智慧之星题库.
说来也是应实验室的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,默默的上一张图:
然后,删除数据库,什么也不知道.
完整代码在学校智慧之星决赛结束之后发上来.