如题:
登录地址: http://218.200.160.103:8080/CMS4-IMPORT/login.do我要在LINUX下定CRONTAB任务,实现完全自动登录抓取数据,验证码是需要自动提取且自动输入的(不是在页面手动输入验证码),请问这样的自动登录如何实现?很急,大家帮看看,谢谢!
登录地址: http://218.200.160.103:8080/CMS4-IMPORT/login.do我要在LINUX下定CRONTAB任务,实现完全自动登录抓取数据,验证码是需要自动提取且自动输入的(不是在页面手动输入验证码),请问这样的自动登录如何实现?很急,大家帮看看,谢谢!
估计你是弄不了的
你的验证码其实并不简单,简单的php来识别是不太可能了。
http://blog.csdn.net/ugg/article/details/3972368
这种中级识别也是无法识别你的那种。
LINUX下,PHP可以实现吗?
做原理性学习还可以,无使用价值要善于借助他人的成果,这就是所谓:站在巨人的肩上
普通的PHP模拟登录方法不行吗?弄这么复杂,无从下手 :(
$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>";
异常类型 未捕获异常
异常信息 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)
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>
模拟登录地址: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