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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM