zoukankan      html  css  js  c++  java
  • 利用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

  • 相关阅读:
    CDOJ 1059 秋实大哥与小朋友 STL(set)+离散化+BIT区间更新单点查询
    hdu 1754 线段树 水题 单点更新 区间查询
    ZOJ 2301 离散化
    hdu 1166 线段树 区间求和 +单点更新 CD模板
    UVA 12299 线段树 ( 单点跟新 , 区间查询)
    TTTTTTTTTTTTT LA 2191 树状数组 稍修改
    TTTTTTTTTTT LA 4329 BIT模版
    POJ 1912 凸包
    对django模型中的objects的理解
    巨蟒python全栈开发django4:url反向解析图解&&模板渲染2
  • 原文地址:https://www.cnblogs.com/linkarl/p/4747274.html
Copyright © 2011-2022 走看看