从网站获取元数据的最快方法

时间:2013-10-08 00:40:54

标签: php html preg-match metadata

我正在尝试从网站上获取“标题”,目前我正在使用preg_match获取标题,但加载速度非常慢。

我现在所拥有的:

这会将链接传递给函数:

<?php 
foreach($savedLinks as $s)
{
    echo "<div class='savedLink'>";
        echo "<h5>" . getMetaData($s) . "</h5>";
        echo "<a href='" . $s . "'>" . $s . "</a><br />";
    echo "</div>";
}
?>

此功能从传入的每个网站获取标题:

function getMetaData($url)
{
    if(!@file_get_contents($url))
    {
        return "";
    }
    else
    {
        if(preg_match('/<title>(.+)<\/title>/',file_get_contents($url),$matches) && isset($matches[1]))
            return $matches[1];
        else
            return "Not Found";  
    }
}

有没有快速的方法从每个页面获得'标题'?

2 个答案:

答案 0 :(得分:1)

我要走出困境,并猜测file_get_contents比preg_match花了更长的时间,我希望它会非常快。

如果您在很多站点上执行此操作,则此方法可能不起作用,但您可能希望查看字节范围请求。如果您可以预测标记位于HTML响应的前X个字节内,则可以使用字节范围执行部分请求,并避免必须通过网络移动整个文档以获取标记标记。如果页面是动态生成的,则需要服务器上的代码支持这一点。如果它们是静态文档,则支持字节范围请求的可能性很大。

https://serverfault.com/questions/398219/how-can-i-enable-byte-range-request

如第二个答案中的示例所示,还可以通过将“Connection:close”更改为“Connection:keep-alive”来尝试启用keepalive。同样,这只有在您多次访问同一服务器并且服务器已启用它时才会起作用。这两件事在一起可以为每个请求节省大量时间。

答案 1 :(得分:0)

您需要一个DOM解析器来快速检索HTML页面信息。我已经使用以下DOM解析器作为示例:

http://simplehtmldom.sourceforge.net/

下载:

http://sourceforge.net/projects/simplehtmldom/files/

例如:

<?php

   include('simplehtmldom_1_5/simple_html_dom.php');

   // Create DOM from URL or file
   $html = file_get_html('http://joinform.com.au');


   foreach($html->find('title') as $e)
      echo $e->innertext . '<br>';


?>