PHP是一種迅速發(fā)展的動(dòng)態(tài)編程語(yǔ)言,是許多網(wǎng)站最受歡迎的服務(wù)端腳本語(yǔ)言之一。其中,PHP cURL是一種處理URL的工具,它支持各種協(xié)議,如HTTP、HTTPS、FTP、Telnet等。得益于其可擴(kuò)展性、性能、靈活性和高度可定制,cURL實(shí)現(xiàn)了許多網(wǎng)絡(luò)編程的任務(wù),比如數(shù)據(jù)抓取、文件上傳、數(shù)據(jù)傳輸、博客發(fā)布等等。
在PHP-CURL中,setOpt()方法是最重要的方法之一,它可以設(shè)置許多選項(xiàng)和參數(shù),用來(lái)指定如何處理抓取的數(shù)據(jù)、訪問(wèn)目標(biāo)URL等,在這里我們重點(diǎn)講解如何使用setOpt()方法來(lái)遠(yuǎn)程獲取數(shù)據(jù)和處理這些數(shù)據(jù)。
以百度搜索為例,下面是獲取百度搜索首頁(yè)的PHP-CURL代碼:
<?php
$ch = curl_init(); //初始化
curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com/"); //設(shè)置訪問(wèn)的url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //是否輸出返回頭信息
curl_setopt($ch, CURLOPT_HEADER, 0); //是否輸出返回頭信息
$output = curl_exec($ch); //執(zhí)行命令
curl_close($ch); //關(guān)閉句柄
echo ($output); //輸出返回內(nèi)容
?>
以上代碼的作用是通過(guò)curl_init()初始化一個(gè)curl會(huì)話,使用curl_setopt()方法來(lái)設(shè)置url、是否輸出返回頭信息等選項(xiàng),然后執(zhí)行curl_exec()命令,獲取數(shù)據(jù),最后用curl_close()關(guān)閉curl會(huì)話。
下面我們一一詳細(xì)講解這些代碼。
第一行代碼,初始化curl會(huì)話,因?yàn)樵谑褂肞HP-CURL時(shí),首先需要初始化一個(gè)curl句柄(handle),它是個(gè)全局變量,存儲(chǔ)著必要的參數(shù),如本次請(qǐng)求的url、HTTP請(qǐng)求相關(guān)的數(shù)據(jù)等。
第二行代碼中,用curl_setopt()方法設(shè)置了訪問(wèn)的url是http://www.baidu.com/,這里我們以百度搜索首頁(yè)為例,注意,在設(shè)置句柄時(shí),通過(guò)curl_setopt()方法設(shè)置相關(guān)屬性和各種選項(xiàng),這些選項(xiàng)控制著如何在本次會(huì)話中發(fā)送數(shù)據(jù)、如何接收數(shù)據(jù)等。
第三行和第四行代碼用于控制是否輸出返回頭信息。curl_setopt()方法中的CURLOPT_RETURNTRANSFER選項(xiàng)可以指定是否輸出返回結(jié)果,此處設(shè)置為1,則將結(jié)果返回到字符串中,否則不返回結(jié)果。
第五行代碼使用curl_exec()方法,執(zhí)行本次命令,獲取返回結(jié)果,注意,在執(zhí)行命令時(shí),使用的curl句柄是第一步初始化得到的句柄。
第六行代碼通過(guò)curl_close()方法,關(guān)閉本次curl使用的句柄,釋放資源。
最后一行,使用echo將返回的結(jié)果輸出即可。
以上,就是用PHP-CURL獲取遠(yuǎn)程數(shù)據(jù)和處理數(shù)據(jù)的過(guò)程,下面我們?cè)俳o出兩個(gè)具體的例子。
1.用PHP-CURL獲取遠(yuǎn)程圖片
下面,我們以獲取百度LOGO為例,使用PHP-CURL獲取遠(yuǎn)程圖片。<?php
$ch = curl_init('http://www.baidu.com/img/bd_logo1.png');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
$fp = fopen("bd_logo1.png",'w');
fwrite($fp, $output);
fclose($fp);
echo "獲取圖片成功!" ;
?>
以上代碼中,第一行初始化CURL會(huì)話,第二行設(shè)置了訪問(wèn)的URL,指定為http://www.baidu.com/img/bd_logo1.png,第三行和第四行代碼用于控制是否輸出返回頭信息和結(jié)果,第五行代碼用于獲得返回結(jié)果,第六行關(guān)閉會(huì)話并釋放相關(guān)資源,第七行往本地寫(xiě)入返回?cái)?shù)據(jù),第八行輸出提示信息。
2. 用PHP-CURL模擬登錄
前端模擬登陸已被反追蹤并許多網(wǎng)站封殺,如果你想用爬蟲(chóng)或簡(jiǎn)單的自動(dòng)化工具模擬登錄某個(gè)網(wǎng)站,用PHP-CURL則是個(gè)不錯(cuò)的選擇,下面我們以模擬登錄Github為例:<?php
$url = "https://github.com/login";
$post["commit"] = "Sign in";
$post["utf8"] = "✓";
$post["authenticity_token"] = "在自己的Chrome瀏覽器中登錄Github,按F12打開(kāi)開(kāi)發(fā)者選項(xiàng)/Network面板,提交表單后找到form表單,找到authenticity_token的值即可";
$post["login"] = "你的用戶名/郵箱地址";
$post["password"] = "你的密碼";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'github_cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'github_cookies.txt');
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
echo $output;
if ($info['http_code'] == 200) {
echo "登錄成功!";
} else {
echo "登錄失敗!";
}
?>
代碼中,第一行指定了模擬登陸的URL,也就是https://github.com/login,第二行設(shè)置了post數(shù)據(jù),其中,commit和utf8都是GitHub中的“固定值”,authenticity_token需要自己去Chrome的開(kāi)發(fā)者工具中復(fù)制,login和password是你的用戶名和密碼。
在第三行,我們初始化了CURL會(huì)話,指定URL,第四行設(shè)置了post方式,第五行設(shè)置post數(shù)據(jù),第六行設(shè)置返回結(jié)果,第七行COOKIEJAR和COOKIEFILE,這些是為了維持會(huì)話而設(shè)置的,注意,COOKIEJAR和COOKIEFILE需要你這里設(shè)置好一個(gè)名字,以備驗(yàn)證cookie,第八行用執(zhí)行命令來(lái)獲取結(jié)果,最后用curl_getinfo()方法獲取請(qǐng)求信息,curl_close()關(guān)閉會(huì)話。
最后,判斷獲取狀態(tài)是否為200,是則登錄成功,否則登錄失敗。
總結(jié)來(lái)說(shuō),PHP-CURL是很強(qiáng)大且靈活的,可以用來(lái)實(shí)現(xiàn)很多網(wǎng)絡(luò)編程任務(wù),如數(shù)據(jù)抓取、數(shù)據(jù)傳輸、網(wǎng)站登錄等。能夠充分利用PHP-CURL,對(duì)于處理網(wǎng)站開(kāi)發(fā)、數(shù)據(jù)處理、抓取數(shù)據(jù)等工作都有巨大的幫助。