【问题标题】:PHP/AJAX Image Grabbing script similar to functionality Facebook messagingPHP/AJAX 图像抓取脚本类似于 Facebook 消息传递功能
【发布时间】:2011-01-01 21:03:21
【问题描述】:

在 Facebook 上发送消息时,如果您包含 URL,它通常会从网页中抓取图片并将其作为缩略图添加到底部。然后,您可以选择网站上的许多图片。

我可以看到它是如何构建的,但为了省去麻烦,我想知道是否有人已经以公开的格式完成了它?

谢谢!

【问题讨论】:

标签: php ajax facebook screen-scraping


【解决方案1】:

好的,我为您准备的代码示例太长,无法添加为第一个的注释。所以这是正确的代码,经过验证可以在我的本地 PHP 环境(5.3.1)上运行:

<?php
/**
 * Sample CURL Image Extractor
 * 
 * Prepared for stackoverflow.com 
 *
 * @author Sam Skjonsberg <skoneberg@gmail.com>
 **/

if(!function_exists('json_encode'))
{
    die('You need at least PHP 5.2 to use this script.');
}

//
// JSON & No-Cache Headers
// Uncoment when implemented as an actual JSON service
//
//header('Cache-Control: no-cache, must-revalidate');
// Date in the past to ensure it isn't cached
//header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
//header('Content-type: application/json');
//

//$url      =   parse_url($_REQUEST['url']);
// Harcoded url for demonstration
// Shameless self-plug :)
$url        =   'http://www.codeviking.net';

if(!empty($url))
{       

    if(!preg_match('%^https?://%i', $url))
    {
        echo get_json_error('Invalid URL');
    }

    $ch     =   curl_init();

    curl_setopt_array(  
                        $ch,    
                        array
                        (
                            CURLOPT_URL             =>  $url,
                            CURLOPT_RETURNTRANSFER  =>  true,
                            CURLOPT_FOLLOWLOCATION  =>  true
                        )
                     );

    $html   =   curl_exec($ch);

    if(!empty($html)) 
    {
        $doc                =   new DOMDocument($html);

        $doc->loadHTML($html);

        $images             =   $doc->getElementsByTagName('img');

        $image_srcs         =   array();

        foreach($images as $img) {
            foreach($img->attributes as $attribute_name => $attribute_node)
            {
                if($attribute_name == 'src')
                {
                    $src            =   $attribute_node->nodeValue;

                    // Parse image into absolute URL
                    if(!preg_match('%^https?://%i', $src))
                    {
                        $src    =   $url . '/' . preg_replace('%^\.?/%', '', $src);                         
                    }

                    $image_srcs[]   =   $src;

                }
            }
        }

        echo json_encode($image_srcs);  

        // And there you have it, a collection of image
        // paths to parse through on the client and add <img src="image_src" /> for each.
        //
        // So, for instance as your ajax success callback
        //
        //
        // var images = parseJSON(image_json);
        // for(var i = 0; i < images.length; i++)
        // {
        //  image_src = images[i];
        //  /* Requires jQuery */
        //  $('body').append($('<img />').attr('src', image_src));
        // }
    } 
    else 
    {
        echo get_json_error('Invalid URL');
    }
} 
else 
{
    echo get_json_error('Invalid URL');
}

function get_json_error($msg)
{   
    $error  =   array('error' => $msg);
    return json_encode($error);
}

这确实应该有效。另外,当我试图打破 100 分大关时,我也很感激对答案进行投票!谢谢,祝你好运!

【讨论】:

    【解决方案2】:

    确实应该不难实现。编码很有趣,拿来玩吧:

    $ch = curl_init();
    
    curl_setopt_array($ch, array(CURLOPT_URL => $_POST['url'], CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER, true));
    
    $results = curl_exec($ch);
    
    $doc = new DOMDocument();
    
    $doc->loadHTML($results);
    
    $images = $doc->getElementsByTagName('img');
    

    我相信这应该返回一个 DOMNodeList —— 从那里你遍历并提取每个图像的 src 属性,将其粘贴到 json_encode() 中,然后编写一个漂亮的 web 服务来提交一个 url 并返回漂亮的小集合图片。

    我意识到这不是你想要的,而是一个开始。

    【讨论】:

    • 谢谢伙计,我认为 FB 拥有的时髦 UI 需要时间来构建。如果我必须从头开始构建它,我想没什么大不了的......总是尽量避免重新发明轮子。
    • 我正在尝试运行示例,我尝试实现一个“基本”脚本: $ch = curl_init(); $url = "altavista.com"; curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER, true)); $results = curl_exec($ch); $doc = 新的 DOMDocument(); $doc->loadHTML($results); $images = $doc->getElementsByTagName('img'); var_dump($images); ?> 但是我得到了这个:警告:DOMDocument::loadHTML() [domdocument.loadhtml]: Empty string 作为输入提供在 /Applications/MAMP/htdocs/raw.php 第 11 行 object(DOMNodeList)#2 (0) { }
    • 我希望我知道如何在这里粘贴代码,对不起,我是新手.. 花了 20 分钟试图解决它:(
    • 今晚我下班的时候给我——我会帮你看看:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2013-06-18
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多