我编写了一个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中的链接获取图片网址?
答案 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;
答案 1 :(得分:2)
我担心你没有太多办法可以加快提取过程本身。一个可能的改进是逐字接近图像提取,即 - 通常强烈反对 - 使用正则表达式关注og:
标签。
如果对源进行了更改,并且显着速度优于更稳定>,那么主要的缺点就是容易破解 DOM解析方法。
我也在缓存一个文本文件,这意味着它在第一次运行后会更快。
另一方面,您可能会采用始终只为用户提供缓存的方法,并在每次请求时根据需要使用异步调用进行更新。
正如CBroe评论你的回答:
没有办法加速重定向。客户端必须提出新请求,这需要花费时间。使用 CURLOPT_FOLLOWLOCATION ,cURL会自动执行此操作,因此您无法插入任何更快的内容。
这意味着不是您网络服务器上的繁重任务,而是冗长,因为它必须执行大量请求。这是开始思考异步的 非常 的良好基础:
如果您沿着这条路走下去,在您的情况下,您将获得以下优势:
但是,以下缺点:
*好消息是,你可以几乎完全消除所有缺点使用循环的,定时的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"元件。当没有其他事情要做时,它可以加快速度,但这是一个顽皮而不是总是在工作的黑客。