利用jsoup爬页面的自动答题系统
访问https网页的解决方案 http://espace.iteye.com/blog/1917574
这个比较麻烦,针对网站利用其证书 http://stackoverflow.com/questions/7744075/how-to-connect-via-https-using-jsoup
解决访问网页javascript部分
获取验证码阶段
注意点:
Jsoup,最大特点能以CSS选择器(HTML document形式)来选择内容非常方便,但是要注意它不负责管理Cookies。
不负责管理Cookies可能会造成,提交的Cookies可能不完整(需要人工保存提交),导致Response不成功。
问题描述:刚开始我不知道这点,犯了一个很大错误,我请求的是登陆页面,保存验证码,保存的Cookies是登录页面返回的(不包含验证码),
提交Cookies登陆,一直返回没有验证码的错误提示,但是我明明把验证码填写了。
刚开始我怎么都没办法解决,直到看了这文章才有点感悟 http://outofmemory.cn/code-snippet/10070/EMS
解决:我直接请求的是验证码,保存验证码Cookies,就解决了,原来是说我验证码图片没有提交。
疑问:为什么包含验证码图片Cookies也要提交给服务器?
生成验证码原理与验证原理补充,准备写一篇文章总结。
http://www.cnblogs.com/linkarl/p/4800531.html
其他方案:httpClient会管理Cookies,推荐用来模拟登陆,但是解析用正则表达式比较麻烦。
最佳:httpClient+Jsoup结合来用。
private static Map<String, String> initAuthCode() { //设置 url referrer userAgent url = ""; referrer = ""; userAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"; //create connection connection = Jsoup.connect(url).referrer(referrer).userAgent(userAgent) .timeout(3000); Response authCodeResponse; Map<String, String> authCodeCookies = new HashMap<String, String>(); try { //由于返回的ContentType不是默认的text/html。而是image/JPEG ignoreContentType authCodeResponse = connection.ignoreContentType(true).execute(); authCodeCookies = authCodeResponse.cookies(); //cookies的内容(图片)转成byte[] byte[] image = authCodeResponse.bodyAsBytes(); //保存圖片 savePic(image); String JSESSIONID = authCodeCookies.get("JSESSIONID"); System.out.println(JSESSIONID); Scanner scanner = new Scanner(System.in); authCode = scanner.nextLine(); } catch (IOException e) { e.printStackTrace(); } return authCodeCookies; }
模拟登陆阶段
技巧:故意填错验证码,找到登录提交链接。
最后response,USERTICKET(用户门票),用着这个userTicket作为请求资源的门票。
但这个网站做的不是很安全,这个userTicket是静态的,被人盗取userTicket后可以一直用这个来进行资源请求,
应该数据库设置一个更新时间,过一段时间更新userTicket。
或者是在生成算法中加入账号+时间变量。
常见验证码的弱点与验证码识别
http://drops.wooyun.org/tips/141