2014-01-12 187 views
0

基本上,我做的是這樣的:簡單的HTML DOM解析器慢

  1. 由埃文斯獲得第10名球員/名在該列表中:http://www.tibia.com/community/?subtopic=worlds&world=Aurora
  2. 從每個獲取最新的死亡信息球員(這裏是一個例子球員:http://www.tibia.com/community/?subtopic=characters&name=Aaploo
  3. 打印最近的死亡日期。

我正在使用PHP的Simple HTML Dom。

我的問題是,需要7秒鐘將結果加載到我的頁面上10個名字。這份名單在一天中通常有1000個名字。這意味着整個列表可能需要15分鐘才能完成處理。 這是什麼?還是可以減少?

這裏是一個結果的示例快照:

enter image description here

這裏是我使用的代碼:所推薦的超

<?php 

include ('simple_html_dom.php'); 

$start_time = microtime(true); 


$html = file_get_html('http://www.tibia.com/community/?subtopic=worlds&world=Aurora'); 
$table = $html->find('table[class=Table2]'); 
$table = $table[0]; 

    $a2 = $table->find('tr[class=Even]'); 
for ($i = 0; $i < 10; $i++) 
{ 
    $a = $a2[$i]; 
    $player = $a->find('a'); 
    $player = $player[0]; 
    echo $player->href . '<br>'; 
    $html2 = file_get_html($player->href); 
    $date = $html2->find('[@id="characters"]/div[5]/div/div/table[3]/tbody/tr[2]/td[1]'); 
    $date = $date[0]; 
    echo "Most recent death date: " . $date . '<br>'; 
    $dateArr = explode(" ", $date); 
    $dateArr = $dateArr[0]; 
    echo sizeof($dateArr) . '<br>'; 
    //for ($k = 0; count($dateArr[0]); $k++) 
    //{ 
    // echo $dateArr[0][$k] . '<br>'; 
    //} 
} 

echo "<br><br>This page was generated in " . (number_format(microtime(true) - $start_time, 2)) ." seconds."; 

?> 

EDIT/NEW方式:

$html = file_get_contents('http://www.tibia.com/community/?subtopic=worlds&world=Aurora'); 
$html2 = file_get_contents('http://www.tibia.com/community/?subtopic=characters&name=Aarkanito'); 
$dom = new domDocument; 
$xpath = new domXpath($dom); 
$dom->loadHTML($html2); 

$a2 = $xpath->query('[@id="characters"]/div[5]/div/div/table[3]/tbody/tr[2]/td[1]'); 
$a2 = $a2[0]; 

echo "Latest death: " . $a2; 
+1

simple_html_dom反正慢。當你用純PHP進行所有分析時,會發生這種情況。如果您想要速度,請嘗試DOMDocument和DOMXPath。他們使用本地代碼(libxml)來進行解析,並且可以處理任何不是骨頭錯位的HTML。 – cHao

+0

對於爲每個遊戲角色抓取頁面也沒什麼幫助,特別是使用simple_html_dom解析它。 – cHao

+0

好的,所以我使用DOMDocument和DOMXPath在底部使用了一個新的快速示例代碼對原始文章進行了編輯。我知道現在它不能工作,但這就是我現在所擁有的。如果有什麼我可能做錯了,請讓我知道。 – Evan

回答

1

您正嘗試獲取大量網頁,可能不是現在,但是因爲你在詢問整個清單。我剛剛在我的網站上嘗試過,它花費了0.75秒來加載主頁面,每個頁面的平均時間爲0.23秒。所以如果你想下載所有的統計數據,你應該花費不到4分鐘的時間。

通常,當我不得不颳去一個頁面並且颳了很多東西時,我會使用google緩存,但tibia.com的結果甚至比google緩存(約0.3秒)更好。然而,即使你想,你也不能使用谷歌緩存,因爲它不適用GET方法,所以你不能發送參數。

加速這個過程並不是一個真正的方法,因爲記住,你想要一次刮掉更多的1K頁。如果我是你,我會害怕而不是被禁止。如果你繼續做你正在做的事情,那麼這很有可能。你真的確定你需要這麼多信息嗎?

+0

刮是違法的?我不知道。感謝您告訴我: – Evan

+0

這不是非法的,但大多數網站並不喜歡它。檢查服務條款,看看他們是否說你不允許。 – cHao

1

最好的辦法是在本地保存html,然後編寫另一個腳本來擦除信息。通過這種方式,您可以隨時修改,優化,在稍後的時間點通過解析腳本獲取更多信息。