php curl抓https网址时301或302或抓取内容为空时的处理方法
首页->学习资料->编程语言->php教程->php技巧 关键词:php,curl,https,301,302 发布时间:2019-03-22 09:02:33 浏览次数:3251

场景:检测网站是否安装了某段代码


用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; // 返回数据
}


赞:(0)
踩:(0)
相关文章
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进行
centos7.4 64位下swoole安装及配置
laravel页面静态化的方法
navicate连接mycat报1184错误
单点登录sso原理及php实现方式及de
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
标签
rabbitmq mysql备份 elasticsearch golang swoole
我的项目
【github】www.github.com/hurong241
【码云】gitee.com/hu_rong/projects
【docker hub】hub.docker.com/repositories/hurong241
【packagist】packagist.org/users/hurong241/packages
站点信息
建站时间:2011年
文章数:607篇
浏览数:935521
粤ICP备18028092号-1  微信:hurong241