file_get_contents VS dom-> loadHTMLFile

时间:2014-07-07 15:58:18

标签: php dom web-crawler

我一直在制作一个PHP抓取工具,需要从网站获取所有链接并触发这些链接(而不是手动点击它或做客户端JS)。

我读过这些:

  1. How do I make a simple crawler in PHP?
  2. How do you parse and process HTML/XML in PHP?
  3. 等等,我决定关注1。

    到目前为止,它一直在运作,但我对使用file_get_contentsdom->loadHTMLFile的方法的不同感到困惑。你能不能用这些以及它可能造成的影响,利弊,或简单与情景来启发我。

1 个答案:

答案 0 :(得分:1)

有效地,这些方法也是这样做的。但是,使用file_get_contents(),您需要将结果(至少是暂时的)存储在字符串变量中,除非您将结果传递给DOMDocument::loadHTML()。这会导致应用程序中的内存使用量增加。


某些网站可能要求您设置一些特殊标头值,或使用除GET之外的其他HTTP方法。如果需要,您需要指定一个所谓的流上下文。您可以使用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传输,在某些特殊情况下可能需要这样做。