如题:
登录地址: http://218.200.160.103:8080/CMS4-IMPORT/login.do我要在LINUX下定CRONTAB任务,实现完全自动登录抓取数据,验证码是需要自动提取且自动输入的(不是在页面手动输入验证码),请问这样的自动登录如何实现?很急,大家帮看看,谢谢!

解决方案 »

  1.   

    核心技术见 http://www.baidu.com/baidu?word=Tesseract+for+php&ie=utf-8
    估计你是弄不了的
      

  2.   

    tesseract 是开源命令行 OCR 工具(记忆中在google code发布),详见#2 链接内文章
      

  3.   

    模拟的时候,手动输入  验证码!保存cookie 读取cookie就是登陆状态了
      

  4.   


    你的验证码其实并不简单,简单的php来识别是不太可能了。
    http://blog.csdn.net/ugg/article/details/3972368
    这种中级识别也是无法识别你的那种。
      

  5.   

    tesseract 好像得用C++?
    LINUX下,PHP可以实现吗?
      

  6.   

    php可以实现,只是运行一次至少需要5分钟左右
    做原理性学习还可以,无使用价值要善于借助他人的成果,这就是所谓:站在巨人的肩上
      

  7.   

    看tesseract 就只有安装配置,也没见有模拟登录的代码?
      

  8.   

    LINUX下配环境我都不熟,怕把服务器搞出问题了。
    普通的PHP模拟登录方法不行吗?弄这么复杂,无从下手 :(
      

  9.   

    以下是没验证码的模拟登录,加验证码的话应该怎么做呢?怎么能把验证码自动抓取下来提交?Function Curl($url,$postfields,$referer='',$cookie_jar='/test/cookie.txt'){
    $Cur = curl_init();
    $Opt = Array(
    CURLOPT_URL => $url,
    CURLOPT_HEADER => 1, // 如果你想把一个头包含在输出中,设置这个选项为一个非零值。
    CURLOPT_NOBODY => 1, //如果你不想在输出中包含body部分,设置这个选项为一个非零值。
    CURLOPT_PORT => 80, //端口
    CURLOPT_POST => 1, //发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。
    CURLOPT_POSTFIELDS => $postfields,//要传送的所有数据,如果要传送一个文件,需要一个@开头的文件名
    CURLOPT_RETURNTRANSFER => 1,// 获取的信息以文件流的形式返回,而不是直接输出。 CURLOPT_SSL_VERIFYHOST => 1,// 从证书中检查SSL加密算法是否存在
    CURLOPT_SSL_VERIFYPEER => 0,// 对认证证书来源的检查,0表示阻止对证书的合法性的检查。
    //CURLOPT_COOKIE => GetCook($url), //在当面的会话中设置一个cookie
    //CURLOPT_USERAGENT => "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)",//模拟用户使用的浏览器,在HTTP请求中包含一个"user-agent"头的字符串。
    CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1',
    CURLOPT_FOLLOWLOCATION => 1, //使用自动跳转
    CURLOPT_COOKIEJAR => Dirname(__FILE__).$cookie_jar, //当会话结束的时候保存一个Cookie
    CURLOPT_COOKIEFILE => Dirname(__FILE__).$cookie_jar, //Cookie的文件,同时发送Cookie  
    CURLOPT_REFERER => $referer, //在HTTP请求中包含一个”referer”头的字符串。
        );
    curl_setopt_array($Cur,$Opt);
    $code = curl_exec($Cur);
    curl_close($Cur);
    unSet($Cur);
    Return $code;
    }$url = "http://218.200.160.103:8080/CMS4-IMPORT/login.do";
    $postfields='name=username&password=pwd&rand=验证码需要自动抓取到,目前还差实现这步';$a=Curl($url,$postfields);
    unset($postfields,$url);
    echo "<textarea style='width:100%;height:200px'>",chr(10),$a,chr(10),"</textarea>";
      

  10.   

    重新写了一段模拟登录代码,执行结果如下,这是什么错误呢?(错误显示还有好多,我只列出前边一段)系统异常信息页面 
    异常类型 未捕获异常  
    异常信息 null 
    异常堆栈信息 com.huawei.imp.cms.account.web.validator.LoginFormValidator.validate(LoginFormValidator.java:50)
    com.huawei.imp.cms.account.web.controller.login.LoginController.submit(LoginController.java:103)
    sun.reflect.GeneratedMethodAccessor434.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:421)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:136)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:326)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:313)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
     
      

  11.   

    以下是上边错误信息源代码:
    define('SCRIPT_ROOT',dirname(__FILE__).'/');
    $act = trim($_REQUEST['act']);switch($act)
    {
        case 'login':
            // 获取验证码
             $code = trim($_REQUEST['code']);
            
            // $loginParams为curl模拟登录时post的参数
             $loginParams['act'] = 'login';
            $loginParams['password'] = 'pwd';
            $loginParams['username'] = 'name';
            $loginParams['vcode'] = $code;
            
            // $cookieFile 为加载验证码时保存的cookie文件名 
             $cookieFile = SCRIPT_ROOT.'cookie.tmp';
            
            // $targetUrl curl 提交的目标地址
            $targetUrl = 'http://218.200.160.103:8080/CMS4-IMPORT/login.do';
            
            // 参数重置
             $content = curlLogin($targetUrl, $cookieFile, $loginParams);
            echo $content;
        break;
        case 'authcode':
            // Content-Type 验证码的图片类型
             header('Content-Type:image/png');
            showAuthcode('http://218.200.160.103:8080/CMS4-IMPORT/randNumberImage.do');
            exit;
        break;
    }
    /**
     * 模拟登录
     * @param string $url 提交到的地址
     * @param string $cookieFile 保存cookie的文件
     * @param string $loginParams 提交时要post的参数
     * @return string $content 返回的内容
     */
    function curlLogin($url, $cookieFile, $loginParams)
    {
        $ch = curl_init($url);
        curl_setopt($ch,CURLOPT_COOKIEFILE, $cookieFile); //同时发送Cookie
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch,CURLOPT_POST, 1);
        curl_setopt($ch,CURLOPT_POSTFIELDS, $loginParams); //提交查询信息
        $content = curl_exec($ch);
        curl_close($ch);
        return $content;
    }/**
     * 加载目标网站图片验证码
     * @param string $authcode_url 目标网站验证码地址
     */
    function showAuthcode( $authcode_url )
    {
        $cookieFile = SCRIPT_ROOT.'cookie.tmp';
        $ch = curl_init($authcode_url);
        curl_setopt($ch,CURLOPT_COOKIEJAR, $cookieFile); // 把返回来的cookie信息保存在文件中
        curl_exec($ch);
        curl_close($ch);
    }
    ?>
    <iframe src="?act=authcode" style='width: 100px; height:40px ' frameborder=0 ></iframe>
    <form>
    <input type="hidden" name="act" value="login">
    <input type="text" name="code" />
    <input type="submit" name="submit" >
    </form>
      

  12.   

    模拟登录做好了,现在又有一新问题。
    模拟登录地址:http://218.200.160.103:8080/CMS4-IMPORT/login.do
    模拟登录后,抓取数据地址:http://218.200.160.103:8082/CMS4-COPM/balance/listManagement.do
    登录后该网站运用的框架,上边LOGO,左边菜单,右边为菜单对应内容。模拟登录成功后,cookie文件记录如下:
    # Netscape HTTP Cookie File
    # http://curlm.haxx.se/rfc/cookie_spec.html
    # This file was generated by libcurl! Edit at your own risk.218.200.160.103 FALSE /CMS4-IMPORT FALSE 0 JSESSIONID c42399225da81959bd11f1739c10模拟登录后抓取http://218.200.160.103:8082/CMS4-COPM/balance/listManagement.do数据,cookie文件记录如下:(抓取数据页面与登录页面记的JSESSIONID不一样)
    # Netscape HTTP Cookie File
    # http://curlm.haxx.se/rfc/cookie_spec.html
    # This file was generated by libcurl! Edit at your own risk.218.200.160.103 FALSE /CMS4-IMPORT FALSE 0 JSESSIONID c42399225da81959bd11f1739c10
    218.200.160.103 FALSE /CMS4-COPM FALSE 0 JSESSIONID c5f825717fc7a268d75934ace648
    我CURL直接:http://218.200.160.103:8080/CMS4-IMPORT/tone/list.do就没问题
    。CURL直接:http://218.200.160.103:8082/CMS4-COPM/balance/listManagement.do就不行,没带任何参数,不知道是我缺少参数还是什么问题,访问到该地址就退出到登录页。用抓包工具获取要抓取的地址如下:
       1  False    + 0.000            True   0.516 s      GET     302     452       text/html  http://218.200.160.103:8080/CMS4-IMPORT/goto.do?url=182  http://218.200.160.103:8082/CMS4-COPM/balance/listManagement.do?remote.validate.token=g%2Fx%2BuV9UDljAx2e0kyZgiBWHBLjAxKWViOG0tdhYmZKFIrEaXxvLyudKawgEM0Kb  
       2  False    + 0.516            False  0.344 s      GET     302     361       text/html  http://218.200.160.103:8082/CMS4-COPM/balance/listManagement.do?remote.validate.token=g%2Fx%2BuV9UDljAx2e0kyZgiBWHBLjAxKWViOG0tdhYmZKFIrEaXxvLyudKawgEM0Kb  http://218.200.160.103:8082/CMS4-COPM/balance/listManagement.do  
       3  False    + 0.860            True   0.719 s      GET     200     11.39 K   text/html  http://218.200.160.103:8082/CMS4-COPM/balance/listManagement.do