需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下!

<?php
namespace Home\Controller;
use Think\Controller;
class LoginController extends Controller
{
protected $cookieName = array('cookie_verify', 'cookie_verify');
protected $cookiePath = '/cookie/';
protected $cookiePathFile = array();
public function index()
{
$this->display();
}
public function _initialize(){
foreach($this->cookieName as $key => $name)
{
$this->cookiePathFile[] = ROOT_PATH . $this->cookiePath . $this->cookieName[$key] . '_xxx.txt';
}
} /**
* 登录xxx
*/
public function pc28Login()
{
$username = I('username');
$password = I('password');
$verifyCode = I('verify');
$loginData = array(
'__VIEWSTATE' => '/wEPDwUKMTU0MzAzOTU4NmQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFDExvZ2luX1N1Ym1pdL/yae69NsY163G3yuP0lxjz8oXu', //不把参数补全可能会不被响应哦
'__VIEWSTATEGENERATOR' => 'DC42DE27',
'txt_UserName' => $username,
'txt_PWD' => $password,
'txt_VerifyCode' => $verifyCode,
'SMONEY' => 'ABC',
'Login_Submit.x' => '52',
'Login_Submit.y' => '19',
);
$getBack = $this->_cookieRequest('http:///noLogin.aspx', $loginData, false, true);
if(preg_match('/<div[^\<div]*?id\s*=\s*[\'\"]{1}div_msg[\'\"]{1}.*?>(.*?)<\/div>/s', $getBack, $match)){
echo 'matched\r\n';
print_r($match);
}else{
echo $getBack, '<br />';
$paramsFull = parse_url($getBack);
parse_str($paramsFull['query'], $paramsFull['parsedQuery']);
if(!empty($paramsFull['parsedQuery']['Warn'])) {
$msg = "您好,欢迎来P,请先登录。";
switch ($paramsFull['parsedQuery']['Warn'])
{
case '2':
$msg = '您输入的验证码错误,请重试';
break;
case '3':
$msg = '该帐号不存在,还没帐号?';
break;
case '5':
$msg = '账户已注销';
break;
case '6':
$msg = '密码错误,如果连续错误3次半小时内不能登录!';
break;
case '20':
$msg = '今日密码错误3次及以上,请于半小时后再来登录!';
break;
case '21':
$msg = '今日您所在IP的所有帐号密码错误9次以上,请于半小时后再来登录!';
break;
case '22':
$msg = '登录失败,您所在IP今日登录的帐号过多!';
break;
case '23':
$msg = '登录失败,验证码失效!';
break;
case '32':
$msg = '该帐号已经绑定其他xx帐号!';
break;
case '33':
$msg = '一台电脑一天只能注册一个帐号!';
break;
}
$this->error($msg, '', 5);
}else{ $_SESSION['user_id'] = '123456'; //登录设置session
$this->success('登录P网站成功', U('Index/index'), 5);
}
}
} /**
* 获取验证码
*/
public function getVerifyCode()
{
$img = $this->_cookieRequest('http:///VerifyCode_Login.aspx?id=' . rand(10000,999999), null, true, 1);
echo $img;
} /**
* 删除cookie
*/
public function clearCookie()
{
for($i = 0; $i <count($this->cookieName); $i++)
{
setcookie($this->cookieName[$i], '', time() - 3600);
}
// unlink($this->cookiePathFile);
$this->success('清除cookie成功!');
} /**
* 带COOKIE的访问curl
* @param $url 访问地址
* @param bool|array $data 传递的数据
* @param bool $redirect 是否获取重定向的地址
* @param bool $isLogin 是否为登录,登录需要保存COOKIE
* @return mixed 地址或者返回内容
*/
public function _cookieRequest($url, $data = null, $redirect = false, $isLogin = false, $cookieNum = 0)
{ $ch = curl_init();
$params[CURLOPT_URL] = $url; //请求url地址
$params[CURLOPT_HEADER] = false; //是否返回响应头信息
$params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
$params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
$params[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1'; if($data)
{
$params[CURLOPT_POST] = true;
$params[CURLOPT_POSTFIELDS] = http_build_query($data);
}
//判断是否有cookie,有的话直接使用
if (!empty($_COOKIE[$this->cookieName[$cookieNum]]) && is_file($this->cookiePathFile[$cookieNum]))
{
$params[CURLOPT_COOKIEFILE] = $this->cookiePathFile[$cookieNum]; //这里判断cookie if($isLogin)
{
$params[CURLOPT_COOKIEJAR] = $this->cookiePathFile[$cookieNum]; //写入cookie信息,可能每次都会有写入
}
}
else
{
// $cookie_jar = tempnam($cookie_path, 'cookie');     //产生一个cookie文件
$params[CURLOPT_COOKIEJAR] = $this->cookiePathFile[$cookieNum]; //写入cookie信息
setcookie($this->cookieName[$cookieNum], $this->cookiePathFile[$cookieNum], time() + 120); //保存cookie路径
}
curl_setopt_array($ch, $params); //传入curl参数
$content = curl_exec($ch);
$headers = curl_getinfo($ch);
// echo $content;
curl_close($ch);
if ($url != $headers["url"] && $redirect == false)
{
return $headers["url"];
}
return $content;
}
}

