2013-10-08 80 views
3

我試圖從網站獲得「冠軍」獲得元數據,在我使用preg_match拿到冠軍的那一刻,但它是非常緩慢的加載。最快的方式從網站

我在看什麼:

這通過一個函數傳遞鏈接:

<?php 
foreach($savedLinks as $s) 
{ 
    echo "<div class='savedLink'>"; 
     echo "<h5>" . getMetaData($s) . "</h5>"; 
     echo "<a href='" . $s . "'>" . $s . "</a><br />"; 
    echo "</div>"; 
} 
?> 

此功能抓起,從每個網站傳遞的標題:

function getMetaData($url) 
{ 
    if([email protected]_get_contents($url)) 
    { 
     return ""; 
    } 
    else 
    { 
     if(preg_match('/<title>(.+)<\/title>/',file_get_contents($url),$matches) && isset($matches[1])) 
      return $matches[1]; 
     else 
      return "Not Found"; 
    } 
} 

有一種快速的方法從每個頁面獲得「標題」?

+1

一個字[DOM]( http://php.net/manual/en/book.dom.php) – 2013-10-08 00:46:04

+0

我試過DOM,但是當試圖從大約10頁獲得'標題'時,它開始加載非常慢。 –

回答

1

我要出去肢體和猜測,是的file_get_contents採取了很多長於的preg_match,我認爲那些是相當快。

如果你遇到了很多網站這樣做,這種方法可能無法正常工作,但你可能想看看字節範圍請求。如果您可以預測該標記位於HTML響應的前X個字節內,則可以使用字節範圍進行部分請求,並避免爲了獲取標題標記而將整個文檔移動到網絡上。如果頁面是動態生成的,則需要服務器上的代碼支持此功能。如果它們是靜態文檔,則支持字節範圍請求的可能性很大。

https://serverfault.com/questions/398219/how-can-i-enable-byte-range-request

如本例中的第二個答案提示,也嘗試通過改變使存活「連接:關閉」,以「連接:保持活動」。同樣,只有當您多次訪問同一臺服務器並且服務器啓用它時,這纔會起作用。這兩件事合在一起可以爲每個請求節省大量時間。

+0

我不太確定如何使用此方法獲取網站'標題'? –

+0

你可以發佈一個URL,你將會爲標題進行搜索,所以我可以看到它是否支持字節範圍請求,併發布一些工作代碼? – roktechie

+0

一個例子是:http://www.youtube.com/watch?v=dDae3KDDj4Q –

0

您需要一個DOM解析器來快速檢索HTML頁面信息。我已經使用了以下DOM解析器的示例:

http://simplehtmldom.sourceforge.net/

下載:

http://sourceforge.net/projects/simplehtmldom/files/

例如:

<?php 

    include('simplehtmldom_1_5/simple_html_dom.php'); 

    // Create DOM from URL or file 
    $html = file_get_html('http://joinform.com.au'); 


    foreach($html->find('title') as $e) 
     echo $e->innertext . '<br>'; 


?> 
+0

嗨,我試過了你的方法,當獲得10多個不同的網站'標題'時,它仍然需要大約10秒鐘才能加載頁面。 –

+0

您不能省略與其他網站的連接時間。只有當你有非常高速的網絡連接時纔有可能。 – Anam