Ver Mensaje Individual
  #3 (permalink)  
Antiguo 20/09/2003, 15:57
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola,

Parece que lo que buscas es una especie de crawler o programa de descargas automatizado, que pueda ser usado para obtener imágenes enlazadas desde una determinada página web. Un ejercicio interesante.

En tal caso, se me ocurre que puede implementarse algo como esto:


Código:
<?php

/*** Variables de control del script ***/

// URL de la pagina web de donde se van a descargar archivos

$url = 'http://www.handyzone.com/galerias/logos/amor/';


// Extensiones usadas para reconocer el tipo de archivos a descargar

$extensiones = array ('jpg', 'gif', 'png');


// Directorio local en donde se guardaran los archivos. Note que esta
// ruta debe terminar en el caracter delimitador de directorios del
// sistema operativo (barra en Unix, o barra invertida en windows, por
// ejemplo). Asegurese de que este directorio tenga los permisos
// apropiados para que este script pueda crear archivos alli.

$directorio = './imagenes/';



/*** Funciones ***/

function descargar_archivo ($url)
{
    $bufer = '';

    if (ini_get ('allow_url_fopen')) {

        // La forma facil...

        $da = fopen ($url, 'r');

        if (! $da) {
            echo "No ha podido leerse el contenido de $url\n";
            return FALSE;
        }

        while (! feof ($da))
            $bufer .= fread ($da, 4096);

        fclose ($da);
    } else {

        // Bueno, tendremos que obtener el archivo remoto directamente
        // mediante comunicacion al nivel de sockets... Nada
        // particularmente complejo despues de todo

        preg_match ('/^\\s*(?:\\w+:\\/{2})?(.*?)(:\\d+)?(\\/.*)$/',
                    $url, $coincidencias);

        $dominio = $coincidencias[1];
        $puerto  = $coincidencias[2];
        $ruta    = $coincidencias[3];

        if (! $puerto)
            $puerto = '80';

        if (! $ruta)
            $ruta = '/';

        $socket = fsockopen ($dominio, $puerto);

        if (! $socket) {
            echo "No pudo establecerse una conexion con $dominio\n";
            return FALSE;
        }

        fwrite ($socket, "GET $ruta HTTP/1.0\n\n");

        while (! feof ($socket))
            $bufer .= fread ($socket, 4096);

        fclose ($socket);

        $bufer = preg_replace ('/^.*?(\\r?\\n){2}/s', '', $bufer);
    }

    return $bufer;
}



/*** Programa principal ***/

echo "<pre>\n";

$documento = descargar_archivo ($url);

if (! $documento)
    exit (1);


// Buscar las etiquetas que crean enlaces hacia otros documentos

preg_match_all ('/<\\s*a\\s+.*?\\bhref=[\'"]?([^\'"\\s>]*)/i',
                $documento, $coincidencias);

$secuencia = $extensiones[0];
for ($i = 1, $conteo = count ($extensiones); $i < $conteo; $i++)
    $secuencia .= '|' . $extensiones[$i];

foreach ($coincidencias[1] as $enlace) {
    if (! preg_match ('/\\.(' . $secuencia . ')$/i', $enlace))
        continue;

    $archivo = preg_replace ('/^.*\\//', '', $enlace);

    if ($enlace{0} == '/') {

        preg_match ('/^\\s*(?:\\w+:\\/{2})?([^\\/]*)/', $url, $coincidencias);
        $enlace_url = $coincidencias[1] . $enlace;

    } else if (preg_match ('/^\\s*\\w+:\\/{2}/', $enlace))
        $enlace_url = $enlace;

    else {
        preg_match ('/^.*\\//', $url, $coincidencias);

        if ($coincidencias[0])
            $enlace_url = $coincidencias[0] . $enlace;
        else
            $enlace_url = $url . '/' . $enlace;
    }

    echo "Descargando $enlace_url ..";

    $contenido = descargar_archivo ($enlace_url);

    if (! $contenido) {
        echo "No pudo descargarse el documento $enlace_url\n";
        continue;
    }

    $da = fopen ("$directorio$archivo", 'w');

    if (! $da) {
        echo "No pudo crearse el archivo $archivo en el disco local\n";
        continue;
    }

    fwrite ($da, $contenido);

    fclose ($da);

    echo "listo\n";
}

echo "</pre>\n";

?>

No lo he probado exhaustivamente, y quizás cometí algún error en alguna parte del código, pero al menos parece obtener el resultado que buscas. :)


Un cordial saludo