  登录以后,就可以使用带cookie的访问其他页面了!

  

php使用curl模拟登录带验证码的网站的更多相关文章

  1. php使用curl模拟登录带验证码的网站[开发篇]

    需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...

  2. [PHP自动化-进阶]002.CURL模拟登录带有验证码的网站

    引言:继前文<模拟登录并采集数据>,大家似乎看不过瘾,这会再出一发,模拟实现带验证码网站的登录. 这篇文章主要介绍了PHP使用CURL实现对带有验证码的网站进行模拟登录的方法,可以帮助读者 ...

  3. Java模拟登录带验证码的教务系统(原理详解)

    一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...

  4. C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站

    原文:C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站 我们经常会碰到需要程序模拟登录一个网站,那如果网站需要填写验证码的要怎样模拟登录呢?这篇文章 ...

  5. 使用C#登录带验证码的网站

    我在上一篇文章中已经讲解了一般网站的登录原来和C#的登录实现,很多人问到对于使用了验证码的网站该怎么办,这里我就讲讲验证码的原理和对应的登录方法.验证码的由来几年前,大部分网站.论坛之类的是没有验证码 ...

  6. Python爬虫模拟登录带验证码网站

    问题分析: 1.爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 2.首先得明白 ...

  7. php_curl模拟登录有验证码实例

    <?php/** * @author 追逐__something * @version $id */define('SCRIPT_ROOT',dirname(__FILE__).'/');$ac ...

  8. (转)php_curl模拟登录有验证码实例

    三年来的第一篇博客,还记得那是一个夜深人静的夜晚, 独自一人坐在不到10平米的小屋里,指头迅速的敲打着键盘,这天真TMD热.BJ生活啊. 唉! 最近一直在参加一个论坛批量发帖的项目开发. 模拟登录,模 ...

  9. php curl模拟登录(半转载)

    参考:http://our2848884.blog.163.com/blog/static/146854834201282039334/   php curl模拟登录 参考:http://blog.c ...

随机推荐

  1. JS运行在服务器端注意事项

    <script runat="server" language="javascript"> </script> 1. ASP利于JS重载 ...

  2. Web负载均衡技术

    Web负载均衡(Load Balancing),简单地说就是给我们的服务器集群分配“工作任务”,而采用恰当的分配方式,对于保护处于后端的Web服务器来说,非常重要. 负载均衡的策略有很多,我们从简单的 ...

  3. 更换ubuntu软件源的方法

    第一步:查看本系统Codename 输入lsb_release -a查看本系统Codename,我的codename是bionic,如图: 第二步:搜索与codename对应的镜像地址 我搜索到的是: ...

  4. python第一天(安装运行python)

    1. 安装Python 3.7 目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的.由于3.x版越来越普及,我们的教程将以最新的Python 3.7版本为基础.请确保你 ...

  5. CCS Font 知识整理总结

    总是搞不懂 CCS 中如何正确的使用字体,这下明白了. 1.什么是 font-face font-face 顾名思义,就是文字的脸.字体是文字的外在形式,就是文字的风格,是文字的外衣.比如行书.楷书. ...

  6. 打包成exe程序

    https://blog.csdn.net/harvic880925/article/details/27675073 当然针对这种exe文件,也可以解压出来得到具体的debug文件夹下的内容.

  7. beta版本冲刺三

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  8. 【Android入门】——模拟器的创建及常见问题汇总

    [前言] 刚刚接触Android,第一门课我们就来创建一个模拟器.安卓模拟器,简称AVD(Android Virtual Device),是安卓运行的虚拟设备.有了他以后,我们就不需要在连着安卓手机进 ...

  9. [Elasticsearch] 多字段搜索 (三) - multi_match查询和多数字段

    multi_match查询 multi_match查询提供了一个简便的方法用来对多个字段执行相同的查询. NOTE 存在几种类型的multi_match查询,其中的3种正好和在"了解你的数据 ...

  10. Storm之详解spout、blot

    1.Topology的构造backtype.storm.topology.TopologyBuilder 2.Spout组件的编写实现接口 backtype.storm.topology.IRichS ...