【问题标题】:file_get_contents VS dom->loadHTMLFilefile_get_contents VS dom->loadHTMLFile
【发布时间】:2014-08-28 04:27:46
【问题描述】:

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

我已经阅读了这些:

  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 的方法的差异感到困惑。能否请您告诉我这些以及它可能导致的影响、利弊,或简单与情景的对比。

【问题讨论】:

  • file_get_contents 只是获取目标网页包含的所有 html,它不知道 DOM。对于 DOM 操作,即使您通过 file_get_contents 获取内容,您仍然必须使用与 DOM 相关的类

标签: php dom web-crawler


【解决方案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 传输,这在某些特殊情况下可能是必要的。

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 2018-12-12
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多