获取页面的html源的更好方法

时间:2013-04-10 12:58:17

标签: php

我试图通过过滤其源代码来获取网页上的一些数据,我找到了很多方法来抓取网页的html内容,例如$html = file_get_html('http://www.exam.com/results/'); curl html获取源

获取页面的html源代码的最佳方法是什么?或者所有这些方法都相同?

4 个答案:

答案 0 :(得分:2)

cURL可能提供比file_get_contents($url) *****更好的表现。 我宁愿使用cURL,因为所有这些函数最终都会检索某个网页内容,唯一的区别就是运行时,正如我所说的那样,使用cURL时更好。

*你可以在这里找到一个体面的(但不是正式的)证据,包括基准: https://stackoverflow.com/questions/555523/file-get-contents-vs-curl-what-has-better-performance

答案 1 :(得分:2)

这取决于您的需求,但请务必记住,curl会将回复作为文字返回,file_get_html将返回Simple_HTML_DOM。另外,我认为重要的是要注意file_get_html调用file_get_contents

就个人而言,我有一种温和的偏好首先将数据加载到内存中(我发现它更容易调试),但我通常不喜欢使用curl_*,除非我需要发送某些带有请求的标头( POST变量或WWW-Auth标题等)。对于其他一切,我发现它将一行函数调用变为热点。所以我通常依赖file_get_contents

对于Simple_HTML_DOM,我想知道它是否可能比PHP本机编译库更快。您可以使用simplexml_load_fileDomDocument::loadHTMLFile

访问这些内容

答案 2 :(得分:1)

cURL提供了更多控制,正如@itamar建议的那样。它允许您使用file_get_contents设置一些无法设置的内容,包括:

  • 代理使用
  • 接头
  • 永久性cookie存储

它还允许您检索标题。

cURL的使用相当复杂,但收益相当不错。建议是将它包装在一个函数中。我倾向于使用这个:

protected static function prepare_channel(Request $r) {
    $r->channel = curl_init();
    $p = array();
    foreach ($r->GET as $k => $v) {
        $p[] = $k."=".$v;
    }
    $head = array();
    foreach ($r->getHeaders() as $k => $v) {
        $head[] = $k.": ".$v;
    }
    curl_setopt($r->channel, CURLOPT_URL, $r->getURI()."?".implode("&",$p));
    curl_setopt($r->channel, CURLOPT_HTTPHEADER, $head);
    curl_setopt($r->channel, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($r->channel, CURLOPT_FORBID_REUSE, true);
    curl_setopt($r->channel, CURLOPT_RETURNTRANSFER, true);
    if (Request::getProxy()) {
        curl_setopt($r->channel, CURLOPT_PROXY, Request::getProxy());
    }
    curl_setopt($r->channel, CURLOPT_HEADER, true);
    return $r->channel;
}

这是实时代码,我的Request对象具有以下签名:

protected $headers = array();
protected $baseURI = "";
public $GET = array();
public $POST = array();

运行$result = curl_exec($r->channel);会返回标题和正文。然后你可以用它来分割它们:

 $header_size = curl_getinfo($r->channel, CURLINFO_HEADER_SIZE);
 $headers = substr($result, 0, $header_size);
 $body = substr($result, $header_size);

从那里,您可以$header$body自由地做任何您喜欢的事情。您还可以通过运行curl_getinfo($ r->频道)获得大量信息。

要在PHP中解析HTML,最好先做两件事:

  • tidy松散以清除格式错误的标记
  • 使用DOMDocument解析它。

答案 3 :(得分:1)

出于很多目的,file_get_contents()就足够了。但是在很多情况下,您需要特殊要求。

使用PHP Stream上下文:如果没有可用的curl且您必须在请求中放置POST数据,则可以使用

卷曲:用于获取HTTP内容的瑞士军刀通常效果最佳。如果可能的话,有一个特殊情况你应该使用curl:如果你获取一个远程页面你自己的请求被阻止。在这种情况下,您将依赖于远程站点的性能。如果您使用的Apache2等网络服务器的插槽数量有限,则如果远程站点太慢或无法访问,它们可能会填满。我遇到过像这样的情况下的服务器故障。 Curl通过为请求设置超时来帮助您。最好把它设置为3秒钟。

但最好的方法是使用cronjob或类似内容获取外部内容,缓存它并使用缓存版本。