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支持很多網絡協議,如HTTP、HTTPS、FTP等。普通網頁采用HTTP協議,一些安全性高的網頁采用HTTPS(HTTPS協議采用數據加密技術,通過公鑰技術交換密鑰,加密傳輸內容。因此采用HTTPS協議的網頁,在整個鏈路上傳輸的都是加密后的數據。例如Baidu采用HTTPS協議,你輸入的關鍵字被網絡傳輸協議加密,即使是運營商可以獲得全部數據,也無法獲得數據的內容。HTTPS協議也有缺點,就是加解密需要耗費計算時間,因此HTTPS網站會慢一些,而大多數網站都是采用HTTP協議)。HTTP協議中,定義了兩種方法GET和POST。POST方法通常用於表單提交,能夠提交文件等大數據。GET方法用來獲取網頁數據,也可以提交少量數據。本文主要介紹利用GET協議獲取網頁數據,將來再詳細講解cURL POST技術。
我們先看一些瀏覽器是怎么工作的,打開chrome瀏覽器,F12進入開發者模式,將工具欄切換到network,如下圖,利用chrome工具可以查看每個文件的傳輸信息。
瀏覽器要加載一個網頁,首先下載html文件,再下載js、css、圖片等資源文件再進行渲染加載。通常數據抓取只需要抓取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是包含在網頁頭信息中的。因此,我們需要兩個步驟(1)HTTP頭信息中獲取cookie(2)發送請求時添加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&wd=&eqid=c89cf372000002cc0000000255705961&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($output,true); 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