cURL一般是指使用URL語法進行數據傳遞的命令行工具和庫,本文所介紹的是其PHP拓展最基本的使用。php
cURL主要用來進行數據抓取,固然,還有更多強大的功能,一些複雜的操做,例如處理Cookie、表單數據提交等實現起來也要比其餘方法簡單。html
1.安裝與使用數組
Windows下:修改php.ini的設置,打開php_curl.dll拓展便可。瀏覽器
Linux下: # wget http://curl.haxx.se/download/curl-7.17.1.tar.gz安全
# tar zxvf curl-7.17.1.tar.gz //解壓服務器
#cd curl-7.17.1curl
# ./configure --prefix=/usr/local/curl函數
# make工具
# make installpost
安裝完成後經過phpinfo()來查看是否安裝成功。
ps:若是是用的集成包來搭建PHP環境的話,通常而言cURL的功能都是開啓的。
2.用cURL抓取網頁的基本流程
最基本的抓取網頁的步奏主要分爲如下幾步:
(1)初始化
(2)設置相關選項
(3)執行獲取網頁文檔
(4)釋放cURL句柄
例如:咱們以抓取百度首頁爲例,代碼示範這個流程:
<?php //初始化一個curl句柄 $ch = curl_init(); //對相關選項進行設置 curl_setopt($ch,CURLOPT_URL,'www.baidu.com'); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //執行抓取 $output = curl_exec($ch); //釋放curl句柄 curl_close($ch); //輸出抓取的數據 echo $output; ?>
在整個流程中,比較重要的步奏其實在於選項設置部分,即curl_setopt()函數,來指定URL請求的細節,具體設置選項的意義在後面介紹。
爲了使上述代碼具備可調試性,如今增長几行代碼,來輸出cURL執行後的相關信息。
<?php ...... curl_exec($ch); //獲取執行請求後相關信息 $info = curl_getinfo($ch); print_r($info);//打印信息數組 ?>
對於抓取百度首頁,打印出的信息數組以下:
Array ( [url] => HTTP://www.baidu.com/ [content_type] => text/html [http_code] => 200 [header_size] => 689 [request_size] => 52 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.016 [namelookup_time] => 0 [connect_time] => 0 [pretransfer_time] => 0 [size_upload] => 0 [size_download] => 14613 [speed_download] => 913312 [speed_upload] => 0 [download_content_length] => 14613 [upload_content_length] => 0 [starttransfer_time] => 0.016 [redirect_time] => 0 [redirect_url] => ......... )
其中,能夠經過size_download字段信息來校驗下載的信息是否完整:
對抓取的數據的filesize進行大小計算,來對比返回信息中size_download字段。
<?php ...... file_put_contents("D:/temp/test.html", $output); $size = filesize('D:/temp/test.html'); if($size==$info['size_download']) { echo 'success'; } else { echo 'fail'; } ?>
3.用cURL僞造頭信息
有些網站只容許手機端訪問,例如騰訊的手機網(3g.qq.com),當用瀏覽器直接輸入地址訪問時,會跳轉到http://3gqq.qq.com/,這是由於騰訊會識別訪問該網址的UA(User Agent),來判斷用戶所使用的設備,進而進行相應的跳轉,因此能夠用cURL模擬手機UA來訪問。
在選項設置中添加:
curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2S Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 XiaoMi/MiuiBrowser/1.0");
來模擬安卓手機登錄訪問。
返回的數據截圖:
很顯然,是手機網頁。
4.cURL POST發送數據
有的網頁經過form表單向服務器提交數據,當提交的method設置爲post時候,咱們也能夠用cURL來進行提交。例如:
<?php //初始化一個curl句柄 $ch = curl_init(); $postdata = array('name'=>'dog','age'=>'999','address'=>'china'); //對相關選項進行設置 curl_setopt($ch,CURLOPT_URL,'http://localhost/form.php'); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); //設置post選項 curl_setopt($ch, CURLOPT_POST, 1); //綁定post變量 curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); //執行 $output = curl_exec($ch); //釋放curl句柄 curl_close($ch); echo $output; ?>
其中,form.php腳本將提交的form數據進行打印輸出。
執行腳本後輸入以下:
Array ( [name] => dog [age] => 999 [address] => china )
也能夠用這個方法向某些安全性較差的網站、留言板進行數據提交或者製做一個灌水機器人。
5.cURL相關設置項
前面曾經說過,cURL中靈魂性的東西就是選項設置,經過設置各類選項來指定cURL的細節。選項過多,不一一羅列,能夠參考這裏