curl爬蟲

什麼是curl:
你可能在你編寫PHP腳本代碼中會遇到這樣的問題:怎麼樣才能從其他站點獲取內容呢?這裏有幾個解決方式 最簡單的就是在PHP中使用fopen()函數 但是fopen函數沒有足夠的參數來使用 比如當你想構建一個”網絡爬蟲“ 想定義爬蟲在客戶端描述(IE,Firefox),通過不同的請求方式來獲取內容 比如POST,GET等等 這些需求是不可能用fopen函數實現的
爲了解決我們上面提出的問題 我們可以使用PHP的擴展庫——curl 這個擴展庫通常是默認在安裝包中的 你可以用它來獲取其他站點的內容 也可以來幹別的。
PS:這兩段代碼需要php_curl擴展庫的支持,查看PHPinfo() 如果curl support enabled 則表示支持curl庫。
1.Windows下的PHP開啓curl庫支持:
打開PHP.ini 將extension=php_curl.dll前的;去掉。
2.Linux下的PHP開啓curl庫支持:
編譯PHP時在./configure後上加上 -with-curl

如何使用curl庫:
基本用法:
1.通過函數curl_init()創建一個新的curl回話,代碼如下:

   //create a new curl resource
   $ch=curl_init();
   ?>

我們已經成功創建了一個curl回話 如果需要獲取一個URL的內容,那麼接下來的一步就是傳遞一個URL誒curl_setopt()函數,代碼如下

    curl_setopt($ch,CURLOPT_URL,"http:/www.google.com/");
    ?>

做完上一步工作,curl的準備工作做完了,curl將會獲取URL站點的內容,並打印出來。代碼如下

//grab url and pass it to the browser
 curl_exec($ch);
 ?>

最後關閉當前的curl回話

//close curl resource and  free up system resources
curl_close($ch);

下面來看看完整的實例代碼:

// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.google.nl/”);
// grab URL and pass it to the browser
curl_exec($ch);
// close curl resource, and free up system resources
curl_close($ch);
?>

我們剛剛把另外一個站點的內容,獲取過來以後自動輸出到瀏覽器。其實我們還有其他的方式組織獲取的信息,然後控制其輸出的內容。在curl_setopt()函數的參數中,如果希望獲得內容但不進行輸出,使用CURLOPT_RETURNTRANSFER參數,並設爲非0值或者true, 完整代碼如下:

//create a new curl resource
$ch=curl_init();
//set URL and other appropriate options
curl_setopt($ch,CUrLOPT_URL,"http://www.google.nl/");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
//grab URL,and return output
$output=curl resource,and free up system resources
curl_close($ch);
//replace 'Google' with ‘PHPit’
$output=str_replace('Google','PHPit',$output);
//print output
echo $output;
?>

在上面的兩個實例中 你可能注意到通過設置函數curl_setopt()不同的參數,可以獲得不同的結果,這正是curl強大的原因, 下面我們來看看這些參數的含義

curl的相關選項,以下介紹常用的一些參數
<1>CURLOPT_FOLLOWLOCATION 當你把這個參數設置爲true是 curl會根據任何重定向命令更深次的獲取轉向路徑,eg:當你嘗試獲取一個PHP頁面,然後這個PHP頁面中有一段跳轉代碼 curl將從http://new_url獲取內容,而不是返回跳轉代碼。代碼如下:

 //create a new curl resource
  $ch=curl_init();
  //set url and other appropriate options
  curl_setopt($ch,CURLOPT_URL,"http://www.google.com/");
  curl_setopt($ch,CUROPT_FOLLOWLOCATION,true);
  //grab url and print
  curl_exec($ch);
  ?>

如果Google發送一個轉向請求 上面的例子將根據跳轉的網址繼續獲取內容 和這個參數有關的兩個選項是 CURLOPT_MAXREDIRS和CURLOPT_AUTOREFERER 參數CURLOPT_MAXREDIRS選項允許你定義跳轉請求的最大次數 超過了這個次數將不再獲取其內容 如果CURLOPT_AUTOREFERER設置爲true時,curl會自動添加Referer header在每一個跳轉鏈接,可能他不是很重要 但是在一定的案例中卻非常有用

<2>CURLOPT_POST 這是一個非常有用的功能,因爲它可以讓你用POST請求而不是GET請求,這實際上意味着你可以提交其他形式的頁面 無須在表單中填入 下面有個例子:

// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL,”http://projects/phpit/content/using curl php/demos/handle_form.php”);
// Do a POST
$data = array('name' => ‘Dennis', 'surname' => ‘Pallett');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// grab URL, and print
curl_exec($ch);
?>
And the handle_form.php file:
echo ‘Form variables I received:';
echo ‘';
print_r ($_POST);
echo';
?>

<3>CURLOPT_CONNECTTIMEOUT 通常又來設置curl嘗試請求連接的時間 這是一個非常重要的選項 如果你把這段時間設置得太短了 可能會導致curl請求失敗 但是如果你把它設置的時間太長了 可能PHP腳本將死掉 和這個參數相關的一個選項是CURLOPT_TIMEOUT 這是用來設置curl允許執行的時間需求 如果你設置爲很小的值 他可能導致下載的網頁是不完整的 因爲他們需要一段時間才能下載

<4>CURLOPT_USERAGENT 它允許你自定義請求的客戶端名稱 比如webspidler或是IE6.0 示例代碼如下:

// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://sc.jb51.net/”);
curl_setopt($ch, CURLOPT_USERAGENT, ‘My custom web spider/0.1′);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// grab URL, and print
curl_exec($ch);
?>

下面介紹curl_getinfo()函數:
這個函數可以幫助我們獲取頁面的信息 函數curl_getinfo()可以使得我們獲取接受頁面的各種信息 你能編輯這些信息 通過設定選項的第二個參數 你也可以傳遞給一個數組 代碼如下:

// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.google.com”);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FILETIME, true);
// grab URL
$output = curl_exec($ch);
// Print info
echo';
print_r (curl_getinfo($ch));
echo ‘';
?>

大部分返回的信息是請求本身的 如這個請求花的時間 返回的頭文件信息 當然也有一些頁面的信息 想頁面內容的大小 最後修改的時間 那些全是管與curl_getinfo()函數的
現在讓我們來看看那它的實際用途 curl庫的第一用途可以查看一個URL頁面是否存在 我們可以通過查看這個URL的請求返回的代碼來判斷 比如404代表這個頁面不存在 代碼如下:

// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.google.com/does/not/exist”);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// grab URL
$output = curl_exec($ch);
// Get response code
$response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// Not found?
if ($response_code == ‘404′) {
echo ‘Page doesn\'t exist';
} else {
echo $output;
}
?>

其他的用戶可能是創建一個自動檢查器 驗證每個請求的頁面是否存在
我們可以用curl庫來寫和Google類似的網頁蜘蛛webspider 或是其他的網頁蜘蛛

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章