PHP教程

php远程请求CURL案例(爬虫、保存登录状态)

本文主要是介绍php远程请求CURL案例(爬虫、保存登录状态),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
GET案例
/**
 * curl_get
 * @param $url
 * @param null $param
 * @param null $options
 * @return array
 */
function curl_get($url, $param = null, $options = null){
    $defaultOptions = array(
        'timeout'               => 30, // 超时时间(秒)
        // header(请求头)          Array|String            推荐使用数组
        // 参数格式1(数组):
        //      array('Content-type: text/plain', 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36')
        // 参数格式2(字符串):
        //      $header = "Content-type: text/plain \n User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36";
        'header'                => [],
        'get_header'            => false, // 是否返回请求头,默认false
        // 请求头里的cookie(字符串)  String             直接复制浏览器请求头里set-cookie即可
        'cookie'                => '',
        // cookiePath              String              cookie文件路径,需要可读写权限
        'cookie_file'           => '',
        // 是否启动跟踪,重定向页面是否跟随跳转
        'followlocation'        => 0,
        // 禁止服务器端的验证ssl
        'ssl'                   => 0,
        // 伪装请求来源,绕过防盗
        'referer'               => null
    );
    // 处理默认值
    foreach ($defaultOptions as $key => $item) {
        if(!isset($options[$key])){
            $options[$key] = $item;
        }
    }
    $result = array(
        'code'      => 0,
        'msg'       => 'success',
        'body'      => ''
    );
    if (is_array($param)) {
        $param = http_build_query($param);
    }
    $url = strstr($url,'?')? trim($url,'&').'&'.$param: $url.'?'.$param;

    $ch = curl_init(); // curl初始化
    curl_setopt($ch, CURLOPT_URL, $url); // 设置url
    // 判断&设置超时
    !empty($options['timeout']) && curl_setopt($ch, CURLOPT_TIMEOUT, $options['timeout']);
    // 判断&设置请求头
    if (!empty($options['header'])) {
        if (is_string($options['header'])) {
            $header = str_replace(array("\r\n", "\r", "\n"), "__SLONG__", $options['header']); // 将换行符转换为特定字符串
            $header = explode('__SLONG__', $header); // 通过特定字符串分割成数组
            $options['header'] = array_values(array_filter($header)); // 去除空元素,重组数组
        }
        curl_setopt($ch, CURLOPT_HTTPHEADER, $options['header']);
    }
    // cookie,如果要保持自动更新cookie的话只能用cookie_file文件路径方式来
    //,curl会自己读取cookie_file路径的文件转为cookie在连接时自己带过去
    //, 并在有新cookie更新时写入到文件里
    if (!empty($options['cookie_file']) && file_exists($options['cookie_file'])) {
    	// 自动同步更新
        curl_setopt($ch, CURLOPT_COOKIEFILE, $options['cookie_file']);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $options['cookie_file']);
    } elseif (!empty($options['cookie'])) {
    	// 固定cookie
        curl_setopt($ch, CURLOPT_COOKIE, $options['cookie']);
    }
    // 是否跟踪(重定向页面是否继续抓取)
    !empty($options['followlocation']) && curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $options['followlocation']);
    // 禁止服务器端的验证ssl
    empty($options['ssl']) && curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $options['ssl']);
    //伪装请求来源,绕过防盗
    !empty($options['referer']) && curl_setopt($ch, CURLOPT_REFERER, $options['referer']);
    curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); //curl解压gzip页面内容
    curl_setopt($ch, CURLOPT_HEADER, 0);// 不获取请求头
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 输出转移,不输出页面
    // 设置预设之外的参数
    if (count($options) != count($defaultOptions)) {
        foreach ($options as $key => $item) {
            if (!isset($defaultOptions[$key])) {
                curl_setopt($ch, $key, $item);
            }
        }
    }
    //执行并获取内容
    $output = curl_exec($ch);
    //对获取到的内容进行操作
    if ($output === false) {
        $result['code'] = 1; // 错误
        $result['msg'] = "CURL Error:".curl_error($ch);
    } else {
        if ($options['get_header']) {
            // 获得响应结果里的:头大小
            $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            // 根据头大小去获取头信息内容
            $result['header'] = substr($output, 0, $headerSize);
            $result['body'] = substr($output, $headerSize);
        }else{
            $result['body'] = $output;
        }
    }
    //释放curl句柄
    curl_close($ch);
    return $result;
}
POST案例
/**
 * curl_post
 * @param $url              请求地址
 * @param null $param       get参数
 * @param array $options    配置参数
 * @return array
 */
