2011-11-15 83 views
1

我必須抓取多個網頁,比如說100到500.現在我正在使用curl來這樣做。獲取網頁的有效方式

function get_html_page($url) { 
    //create curl resource 
    $ch = curl_init(); 

    //set url 
    curl_setopt($ch, CURLOPT_URL, $url); 

    //return the transfer as a string 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($ch, CURLOPT_HEADER, FALSE); 

    //$output contains the output string 
    $html = curl_exec($ch); 

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

    return $html; 
} 

我主要關心的是我的腳本獲取所有這些網頁所花費的總時間。我知道所花費的時間與我的互聯網速度成正比,因此大部分時間都是通過函數調用$html = curl_exec($ch);來實現的。

我在想,不是一次又一次地爲每個網頁創建和銷燬curl實例,如果我只創建一次,然後只是爲每個頁面重複使用它,最後最終銷燬它。例如:

<?php 

function get_html_page($ch, $url) { 
    //$output contains the output string 
    $html = curl_exec($ch); 
    return $html; 
} 

    //create curl resource 
    $ch = curl_init(); 

    //set url 
    curl_setopt($ch, CURLOPT_URL, $url); 

    //return the transfer as a string 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    curl_setopt($ch, CURLOPT_HEADER, FALSE); 
    . 
    . 
    . 

    <fetch web pages using get_html_page()>  

    . 
    . 
    . 
    //close curl resource to free up system resources 
    curl_close($ch); 
?> 

它會在總時間內產生任何顯着差異嗎?如果還有其他更好的方法,請讓我知道嗎?

回答

1

如何嘗試對其進行基準測試?以第二種方式做它可能更有效率,但我認爲這不會增加太多。我相信你的系統可以在微秒內創建和銷燬捲曲實例。它每次都必須啓動相同的HTTP連接。

如果您同時運行了其中的許多設備並且擔心繫統資源而非時間,那麼可能值得探索。正如你所指出的那樣,大部分時間都是在等待網絡傳輸,所以我認爲你不會注意到任何一種方法在總體時間上的變化。

0

對於網頁抓取,我會使用:YQL + JSON + xPath。您將使用cURL 實施它我認爲您將節省大量資源。

+0

我不認爲這個問題與他們被檢索後如何處理頁面有關 - 這與如何下載每個文件有關。 – JAL

+0

@flexxy:是的,我明白了。但您可以使用YQL以快速方式從網站檢索內容。 – igniter