2014-07-07 36 views
0

我一直在做一個PHP爬行程序,需要從一個站點獲取所有鏈接並激活這些鏈接(而不是手動點擊或執行客戶端JS)。file_get_contents VS dom-> loadHTMLFile

我已閱讀這些:

  1. How do I make a simple crawler in PHP?
  2. How do you parse and process HTML/XML in PHP?

和別人多,我決定跟隨1.

到目前爲止,它一直在努力,但我對使用file_get_contentsdom->loadHTMLFile的方法有所不同而感到困惑。你可以請這些啓發我和它可能造成的影響,利弊,或簡單與場景。

+0

'file_get_contents'只是獲取目標網頁包含的所有html,它不知道DOM。對於DOM操作,即使通過'file_get_contents'獲得內容,您仍然必須使用與DOM相關的類 –

回答

1

實際上這些方法都是這樣做的。但是,使用file_get_contents()時,除非將結果傳遞給DOMDocument::loadHTML(),否則至少需要暫時將結果存儲在字符串變量中。這會導致應用程序中的內存使用量增加。


有些網站可能需要您設置一些特殊的頭值,或使用其他HTTP方法比GET。如果你需要這個,你需要指定一個所謂的流上下文。您可以使用stream_context_create()實現這一目標的上述兩種方法:

$opts = array(
    'http'=>array(
    'method'=>"GET", 
    'header'=>"Accept-language: en\r\n" . 
       "Cookie: foo=bar\r\n" 
) 
); 

$ctx = stream_context_create($opts); 

您可以設置使用上述兩種方式這一背景下,但他們在如何實現這一目標不同:

// With file_get_contents ... 
$file_get_contents($url, false, $ctx); 

// With DOM 
libxml_set_streams_context($ctx); 

$doc = new DOMDocument(); 
$doc->loadHTMLFile($url);  

葉可說的,是用curl擴展你將有大約甚至更多的控制權他的HTTP傳輸,在一些特殊情況下可能需要。