curl实现避开验证码模拟登入 抓取网站网页内容
在实际的生产当中我们如果没有特殊的需求可能不会做出一个模拟登入抓取内容的这个动作;
最近在工作中发现一个我们可以用curl 去模拟登入一个网站 去抓取内容 当然我们可以避开cookie 验证码 去做操作;
写下来直接说那个网站 去抓取内容吧,流程以及代码吧!
当我们在因为我们在登入网站的时候 验证码是第一关 当然我们可以完全避开 那说一下流程吧
第一步 我们要获取一个验证码,以文件的形式保存,把这个验证码提交给 第三方 让他们帮我们去完成读验证这个动作 有这样的网站 可以查一下;
在这一步一定要注意,cookie一定要可以设置 因为如果前期不设置后期post请求 不管怎么请求 你的验证码肯定是错的;还有在我们获取验证码的时候
是以文件流的形式去获取,还有curl的timeout时间一定要设置一个合适的时间;
看着一步的代码!
function getcheck($url, $file, $cookie){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 100);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //当需要访问https网站的时候一定要避开证书的验证
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, TRUE); //当需要访问https网站的时候一定要避开证书的验证
//设置Cookie信息保存在指定的文件中
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
//读取cookie
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);
$fp = fopen($file, "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
return $file;
}
$url = '目标网站的验证码地址';
$file = FILE_PATH . '/'. 'file_name.png';
$cookie = FILE_PATH . '/'. 'cookie.text';
这是后调用就可以获取 验证码了 保存的路径为 $file的路径
第二步
这一步就不写了 我们需要根据第三方的sdk文件 发起读取验证码的请求 返回给我们一个 验证码数据
第三部
function login_post_https($url, $cookie, $arr) {
$curl = curl_init();//初始化curl模块
//curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//当需要访问https网站的时候一定要避开证书的验证
// curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);//当需要访问https网站的时候一定要避开证书的验证
curl_setopt($curl, CURLOPT_URL, $url);//登录提交的地址
curl_setopt($curl, CURLOPT_HEADER, 0);//是否显示头信息
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//是否自动显示返回的信息
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); //设置Cookie信息保存在指定的文件中
curl_setopt($curl, CURLOPT_POST, 1);//post方式提交
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie); //读取cookie
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($arr));//要提交的信息
$ok = curl_exec($curl); // 执行url
curl_close($curl);//关闭cURL资源,并且释放系统资源
return $ok;
}
$arr 这个变量就是我们post提交的post数据 我们在组织的的时候我们就可以根据第二步返回的数据 加到这个数组中
第四步 就是最后的获得数据的方式了 方法了 这个方法在执行的时候我们可以根据 自身情况去设置是否避开ssl证书验证
function get_data_https($url, $cookie) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //读取cookie
$rs = curl_exec($ch); //执行cURL抓取页面内容
curl_close($ch);
return $rs;
}
这样我们就可以得到我们想要抓取的数据了 最后的get_data_https()这个方法 的返回值是 一个页面 我们需要用正则去进行匹配
最近在工作中发现一个我们可以用curl 去模拟登入一个网站 去抓取内容 当然我们可以避开cookie 验证码 去做操作;
写下来直接说那个网站 去抓取内容吧,流程以及代码吧!
当我们在因为我们在登入网站的时候 验证码是第一关 当然我们可以完全避开 那说一下流程吧
第一步 我们要获取一个验证码,以文件的形式保存,把这个验证码提交给 第三方 让他们帮我们去完成读验证这个动作 有这样的网站 可以查一下;
在这一步一定要注意,cookie一定要可以设置 因为如果前期不设置后期post请求 不管怎么请求 你的验证码肯定是错的;还有在我们获取验证码的时候
是以文件流的形式去获取,还有curl的timeout时间一定要设置一个合适的时间;
看着一步的代码!
function getcheck($url, $file, $cookie){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 100);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //当需要访问https网站的时候一定要避开证书的验证
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, TRUE); //当需要访问https网站的时候一定要避开证书的验证
//设置Cookie信息保存在指定的文件中
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
//读取cookie
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);
$fp = fopen($file, "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);
return $file;
}
$url = '目标网站的验证码地址';
$file = FILE_PATH . '/'. 'file_name.png';
$cookie = FILE_PATH . '/'. 'cookie.text';
这是后调用就可以获取 验证码了 保存的路径为 $file的路径
第二步
这一步就不写了 我们需要根据第三方的sdk文件 发起读取验证码的请求 返回给我们一个 验证码数据
第三部
function login_post_https($url, $cookie, $arr) {
$curl = curl_init();//初始化curl模块
//curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//当需要访问https网站的时候一定要避开证书的验证
// curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);//当需要访问https网站的时候一定要避开证书的验证
curl_setopt($curl, CURLOPT_URL, $url);//登录提交的地址
curl_setopt($curl, CURLOPT_HEADER, 0);//是否显示头信息
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//是否自动显示返回的信息
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); //设置Cookie信息保存在指定的文件中
curl_setopt($curl, CURLOPT_POST, 1);//post方式提交
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie); //读取cookie
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($arr));//要提交的信息
$ok = curl_exec($curl); // 执行url
curl_close($curl);//关闭cURL资源,并且释放系统资源
return $ok;
}
$arr 这个变量就是我们post提交的post数据 我们在组织的的时候我们就可以根据第二步返回的数据 加到这个数组中
第四步 就是最后的获得数据的方式了 方法了 这个方法在执行的时候我们可以根据 自身情况去设置是否避开ssl证书验证
function get_data_https($url, $cookie) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //读取cookie
$rs = curl_exec($ch); //执行cURL抓取页面内容
curl_close($ch);
return $rs;
}
这样我们就可以得到我们想要抓取的数据了 最后的get_data_https()这个方法 的返回值是 一个页面 我们需要用正则去进行匹配