以前用python做过模拟登录。首先,爬取登录页面html,保持会话;使用xpath或正则匹配获取验证码图片url,将图片保存在本地,利用python第三方图像库将验证码图片显示出来,然后手动输入验证码,再将登录数据post,就可以登录成功了。
这个就是验证一下是机器还是人的交互
请问大概是怎么解决的?我也遇到这种问题,不知道怎么入手解决
不是要自己设置 cookie的具体内容,是要设置 cookie 的存储和读取的文件名
这是一个php接口哦,因为执行失败了,所以没有页面输出,在登录之后 抓取页面之前也有一个页面 可以输出那个页面看看 对应的json数据,
//在HTTP请求中包含一个”user-agent”头的字符串
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
加上这句话就可以了!!
多传了个 验证码,对比服务器验证码。
或者通过 Ajax 先提交验证码验证是否正确。
<?php
/**
* 慕课网视频教学
* 代码实例-PHP-cURL实战
* 实例描述:登录慕课网并下载个人空间页面
*/
$data='email=账号&password=密码&remember=1';
$curlobj = curl_init(); // 初始化
curl_setopt($curlobj, CURLOPT_URL, "http://www.imooc.com/"); // 设置访问网页的URL
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true); // 执行之后不直接打印出来
// Cookie相关设置,这部分设置需要在所有会话开始之前设置
date_default_timezone_set('PRC'); // 使用Cookie时,必须先设置时区
curl_setopt($curlobj, CURLOPT_SSL_VERIFYPEER, FALSE); //不使用认证
curl_setopt($curlobj, CURLOPT_SSL_VERIFYHOST, FALSE); //不使用认证
curl_setopt($curlobj, CURLOPT_COOKIESESSION, TRUE);
curl_setopt($curlobj, CURLOPT_HEADER, 0);
curl_setopt($curlobj, CURLOPT_FOLLOWLOCATION, 1); // 这样能够让cURL支持页面链接跳转
curl_setopt($curlobj, CURLOPT_COOKIEFILE, 'cookiefile');
curl_setopt($curlobj, CURLOPT_COOKIEJAR, 'cookiefile');
curl_setopt($curlobj, CURLOPT_COOKIE, session_name() . '=' . session_id());
curl_setopt($curlobj, CURLOPT_POST, 1);
curl_setopt($curlobj, CURLOPT_POSTFIELDS, $data);
curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded; charset=utf-8",
"Content-length: ".strlen($data)
));
$d = curl_exec($curlobj);
curl_setopt($curlobj, CURLOPT_URL, "你想要的页面");
curl_setopt($curlobj, CURLOPT_POST, 0);
curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("Content-type: text/xml"
));
$output=curl_exec($curlobj); // 执行
curl_close($curlobj); // 关闭cURL
echo $output;
?>
curl_setopt($curl,CURLOPT_COOKIE,session_name().'='.session_id());
。。。bug???
可以 的
你打印的是一个本地文件,是静态的,页面头部应该是使用了某种跟后台的交互,所以没有显示登陆
cnzz的用户名和密码字段名应该不是username和password,去百度一下就知道字段名是什么了
最后两句调换位置
我从来不设置Content-leng,并且也可以正常执行代码。实践出真知,不必纠结。
ajax处理,将需要提交的数据获取并提交给后台,后台处理这个数据。设置CURLOPT_HTTPHEADER头部信息发送给原来站点的地址,直接送上代码
/** * 模拟登录 * @param string $url 请求的登录url * @param [type] $cookie cookie名称 此处必须使用绝对路径 * @param string $data 发送的字段 * @return string */ function login_get($url,$cookie,$data = "") { $curlobj = curl_init();// 初始化 curl_setopt($curlobj, CURLOPT_URL, $url);// 设置访问网页的URL curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true);// 执行之后不直接打印出来 curl_setopt($curlobj, CURLOPT_TIMEOUT, 300); date_default_timezone_set('PRC'); // 使用Cookie时,必须先设置时区 curl_setopt($curlobj, CURLOPT_COOKIESESSION, TRUE); curl_setopt($curlobj, CURLOPT_COOKIEJAR, $cookie); //连接时把获得的cookie存为文件 curl_setopt($curlobj, CURLOPT_COOKIE, session_name().'='.session_id()); curl_setopt($curlobj, CURLOPT_HEADER, 0); curl_setopt($curlobj, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curlobj, CURLOPT_POST, 1); curl_setopt($curlobj, CURLOPT_POSTFIELDS, $data); curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded; charset=utf-8", "Content-length: ".strlen($data) )); $rs = curl_exec($curlobj);//执行 curl_close($curlobj); return $rs; } /** * 获取url页的内容 * @param string $url 需要获取内容页面的URl * @param [type] $cookie cookie名称 * @return string */ function get_content($url, $cookie,$data ="") { $curlobj = curl_init(); curl_setopt($curlobj, CURLOPT_URL, $url); curl_setopt($curlobj, CURLOPT_HEADER, 0); curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true); curl_setopt($curlobj, CURLOPT_TIMEOUT, 300); date_default_timezone_set('PRC'); // 使用Cookie时,必须先设置时区 curl_setopt($curlobj, CURLOPT_COOKIEFILE, $cookie); //读取cookie curl_setopt($curlobj, CURLOPT_POST, 1); curl_setopt($curlobj, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curlobj, CURLOPT_POSTFIELDS, $data); curl_setopt($curlobj, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded; charset=utf-8", "Content-length: ".strlen($data) )); $rs = curl_redir_exec($curlobj); //执行cURL抓取页面内容 curl_close($curlobj); return $rs; }
这是很正常的啦 设置了防爬
这个登录页面和查看个人主页的页面都改了。。
你可以抓包啊
貌似破不了,除非你先把验证码也搞到了一起传过去;
http://bbs.csdn.net/topics/390938652
参看这个吧,里面有你想要的答案!
你好,尝试在PHP程序中加入如下代码:sleep(10),暂停10秒,然后继续执行下面的脚本代码。
下载的代码里面少了这几行
大哥,你的账号和密码都出来了,好歹打个马赛克啊。第11行的数据和前面的数据重了,删掉试试,结果是可以出来的,刚刚试成功了
用浏览器开发者工具抓包,发现向哪些网页发送信息
看看是不是第18行下面少了3行代码:
curl_setopt($curlobj, CURLOPT_COOKIEFILE, 'cookiefile');
curl_setopt($curlobj, CURLOPT_COOKIEJAR, 'cookiefile');
curl_setopt($curlobj, CURLOPT_COOKIE, session_name() . '=' . session_id());