实用的 CURL 类-访问pc端接口

cURL 是一个利用 URL 语法规定来传输文件和数据的工具,支持很多协议,如 HTTP、FTP、TELNET 等。最爽的是,PHP 也支持 cURL 库。使用 PHP 的 cURL 库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了。无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内容.

GET请求带参数的时候,一定要转换成字符串形式http_build_query($post_data),不可以使用数组

CURLOPT_FOLLOWLOCATION 用于重定向的请求,有重定向的页面直接curl 访问可能会访问不到,使用这个参数即可

CURLOPT_SSL_VERIFYHOST 设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。 设置成 2,会检查公用名是否存在,并且是否与提供的主机名匹配。 0 为不检查名称。 在生产环境中,这个值应该是 2(默认值)。

脚本最大的执行时间是30S 这个时间并不是说30S之内请求数据的等待时间,而是说总共请求的时间,请求30S之后,就不在请求。会类似于 die 的作用。如果想取消时间限制,可以使用 set_time_limit(0);

curl -X POST -H 'Content-Type: application/json' 'https://xxx.com' -d   'string'

    protected function post($url, $params, $headers = [], $is_json = false)
    {
        //初始化
        $curl = curl_init();
        //设置抓取的url
        curl_setopt($curl, CURLOPT_URL, $url);
        //设置头文件的信息作为数据流输出
        curl_setopt($curl, CURLOPT_HEADER, 0);
        //设置获取的信息以文件流的形式返回,而不是直接输出。
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        if ($headers) {
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        }
        // post  请求的处理
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_URL, $url);

        // json  请求处理
        if ($is_json) {
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($params));
            if ($headers) {
                $head_str = implode(',', $headers);
                curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json', $head_str]);
            } else {
                curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
            }
        } else {
            curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
        }

        //执行命令
        $data = curl_exec($curl);
        //关闭URL请求
        curl_close($curl);
        //显示获得的数据
        return $data;
    }

请求 demo

        $auth = base64_encode($this->app_id . ':' . $this->app_key);
        $headers = ['Authorization:' . 'Basic ' . $auth];
        $response = $this->post($this->get_token_url, ['grant_type' => 'client_credentials'], $headers);
/**
 * @param $url 请求网址
 * @param bool $params 请求参数
 * @param int $ispost 请求方式
 * @param int $https https协议
 * @param int $cookie 是否传递 cookie
 * @param int $proxy 是否需要代理
 * @return bool|mixed
 */
function curl($url, $params = false, $ispost = 0, $https = 0, $cookie = 0, $proxy = 0)
{
    $httpInfo = array();
    set_time_limit(0); // 默认脚本是请求30S,添加这个参数会一直请求,没有时间限制
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36');
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); // 这个是连接的时间,也就是多久503 timeout
    curl_setopt($ch, CURLOPT_TIMEOUT, 300); // 这个是执行的时间 最好不要设置太短
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回原生的内容
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 如果请求的数据有重定向,则追踪到重定向地址
    if ($https) {
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在
    }
    if ($ispost) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        curl_setopt($ch, CURLOPT_URL, $url);
    } else {
        if ($params) {
            if (is_array($params)) {
                $params = http_build_query($params);
            }
            curl_setopt($ch, CURLOPT_URL, $url . '?' . $params);
        } else {
            curl_setopt($ch, CURLOPT_URL, $url);
        }
    }
    if ($cookie) {
        curl_setopt($ch, CURLOPT_COOKIE, $cookie); // 注意,这个cookie 是需要你先登陆再去浏览器获取的
    }
    if ($proxy) {
        $proxyport = '8080'; // 注意这里的端口号需要自己设置
        curl_setopt($ch, CURLOPT_PROXY, $proxy);
        curl_setopt($ch, CURLOPT_PROXYPORT, $proxyport);
    }

    $response = curl_exec($ch);
    if (curl_errno($ch)) {
        echo "Error Occured in Curl\n";
        echo "Error number: " . curl_errno($ch) . "\n";
        echo "Error message: " . curl_error($ch) . "\n";
        curl_close($ch);
        return false;
    } else {
        // $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 有出现报错的时候,可以打印
        // $httpInfo = array_merge($httpInfo, curl_getinfo($ch));
        curl_close($ch);
        return $response;
    }
}

使用方法

  // 发送请求
$result = self::curl('网址', '参数', true);
// 收到的数据需要转化一下
$json = json_decode($result);

  • 如果我们输出内容发现有乱码,我们尝试json_decode()发现是不可以转换的。这个时候一般是GBK格式,我们只需要把结果转换一下即可
$response = iconv('GBK//IGNORE', 'UTF-8', $response);
$res = json_decode($response);
var_dump($res);
图片.png

