PHP Curl获取页面上的第一个图像和前25个单词

时间:2016-09-16 20:28:15

标签: php curl

以下两个函数可以很好地从网址获取元数据。首先,它获取网页的标题,然后搜索opengraph描述标记。如果它没有找到og:description,它将回溯到元描述。

我想要发生的事情是进一步回落所以如果不存在元描述,它将抓住前25个单词的文字。

同样我想在og:image上创建一个后退,所以如果不存在,它将获取它在页面上找到的第一个图像。

function file_get_contents_curl($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

function getit($site) 
{
    $content = file_get_contents_curl($site);
    $doc = new DOMDocument();
    @$doc->loadHTML($content);
    $nodes = $doc->getElementsByTagName('title');
    $node = $doc->getElementsByTagName('img');
    $title = $nodes->item(0)->nodeValue;
    $firstimage = $node->item(0)->getAttribute('src');
    $metas = $doc->getElementsByTagName('meta');

    for ($i = 0; $i < $metas->length; $i++) 
    {
        $meta = $metas->item($i);
        if($meta->getAttribute('property') == 'og:description') 
        {
            $description = $meta->getAttribute('content');
        } 
        elseif ($meta->getAttribute('name') == 'description') 
        { 
            $description = $meta->getAttribute('content'); 
        }
        if($meta->getAttribute('property') == 'og:image') 
        {
        $image = $meta->getAttribute('content'); 
        } 
    }
$str .= 'Title: '.$title.' <br/><br/>';
$str .= 'Description: '.$description.' <br/><br/>';
$str .= 'Image: <img src="'.$image.'">';
$str .= 'Image2: <img src="'.$firstimage.'">';
echo $str;
}

我对使用curl非常陌生,并且根本不熟悉它,所以我真的不知道从哪里开始或结束修改我的代码来实现这一点。我已经将二进制传输选项添加到curl setopt中,因为我相信它需要一个二进制传输来获取图像,但是我真的对我在这里做什么一无所知,并且会对我如何做到这一点表示赞赏?

更新

我更新了上面的代码以删除二进制传输。我还补充了以下内容:

$node = $doc->getElementsByTagName('img');
$firstimage = $node->item(0)->getAttribute('src');

然后出于测试目的,我补充说:

$str .= 'Image2: <img src="'.$firstimage.'">';

所以我现在已经返回了最新的图像,仍然需要弄明白才能获得页面上前25个单词的文字。

1 个答案:

答案 0 :(得分:0)

因此对于25个单词,我调用了第一个段落标记并将其值设置为字符串,然后我展开了字符串并调用了前25个单词。我将它们设置为一个变量,这样它们就可以通过测试轻松回应。

对于第一张图片,我补充道:

$node = $doc->getElementsByTagName('img');
$firstimage = $node->item(0)->getAttribute('src');

然后我做了一个测试,看看og:image是否为空,如果是,我会回显第一张图片。

<?
function file_get_contents_curl($url)
{
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    $data = curl_exec($ch);

    curl_close($ch);

    return $data;
}

function getit($site) {

    $parsing = file_get_contents_curl($site);
    //parsing begins here:
    $doc = new DOMDocument();
    @$doc->loadHTML($parsing);

    $nodes = $doc->getElementsByTagName('title');
    $node = $doc->getElementsByTagName('img');
    $para = $doc->getElementsByTagName('p');
    //get and display what you need:

    $title = $nodes->item(0)->nodeValue;
    $firstimage = $node->item(0)->getAttribute('src');
    $firstparagraph = $para->item(0)->nodeValue;

    $metas = $doc->getElementsByTagName('meta');

    for ($i = 0; $i < $metas->length; $i++)
    {
        $meta = $metas->item($i);
        if($meta->getAttribute('property') == 'og:description') {
            $description = $meta->getAttribute('content');
        } 
        elseif ($meta->getAttribute('name') == 'description') { 
            $description = $meta->getAttribute('content');
        } else { 
            $descrition = "<p>".implode(' ', array_slice(explode(' ', $firstparagraph), 0, 25))."</p>"; 
        }
        if($meta->getAttribute('property') == 'og:image') {
            $image = $meta->getAttribute('content');
        }   
    }   

    if ($image != '') { $image = $image; } else { $image = $firstimage; }

    $str .= 'Title: '.$title.' <br/><br/>';
    $str .= 'Description: '.$description.' <br/><br/>';
    $str .= 'Image: <img src="'.$image.'"><br/><br/>';
    echo $str;
}

?>