2014-01-11 129 views
0

我遇到問題。這是我必須做的,代碼運行時間非常長:
有1個網站我需要從中收集數據,並且爲此我需要我的算法訪問本網站的15,000個子部分(即www .website.com/item.php?rid = $_id),其中$_id將是for循環的當前迭代。
這裏有問題:如何從URL中提取內容?

  1. 我目前使用讓每個頁面的源代碼是file_get_contents,並且,你可以想像的方法,它需要超長時間的15,000頁file_get_contents
  2. 每頁包含900多行代碼,但是我需要提取的所有內容大約是5行,所以看起來好像該算法通過檢索所有900行代碼浪費了大量時間。
  3. ,某些頁面不存在(即可能www.website.com/item.php?rid= 2存在,但www.website.com/item.php?rid= 3沒有),所以在算法嘗試獲取其內容並浪費大量時間之前,我需要一種快速跳過這些頁面的方法。

總之,我需要一種方法,儘可能快速有效地從15,000個網頁中提取一小部分頁面。
這是我目前的代碼。

for ($_id = 0; $_id < 15392; $_id++){ 
    //****************************************************** Locating page 
    $_location = "http://www.website.com/item.php?rid=".$_id; 
    $_headers = @get_headers($_location); 
    if(strpos($_headers[0],"200") === FALSE){ 
     continue; 
    } // end if 
    $_source = file_get_contents($_location); 
    //****************************************************** Extracting price 
    $_needle_initial = "<td align=\"center\" colspan=\"4\" style=\"font-weight: bold\">Current Price:"; 
    $_needle_terminal = "</td>"; 
    $_position_initial = (stripos($_source,$_needle_initial))+strlen($_needle_initial); 
    $_position_terminal = stripos($_source,$_needle_terminal); 
    $_length = $_position_terminal-$_position_initial; 
    $_current_price = strip_tags(trim(substr($_source,$_position_initial,$_length))); 
} // end for 

任何幫助都非常感謝,因爲我真的需要一個解決方案!
預先感謝您的幫助!

+0

除非您可以將遠程服務器配置爲每次只提供這5行,否則您需要下載整個文件並提取所需內容。沒有得到解決。你可以[每次測試其存在](http://stackoverflow.com/questions/981954/how-can-one-check-to-see-if-a-remote-file-exists-using-php)避免必須下載不存在的頁面,儘管 – Clive

+0

是那些文件行後面的字節 – sanjeev

+0

的特定字節。您可以使用RollingCurl.RollingCurl允許您使用CURL PHP庫並行處理多個HTTP請求。 [鏈接](https://github.com/takinbo/rolling-curl) – jingyu

回答

2

它的缺點:不。

更長:如果你想做這麼多的工作,你不應該按需要做。在後臺做!您可以使用您在此處獲得的代碼或任何您熟悉的其他方法,但不必將其顯示給用戶,也可以將其保存在數據庫或本地文件中。每隔x分鐘使用cron作業調用此腳本(取決於您需要的時間間隔),並僅顯示本地緩存(無論是數據庫還是文件)中的最新內容。