请求的时候带cookie;如果有多个参数,中间用分号;隔开

 curl_setopt($ch,CURLOPT_COOKIE, "g=".$token.';'.'PHPSESSID='.$_COOKIE['PHPSESSID'] );
cookie值获取

cookie文件的使用

$cookie_file = "/tmp/tmp/cookies.txt";
function store_cookies($cookie_file)
    {
        //连接关闭以后,存放cookie信息的文件名称 (cookies stored in $cookie_file)
        curl_setopt ($this->ch, CURLOPT_COOKIEJAR, $cookie_file);
        //包含cookie信息的文件名称,这个cookie文件可以是Netscape格式或者HTTP风格的header信息
        curl_setopt ($this->ch, CURLOPT_COOKIEFILE, $cookie_file);
    }


注意

如果本地文件curl请求本地文件,需要传递session的话,有可能会出现只能请求一次的情况,再请求会失败。解决这个问他的方式是在执行curl_exec($ch)之前,执行session_write_close()。这个我查询文档是关闭会话的意思。但是如果请求其他站点就不需要这个处理了

查阅资料,这么解释
这是php session锁死的一种情况
使用session过程中,在开启session后,同一浏览器,执行同一程序,不同页面会被锁。不同浏览器不会出现这种情况。
结合了PHP的Session机制,找到了阻塞的原因。
由于PHP的Session信息是写入文件的,1个客户端占有1个session文件。
因此,当 session_start被调用的时候,该文件是被锁住的,而且是以读写模式锁住的
(因为程序中可能要修改session的值),这样,第2次调用 session_start的时候就被阻塞了。

包含头信息,来源位置

$useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
function set_user_agent($useragent)
    {
        //在HTTP请求中包含一个”user-agent”头的字符串
        curl_setopt($this->ch, CURLOPT_USERAGENT, $useragent);
    }

//来源位置
$referrer_url = 'http://www.google.com'
    function set_referrer($referrer_url)
    {
        //设置header中"Referer: " 部分的值
        curl_setopt($this->ch, CURLOPT_REFERER, $referrer_url);
    }

//在启用CURLOPT_RETURNTRANSFER时候将获取数据返回
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER,true);

// 允许重新定向
        curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
        // 如果有gzip则解压
        curl_setopt($this->ch,CURLOPT_ENCODING , 'gzip, deflate ,sdch');

//HTTP认证
    function set_credentials($username,$password)
    {
        curl_setopt($this->ch, CURLOPT_USERPWD, "$username:$password");
    }

使用代理url请求

$proxyport = "808";
curl_setopt($ch,CURLOPT_PROXY,$proxy);
curl_setopt($ch,CURLOPT_PROXYPORT,$proxyport);

设置POST请求

curl_setopt ( $ch, CURLOPT_POST, 1 );  //设置POST请求
curl_setopt ( $ch, CURLOPT_HTTPHEADER, array (
                'Content-type:application/x-www-form-urlencoded;charset=UTF-8' 
        ) );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );  //请求参数
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );  

使用json格式请求

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($data))
);

HTML高亮显示