function curl_post($url, $param = null, $options = array()){
    $defaultOptions = array(
        'timeout'               => 30, // 超时时间(秒)
        // header(请求头)          Array|String            推荐使用数组
        // 参数格式1(数组):
        //      array('Content-type: text/plain', 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36')
        // 参数格式2(字符串):
        //      $header = "Content-type: text/plain \n User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36";
        'header'                => [],
        'get_header'            => false, // 是否返回请求头,默认false
        // 请求头里的cookie(字符串)  String             直接复制浏览器请求头里set-cookie即可
        'cookie'                => '',
        // cookiePath              String              cookie文件路径,需要可读写权限
        'cookie_file'           => '',
        // 是否启动跟踪,重定向页面是否跟随跳转
        'followlocation'        => 0,
        // 禁止服务器端的验证ssl
        'ssl'                   => 0,
        // 伪装请求来源,绕过防盗
        'referer'               => null
    );
    // 处理默认值
    foreach ($defaultOptions as $key => $item) {
        if (!isset($options[$key])) {
            $options[$key] = $item;
        }
    }
    $result = array(
        'code'      => 0,
        'msg'       => 'success',
        'body'      => ''
    );
    if (is_array($param)) {
        $param = http_build_query($param);
    }
    $ch = curl_init(); // curl初始化
    curl_setopt($ch, CURLOPT_URL, $url); // 设置url
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
    // 判断&设置超时
    !empty($options['timeout']) && curl_setopt($ch, CURLOPT_TIMEOUT, $options['timeout']);
    // 判断&设置请求头
    if (!empty($options['header'])) {
        if (is_string($options['header'])) {
            $header = str_replace(array("\r\n", "\r", "\n"), "__SLONG__", $options['header']); // 将换行符转换为特定字符串
            $header = explode('__SLONG__', $header); // 通过特定字符串分割成数组
            $options['header'] = array_values(array_filter($header)); // 去除空元素,重组数组
        }
        curl_setopt($ch, CURLOPT_HTTPHEADER, $options['header']);
    }
    // cookie,如果要保持自动更新cookie的话只能用cookie_file文件路径方式来
    //,curl会自己读取cookie_file路径的文件转为cookie在连接时自己带过去
    //, 并在有新cookie更新时写入到文件里
    if (!empty($options['cookie_file']) && file_exists($options['cookie_file'])) {
    	// 自动同步更新
        curl_setopt($ch, CURLOPT_COOKIEFILE, $options['cookie_file']);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $options['cookie_file']);
    } elseif (!empty($options['cookie'])) {
    	// 固定cookie
        curl_setopt($ch, CURLOPT_COOKIE, $options['cookie']);
    }
    // 是否跟踪(重定向页面是否继续抓取)
    !empty($options['followlocation']) && curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $options['followlocation']);
    // 禁止服务器端的验证ssl
    empty($options['ssl']) && curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $options['ssl']);
    //伪装请求来源,绕过防盗
    !empty($options['referer']) && curl_setopt($ch, CURLOPT_REFERER, $options['referer']);
    curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); //curl解压gzip页面内容
    curl_setopt($ch, CURLOPT_HEADER, 0);// 不获取请求头
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 输出转移,不输出页面
    // 设置预设之外的参数
    if (count($options) != count($defaultOptions)) {
        foreach ($options as $key => $item) {
            if (!isset($defaultOptions[$key])) {
                curl_setopt($ch, $key, $item);
            }
        }
    }
    //执行并获取内容
    $output = curl_exec($ch);
    //对获取到的内容进行操作
    if ($output === false) {
        $result['code'] = 1; // 错误
        $result['msg'] = "CURL Error:".curl_error($ch);
    } else {
        if ($options['get_header']) {
            // 获得响应结果里的:头大小
            $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            // 根据头大小去获取头信息内容
            $result['header'] = substr($output, 0, $headerSize);
            $result['body'] = substr($output, $headerSize);
        } else {
            $result['body'] = $output;
        }
    }
    //释放curl句柄
    curl_close($ch);
    return $result;
}

其他请求类型请自己参考封装处理


这篇关于php远程请求CURL案例(爬虫、保存登录状态)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!