场景:检测网站是否安装了某段代码
用curl抓首页代码进行分析,一般http网址是没问题,但有些网站做了http自动跳转到https的设置,这时去抓就会返回301或302之类的错误,并不能抓到首页代码
https有些网站是需要带User-Agent及cookie才能抓到的,那要如何去获得cookie呢;经过一段时间折腾,最终实现,思路:
先curl请求一次取得cookie,然后再将第一次获得的cookie弄出来,将这个cookie放在header中再请求一次就可以了;
第一次用的:get_headers去取cookie在windows环境下可以,放到线上不行,后来就改用curl了
//头处理
$header = [
'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding:gzip, deflate, br',
'Accept-Language:zh-CN,zh;q=0.9',
];
//http
$output = $this->_webCurl($domain, $header);
if ($output) {
if (preg_match_all($str, $output) >= 1) {
$result = 1;
}
}
//https
if (!$result) {
//头处理-linux环境失败
// $headerArr = get_headers($httpsDomain, 1);
// if (!$headerArr) {
// responseError(600, '请求失败,请重试');
// }
// if ($headerArr && isset($headerArr['Set-Cookie'])) {
// if (is_array($headerArr['Set-Cookie'])) {
// $cookie = $headerArr['Set-Cookie'][0];
// } else {
// $cookie = $headerArr['Set-Cookie'];
// }
// } else {
// $cookie = '';
// }
$content = $this->_webCurl($httpsDomain, $header, 1);
$pattern = '/Set-Cookie: .+/';
preg_match($pattern, $content, $matches);
if (isset($matches[0])) {
$cookie = substr($matches[0], 12);
} else {
$cookie = '';
}
array_push($header, "Cookie:$cookie");
$output = $this->_webCurl1($httpsDomain, [], '', $cookie);
if ($output) {
if (preg_match_all($str, $output) >= 1) {
$result = 1;//表示已安装代码,原创不易,转载就保留http://www.hu-rong.com
}
}
}
/**
* 专门抓站点代码用的
*
* @param string $url 完整的url
* @param $header
* @param int $responseHeader 是否输出header信息
* @return bool|string
*/
private function _webCurl($url, $header, $responseHeader = 0)
{
$curl = curl_init();
// 设置选项,包括URL
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, $responseHeader);//是否输出header信息
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在
//curl_setopt($curl, CURLOPT_HTTPHEADER, $header);这种测试居然不行,改成下面这行
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip, deflate'));
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate,br');//解析gzip,deflate内容
//curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3608.4 Safari/537.36');
// 执行并获取HTML文档内容
$output = curl_exec($curl);
if ($output === FALSE) {
//echo "CURL Error:" . curl_error($curl);
}
// 4释放curl句柄
curl_close($curl);
return $output;
}
上述方法在某些情况下还是会失败,最近优化的
$content = $this->_webCurl($httpsDomain, $header, 1); $pattern = '/Set-Cookie: .+/'; preg_match($pattern, $content, $matches); if (isset($matches[0])) { $cookie = substr($matches[0], 12); } else { $cookie = ''; } $output=$this->_webCurl1($httpsDomain,[],'',$cookie); private function _webCurl1($url, $data, $ref, $cookie) { // 模拟提交数据函数 $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 curl_setopt($curl, CURLOPT_REFERER, $ref); curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包 curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie); // 读取上面所储存的Cookie信息 curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); // 存放Cookie信息的文件名称 curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip, deflate')); curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 $tmpInfo = curl_exec($curl); // 执行操作 if (curl_errno($curl)) { echo 'Errno' . curl_error($curl); } curl_close($curl); // 关键CURL会话 return $tmpInfo; // 返回数据 }
- 相关文章
- phpexcel设置行高及列宽,背景颜色,
- 单点登录sso原理及php实现方式及de
- 在php中用curl请求java接口无法获
- 免费ip地址查询接口
- php,java,android, aes加解密-加密
- 地图上计算两点间的距离
- 关于百度地图的一些技巧
- php中empty,is_null,isset的区别
- windows及linux下composer安装教程
- 一种精妙的数据查询与存储方式
- 热门文章
- win7中将文件拷贝到虚拟机linux下
- phpexcel设置行高及列宽,背景颜色,
- rabbitmq无法启动
- intellij idea不显示git push按钮
- php7中使用mongodb的aggregate进行
- laravel页面静态化的方法
- centos7.4 64位下swoole安装及配置
- navicate连接mycat报1184错误
- curl设置超时不起作用(CURLOPT_TIM
- devops-jenkins容器为pending状态
- 好评文章
- phpexcel设置行高及列宽,背景颜色,
- php7中使用mongodb的aggregate进行
- intellij idea打开文件所在文件夹
- windows下使用MongoDB Compass Com
- win7中将文件拷贝到虚拟机linux下
- laravel 中悲观锁 & 乐观锁的使用
- 单点登录sso原理及php实现方式及de
- navicate连接mycat报1184错误
- rabbitmq无法启动
- laravel整合dingo/api方法步骤:jwt
- 我的项目
- 【github】www.github.com/hurong241
- 【码云】gitee.com/hu_rong/projects
- 【docker hub】hub.docker.com/repositories/hurong241
- 【packagist】packagist.org/users/hurong241/packages
- 站点信息
- 建站时间:2011年
- 文章数:623篇
- 浏览数:1303109