zoukankan      html  css  js  c++  java
  • PHP curl是什么

    PHP curl是什么

    一、总结

    一句话总结:PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。

    libcurl库 允许你与各种的服务器使用各种类型的协议进行连接和通讯 cookie   密码认证   get请求   post请求

    libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。

    PHP中使用cURL实现Get和Post请求的方法

    1、HTTP协议HTTPS协议的各自优点

    HTTP快 HTTPS安全

    http比https快

    https比http安全

    2、cURL发送请求主要使用哪些函数?

    curl_init()  curl_setopt()  curl_exec()  curl_close()

    发送get请求

     1 function geturl($url){
     2         $headerArray =array("Content-type:application/json;","Accept:application/json");
     3         $ch = curl_init();
     4         curl_setopt($ch, CURLOPT_URL, $url);
     5         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
     6         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
     7         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     8         curl_setopt($url,CURLOPT_HTTPHEADER,$headerArray);
     9         $output = curl_exec($ch);
    10         curl_close($ch);
    11         $output = json_decode($output,true);
    12         return $output;
    13 }

    二、PHP爬虫技术(转)

    转自:PHP爬虫技术(一) - 军报应用开发 - 博客园
    https://www.cnblogs.com/jbexploit/p/4553219.html

    摘要:本篇文章介绍PHP抓取网页内容技术,利用PHP cURL扩展获取网页内容,还可以抓取网页头部,设置cookie,处理302跳转。

    一、cURL安装

    采用源码安装PHP时,需要在configure时添加配置项,

    cd php

    ./configure --with-curl

    安装完毕,可以利用php -m命令查看,是否已经支持cURL扩展。

    php -m | grep curl

    也可以利用phpinfo查看,是否已经支持cURL扩展。

    二、获取网页内容

    cURL支持很多网络协议,如HTTPHTTPSFTP等。普通网页采用HTTP协议,一些安全性高的网页采用HTTPSHTTPS协议采用数据加密技术,通过公钥技术交换密钥,加密传输内容。因此采用HTTPS协议的网页,在整个链路上传输的都是加密后的数据。例如Baidu采用HTTPS协议,你输入的关键字被网络传输协议加密,即使是运营商可以获得全部数据,也无法获得数据的内容。HTTPS协议也有缺点,就是加解密需要耗费计算时间,因此HTTPS网站会慢一些,而大多数网站都是采用HTTP协议)。HTTP协议中,定义了两种方法GETPOSTPOST方法通常用于表单提交,能够提交文件等大数据。GET方法用来获取网页数据,也可以提交少量数据。本文主要介绍利用GET协议获取网页数据,将来再详细讲解cURL POST技术。

    我们先看一些浏览器是怎么工作的,打开chrome浏览器,F12进入开发者模式,将工具栏切换到network,如下图,利用chrome工具可以查看每个文件的传输信息。

    浏览器要加载一个网页,首先下载html文件,再下载jscss、图片等资源文件再进行渲染加载。通常数据抓取只需要抓取html文件,下图是chrome工具显示下载http文件的内容。

     

    三、PHP实现 

    <?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "www.qq.com");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $html = curl_exec($ch);
    curl_close($ch);
    var_dump($html);
    ?>

    基本设置,返回网页内容。

    四、获得HTTP头部设置cookie

    有些网站,会采用cookie技术。当采集程序没带有相关cookie时,很容易被网站认定是“机器人”,拒绝对其服务。通过chrome调试www.sogou.com,发现cookie是包含在网页头信息中的。因此,我们需要两个步骤(1HTTP头信息中获取cookie2)发送请求时添加cookie

    头信息包含设置cookie

     

    刷新网页,查看头信息,请求包含cookie信息

     

    获取cookie

     

    <?php
        $url = "www.sogou.com";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_NOBODY, true);
        curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($ch, $str) use(&$setcookie) {
          // 第一个参数是curl资源,第二个参数是每一行独立的header!
          list ($name, $value) = array_map('trim', explode(':', $str, 2));
          $name = strtolower($name);
          if('set-cookie'==$name)
          {
            $setcookie[]=$value;
          }
          return strlen($str);
        });
        curl_exec($ch);
        curl_close($ch);
        $cookie = array();
        foreach($setcookie as $c)
        {
          $tmp = explode(";",$c);
          $cookie[] = $tmp[0];
        }
        $cookiestr = "Cookie:".implode(";", $cookie);
        echo $cookiestr;
    ?>

    返回结果

    Cookie:ABTEST=0|1433425917|v17;IPLOC=CN1100;SUID=3295CB6F1220920A00000000557057FD

    设置cookie

    <?php
    
    $url = "www.sogou.com";
    
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, $url);
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    
    $headers[] = $cookie;
    
    curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
    
    $html = curl_exec($ch);
    
    curl_close($ch);
    
    var_dump($html);
    
    ?>

    五、抓取302跳转

    在Baidu中搜索关键词,返回的结果链接是一个Baidu加密过的链接,通过二次跳转才是真正的网址。(Baidu为了防止360抓取,把结果都加密了)。

    我们可以抓取头部中的location信息找到真实地址,

    <?php
        $url = "https://www.baidu.com/link?url=b34APzBjz-cGLoxsG4-nviHmtVS0tCvEftS6ApCAsojT1a0h9oFFPprwK4JpNYgGaQE29QPUtRdPUeu3lIz2M7GW7dqLMi5ytlHLOVa3v_VY23dOoRiUSyV9zr_cI8Rg&wd=&eqid=c89cf372000002cc0000000255705961&ie=utf-8";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_NOBODY, true);
        curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($ch, $str) use(&$location) {
          // 第一个参数是curl资源,第二个参数是每一行独立的header!
            list ($name, $value) = array_map('trim', explode(':', $str, 2));
            $name = strtolower($name);
            if('location'==$name)
            {
              $location = $value;
              return 0;
            }
            return strlen($str);
        });
        curl_exec($ch);
        curl_close($ch);
        echo $location;
    ?>

    抓取302跳转还有另外一种方式,利用ob重定向流的方式,并且设置允许curl跳转到新地址。代码如下

    <?php
          function getContents($url){ 
          $header = array("Referer: http://www.baidu.com/"); 
          $ch = curl_init(); 
          curl_setopt($ch, CURLOPT_URL, $url); 
          curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
          curl_setopt($ch, CURLOPT_HTTPHEADER,$header); 
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);  //能无法 抓取跳转后的页面
          ob_start(); 
          curl_exec($ch); 
          $contents = ob_get_contents(); 
          ob_end_clean(); 
          curl_close($ch); 
          return $contents; 
          } 
          $url = "https://www.baidu.com/link?url=b34APzBjz-cGLoxsG4-nviHmtVS0tCvEftS6ApCAsojT1a0h9oFFPprwK4JpNYgGaQE29QPUtRdPUeu3lIz2M7GW7dqLMi5ytlHLOVa3v_VY23dOoRiUSyV9zr_cI8Rg&amp;wd=&amp;eqid=c89cf372000002cc0000000255705961&amp;ie=utf-8";
          $contents = getContents($url);
          echo $contents; 
    ?>

    (三)、php cURL函数简介

    1、PHP cURL 函数

    函数描述
    curl_close() 关闭一个cURL会话。
    curl_copy_handle() 复制一个cURL句柄和它的所有选项。
    curl_errno() 返回最后一次的错误号。
    curl_error() 返回一个保护当前会话最近一次错误的字符串。
    curl_escape() 返回转义字符串,对给定的字符串进行URL编码。
    curl_exec() 执行一个cURL会话。
    curl_file_create() 创建一个 CURLFile 对象。
    curl_getinfo() 获取一个cURL连接资源句柄的信息。
    curl_init() 初始化一个cURL会话。
    curl_multi_add_handle() 向curl批处理会话中添加单独的curl句柄。
    curl_multi_close() 关闭一组cURL句柄。
    curl_multi_exec() 运行当前 cURL 句柄的子连接。
    curl_multi_getcontent() 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流。
    curl_multi_info_read() 获取当前解析的cURL的相关传输信息。
    curl_multi_init() 返回一个新cURL批处理句柄。
    curl_multi_remove_handle() 移除curl批处理句柄资源中的某个句柄资源。
    curl_multi_select() 等待所有cURL批处理中的活动连接。
    curl_multi_setopt() 设置一个批处理cURL传输选项。
    curl_multi_strerror() 返回描述错误码的字符串文本。
    curl_pause() 暂停及恢复连接。
    curl_reset() 重置libcurl的会话句柄的所有选项。
    curl_setopt_array() 为cURL传输会话批量设置选项。
    curl_setopt() 设置一个cURL传输选项。
    curl_share_close() 关闭cURL共享句柄。
    curl_share_init() 初始化cURL共享句柄。
    curl_share_setopt() 设置一个共享句柄的cURL传输选项。
    curl_strerror() 返回错误代码的字符串描述。
    curl_unescape() 解码URL编码后的字符串。
    curl_version() 获取cURL版本信息。

    2、PHP 利用 curl 发送 post get del put patch 请求

    因为需要在 php 开发中对接其它接口需要用 php curl 去对接其它接口 我把他们封装成函数 希望能对大家有所帮助。

    这里面是封装好的会自动把 data 进行转成 json 格式,同时解码成 php 数组输出。

     1 <?php
     2 function geturl($url){
     3         $headerArray =array("Content-type:application/json;","Accept:application/json");
     4         $ch = curl_init();
     5         curl_setopt($ch, CURLOPT_URL, $url);
     6         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
     7         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
     8         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     9         curl_setopt($url,CURLOPT_HTTPHEADER,$headerArray);
    10         $output = curl_exec($ch);
    11         curl_close($ch);
    12         $output = json_decode($output,true);
    13         return $output;
    14 }
    15 
    16 
    17 function posturl($url,$data){
    18         $data  = json_encode($data);    
    19         $headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json");
    20         $curl = curl_init();
    21         curl_setopt($curl, CURLOPT_URL, $url);
    22         curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    23         curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
    24         curl_setopt($curl, CURLOPT_POST, 1);
    25         curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    26         curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
    27         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    28         $output = curl_exec($curl);
    29         curl_close($curl);
    30         return json_decode($outputtrue);
    31 }
    32 
    33 
    34 function puturl($url,$data){
    35     $data = json_encode($data);
    36     $ch = curl_init(); //初始化CURL句柄 
    37     curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL
    38     curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
    39     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出 
    40     curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"PUT"); //设置请求方式
    41     curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置提交的字符串
    42     $output = curl_exec($ch);
    43     curl_close($ch);
    44     return json_decode($output,true);
    45 }
    46 
    47 function delurl($url,$data){
    48     $data  = json_encode($data);
    49     $ch = curl_init();
    50     curl_setopt ($ch,CURLOPT_URL,$put_url);
    51     curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
    52     curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    53     curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE");   
    54     curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
    55     $output = curl_exec($ch);
    56     curl_close($ch);
    57     $output = json_decode($output,true);
    58 }
    59 
    60 function patchurl($url,$data){
    61     $data  = json_encode($data);
    62     $ch = curl_init();
    63     curl_setopt ($ch,CURLOPT_URL,$url);
    64     curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
    65     curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    66     curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PATCH");  
    67     curl_setopt($ch, CURLOPT_POSTFIELDS,$data);     //20170611修改接口,用/id的方式传递,直接写在url中了
    68     $output = curl_exec($ch);
    69     curl_close($ch);
    70     $output = json_decode($output);
    71     return $output;
    72 }
    73 ?>

    参考:PHP cURL 函数 | 菜鸟教程
    http://www.runoob.com/php/php-ref-curl.html

     
  • 相关阅读:
    NOIP 2012 文化之旅
    史上最全的各种C++ STL容器全解析
    详解C++ STL map 容器
    详解C++ STL priority_queue 容器
    浅谈C++ STL stack 容器
    浅谈C++ STL queue 容器
    浅谈C++ STL vector 容器
    CF1185F Two Pizzas
    浅谈C++ STL deque 容器
    详解C++ STL multiset 容器
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/10551453.html
Copyright © 2011-2022 走看看