最快和最快检索文章最终URL和图像的有效方法

时间:2015-01-19 11:48:52

标签: php curl

我编写了一个PHP脚本来解析RSS源并尝试从og:image元标记中获取打开的图形图像。

为了获取图像,我需要检查RSS源中的URL是否为301重定向。这经常发生,这意味着我需要遵循任何重定向到结果URL。这意味着脚本运行得非常慢。是否有更快更有效的方法来实现这一目标?

以下是获取最终网址的功能:

function curl_get_contents($url) {
$agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result=curl_exec($ch);
return $result; 
}

这是检索og图像的功能(如果存在):

function getog($url) {
    $doc = new DomDocument();
    $doc->loadHTML(curl_get_contents($url));
    if($doc == "") {return;}
    $xpath = new DOMXPath($doc);
    $query = '//*/meta[starts-with(@property, \'og:\')]';
    $queryT = '';
    $metas = $xpath->query($query);
    foreach ($metas as $meta) {
        $property = $meta->getAttribute('property');
        $content = $meta->getAttribute('content');
        if($property == "og:url"   && $ogProperty['url'] == "")     {$ogProperty['url'] = $content;}
        if($property == "og:title" && $ogProperty['title'] == "")   {$ogProperty['title'] = $content;}
        if($property == "og:image" && $ogProperty['image'] == "")   {$ogProperty['image'] = $content;}
    }
    return $ogProperty;
}

脚本还有很多,但这些功能是瓶颈。我也在缓存文本文件,这意味着它在第一次运行后速度更快。

如何加快我的脚本以检索最终的网址并从RSS Feed中的链接获取图片网址?

3 个答案:

答案 0 :(得分:10)

您可以使用Facebook的OG API。 Facebook使用它从任何URL中删除重要信息。 与通常的刮擦方法相比,它非常快。

你可以像这样工作..

og_scrapping.php:

    function meta_scrap($url){
        $link = 'https://graph.facebook.com/?id='.$url.'&scrape=true&method=post';
        $ch = curl_get_contents($link);
        return json_decode($ch);
    }

然后在包含og_scrapping.php之后随便调用它     print_r(meta_scrap('http://www.example.com'); 您将获得一个阵列,然后您可以根据需要获得选择性内容。

对于标题,图片,网址和说明,您可以通过以下方式获取:

$title = $output->title;
$image = $output->image[0]->url;
$description = $output->description;
$url = $output->url;  

报废图像时出现严重问题。获得标题和描述很容易。阅读this文章,以更快的方式获取图片。此外this将帮助您节省几秒钟。

答案 1 :(得分:2)

我担心你没有太多办法可以加快提取过程本身。一个可能的改进是逐字接近图像提取,即 - 通常强烈反对 - 使用正则表达式关注og:标签。

如果对源进行了更改,并且显着速度优于更稳定,那么主要的缺点就是容易破解 DOM解析方法。


  

我也在缓存一个文本文件,这意味着它在第一次运行后会更快。

另一方面,您可能会采用始终只为用户提供缓存的方法,并在每次请求时根据需要使用异步调用进行更新。

正如CBroe评论你的回答:

  

没有办法加速重定向。客户端必须提出新请求,这需要花费时间。使用 CURLOPT_FOLLOWLOCATION ,cURL会自动执行此操作,因此您无法插入任何更快的内容。

这意味着是您网络服务器上的繁重任务,而是冗长,因为它必须执行大量请求。这是开始思考异步的 非常 的良好基础:

  1. 您收到正在查找RSS项目的请求
  2. 您可以从缓存中快速响应,
  3. 如果需要,您发送异步请求来重建缓存 - 由于重定向和DOM解析,这是最长的部分,但请求RSS项列表的原始客户端/对等方不必等待此操作完成;也就是说,对于这个列表,只需要一些时间来发送重建请求本身,几微秒,
  4. 您使用缓存的项目返回。
  5.   

    Asynchronous shell exec in PHP

    如果您沿着这条路走下去,在您的情况下,您将获得以下优势:

    • 以高加载速度提供快速内容,
    • 重建缓存时没有加载速度降低。

    但是,以下缺点

    • 第一个请求更新Feed的用户不会立即* 收到最新的商品,
    • 后续用户在第一个用户之后立即* 收到最新项目,直到缓存准备就绪。

    *好消息是,你可以几乎完全消除所有缺点使用循环的,定时的AJAX请求来检查RSS项目缓存中是否有任何新项目。

    如果有,您可以在顶部(或底部)显示消息,通知用户新内容的到达,并在用户点击通知时附加该内容。

    这种方法 - 与简单地始终在没有循环AJAX调用的情况下提供缓存内容相比 - 减少了网站上实时RSS外观和项目外观之间的延迟,最大时间为n + m,其中n为AJAX请求间隔,m是重建缓存所需的时间。

答案 2 :(得分:1)

Meta存储在" head"元件。

在你的Xpath中,你必须考虑head元素:

$query = '//head/meta[starts-with(@property, \'og:\')]';

当你可以在结束" head"之后停止检索时,你会丢失一些时间来检索,存储和解析整个html文件。元件。另外,为什么在只需要1k时获得40k网页?

你"可能"考虑在结束后停止检索" head"元件。当没有其他事情要做时,它可以加快速度,但这是一个顽皮而不是总是在工作的黑客。