//高亮HTML $line_number 显示行号
    function highlightHtml($code,$line_number=false)
    {
        //$code=$this->results;
        $code = htmlspecialchars($code);
        //$code = str_replace(" "," ",$code); //替换空格替换为 
        //$code = nl2br($code); //将回车替换为<br>
        //htm标签
        //$code  =  preg_replace_callback('/<([a-zA-Z0-9]+)(.*?)(\/?>)/',array('WebLoad','__pv'), $code);

        $code  =  preg_replace('/(<[a-zA-Z0-9]+)/',  '<font color="#0000FF">$1</font>',  $code);
        $code  =  preg_replace('/(<\/[a-zA-Z0-9]+>)/',  '<font color="#0000FF">$1</font>',  $code);
        $code  =  preg_replace('/(\/>)/',  '<font color="#0000FF">${1}</font>',  $code);
        //$code = preg_replace('/(<\/?[a-zA-Z]+ .*?>)/','<font color="#0000FF">${1}</font>', $code);

        $code = preg_replace('/<!DOCTYPE\s+.+?>/','<font color="#3300FF">${0}</font>',$code);
        //注释
        $code  =  str_replace('<!--',  '<font color="#666666"><em><!--',  $code);
        $code  =  str_replace('-->',  '--></em></font>',  $code);

        //--------------以下是专为visualTpl模板文件而定制的高亮代码--------
        //block : begin|end
        $code  =  preg_replace('/(<!--\s*)(begin|end)(\s+)([a-z_\x7f-\xfe]+)/i','${1}<font size="" color="#0000FF"><b>${2}</b></font>${3}<b><font color="#FF0000">${4}</font></b>',  $code);
        $code  =  preg_replace('/(\$[a-z0-9_]+)\s*=\s*(per|on)\(([0-9]+),(\'.*?\'),(\'.*?\')\)/i','<font color="#009900"><b>${1}</b></font>=<font color="#0000FF">${2}</font>(${3},<font color="#FF9999">${4}</font>,<font color="#FF9999">${5}</font>)',  $code);
        //vip   : vip|endvip
        $code  =  preg_replace('/<font color="#666666"><em><!--\s*vip/i',  '<span style="display:block;border:1px dashed #696969;padding 3px" >${0}',  $code);
        $code  =  preg_replace('/<!--\s*endvip\s*--><\/em><\/font>/i',  '${0}</span>',  $code);
        //ssi   : #include
        $code  =  preg_replace('/<!--\s*#include\s+file.+?-->/i','<span style="background-color:#FFFF66; font-weight:bold; font-style:normal;padding:3px">${0}</span>',$code);
        //无格式变量
        $code = preg_replace('/(\{\$[a-zA-Z0-9_\x7f-\xfe]+\})/','<font style="background-color:#D7FED1;padding:1px" color="#009900">${1}</font>', $code);
        //格式变量
        $code = preg_replace('/(\{\$[a-zA-Z0-9_\x7f-\xfe]+;)([a-zA-Z]+)=\'([^\']+?)\'\}/','<font style="background-color:#D7FED1;padding:1px" color="#009900">${1}<font color="#CC0000">${2}</font>=<font color="#FF33CC">\'${3}\'</font>}</font>', $code);
        //--------------定制代码结束--------------

        //$code  =  preg_replace_callback('/>[^<]+?</',array('WebLoad','__htmlspace'), $code);
        //$code = nl2br($code);
        if(! $line_number){
            return '<PRE>'.$code.'</PRE>';
        }else{
            $code = '<pre><ol><li>' . str_replace("\n",'</li><li>',$code) . '</li></ol></pre>';
            return $code;
        }
    }

PHP 下载远程图片

class Spider {
    public function downloadImage($url, $path='images/')

    {

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);

        $file = curl_exec($ch);

        curl_close($ch);


        $this->saveAsImage($url, $file, $path);

    }


    private function saveAsImage($url, $file, $path)

    {

        $filename = pathinfo($url, PATHINFO_BASENAME);

        $resource = fopen($path . $filename, 'a');

        fwrite($resource, $file);

        fclose($resource);

    }
}

使用
$images = [

    'https://dn-laravist.qbox.me/2015-09-22_00-17-06j.png',

    'https://dn-laravist.qbox.me/2015-09-23_00-58-03j.png'

];
$spider = new Spider();


foreach ( $images as $url ) {

    $spider->downloadImage($url);

}

发送XML数据

function senXml($url,$xmlData)
    {
        $header[] = "Content-type: text/xml"; //定义content-type为xml,注意是数组

        $ch = curl_init ($url);

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);

        curl_setopt($ch, CURLOPT_HTTPHEADER,$header);

        curl_setopt($ch, CURLOPT_POST, 1);

        curl_setopt($ch,CURLOPT_POSTFIELDS, $xmlData);

        $response = curl_exec($ch);

        if(curl_errno($ch)){

            printcurl_error($ch);

        }

        curl_close($ch);
    }

除了curl,还有以下获取数据的请求方式

 /*发送数据  */
   function send_post($url, $post_data)
   {
       $postdata = http_build_query($post_data);
       $options = array(
           'http' => array(
               'method' => 'POST',
               'header' => 'Content-type:application/x-www-form-urlencoded',
               'content' => $postdata,
               'timeout' => 15 * 60
           ) // 超时时间(单位:s)

       );
       $context = stream_context_create($options);
       $result = file_get_contents($url, false, $context);
       return $result;
   }

以下这种方式请求得到xml格式数据

我不知道自己的MAC环境为什么不可行,但是有朋友的linuxwin是可以的。

function get1($dataStr){
       $xhr = new COM("MSXML2.XMLHTTP"); 
       $xhr->open("GET",$dataStr,false); 
       $xhr->send();
       $res=$xhr->responseText;
       return $res; 
    }
 function postCurl($data)
    {
        $ch = curl_init(self::conf()['api_url']);
        curl_setopt($ch, CURLOPT_POST, true);
// ssl的屏蔽
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        return curl_exec($ch);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • 一、什么是CURL? cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、...
    伊Summer阅读 1,268评论 0 4
  • 一、什么是CURL? cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、...
    茶艺瑶阅读 4,602评论 0 6
  • 转载自:http://www.cnblogs.com/txw1958/archive/2013/01/19/286...
    php_bruce阅读 2,267评论 1 5
  • 在还没有接触curl的时候,相信大家在获取网页内容的时,使用得最多的一个函数就是:file_get_content...
    四月不见阅读 1,902评论 7 39