Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: javirk en 22 Marzo 2012, 22:23 pm



Título: Extraer contenido de una tabla de otra web
Publicado por: javirk en 22 Marzo 2012, 22:23 pm
Hola, creo que la pregunta está clara, no sé cómo sacar el contenido de una web para ponerlo en la mía, o usarlo en parte. Sería una imagen de imdb.com, en concreto el cartel de una película, que va dentro de estas líneas:
Código
  1. <td rowspan="2" id="img_primary">
  2.  
  3.  
  4. <a    onclick="(new Image()).src='/rg/title-overview/primary/images/b.gif?link=%2Fmedia%2Frm3162935808%2Ftt0072431';"     href="/media/rm3162935808/tt0072431"    ><img src="http://ia.media-imdb.com/images/M/MV5BMTc2MzgwNjAzNV5BMl5BanBnXkFtZTcwNTUyNjQzMQ@@._V1._SY317_CR7,0,214,317_.jpg"
  5.     style="max-width:214px; max-height:317px;"
  6.     height="317"
  7.     alt="El jovencito Frankenstein Poster"
  8.     title="El jovencito Frankenstein Poster"
  9.     itemprop="image" /></a>
  10.  
  11. </td>

A mí me gustaría sacar esa imagen, la que está entre <img>, claro, pero teniendo en cuenta que cambia según la película que busque.

La forma que se me ocurre es que PHP saque el código HTML generado y que busque la cadena de texto que le diga, en este caso la etiqueta <td rowspan="2" id="img_primary">, y que saque lo que hay ahí hasta que ponga </td>, pero no estoy seguro de que esto se pueda hacer, ¿alguna ayuda?

Un saludo y gracias.


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: Shell Root en 23 Marzo 2012, 17:27 pm
:http://pastebin.com/8QYAeXpQ


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: #!drvy en 23 Marzo 2012, 18:03 pm

El eregi ya no se recomienda usarlo pues esta marcado como obsoleto en php 5.3.


Saludos


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: javirk en 24 Marzo 2012, 14:26 pm
vale, lo he conseguido, pero tengo unos cuantos problemas. Dejo lo que tengo:

función extraer, que quita una parte de una cadena:
Código
  1. function extraer($cadena,$antes,$despues,$cuenta)
  2. {
  3.  /*Función para obtener extraer una subcadena
  4.   Creado por johandebruin.com el 29-12-2009*/
  5.  if(!$cuenta)
  6.    return false;
  7.  $localizacion1 = $localizacion2 = 0;
  8.  do
  9.  {
  10.    $localizacion1 = strpos($cadena,$antes,$localizacion1 + 1);
  11.    if($localizacion1 == false)
  12.      return false;
  13.    $cuenta--;
  14.  } while ($cuenta > 0);
  15.  $localizacion2 = strpos($cadena, $despues, $localizacion1 + 1);
  16.  if ($localizacion2 == false)
  17.    return false;
  18.  $localizacion1 += strlen($antes);
  19.  return substr($cadena,$localizacion1,$localizacion2 - $localizacion1);
  20. }

función que saca la URL de una web:
Código
  1. <?php
  2. class Url{
  3. public $mi_cadena;
  4. public $archivo;
  5. public $url;
  6.  
  7. public function sacar_url($mi_url){
  8. $this->archivo = fopen("$mi_url","r") or die ("No se ha encontrado la pagina.");
  9. while(!feof($this->archivo)){
  10. $this->cadena .= fgets($this->archivo, 4096);
  11. }
  12. }
  13. }
  14. ?>

Código
  1. <div id="cont_center" >
  2. <?php
  3. $email = $_SESSION["email_user"];
  4. $sql = sprintf("select users_pelis.id_usuario, users_pelis.id_peli, users.email from users_pelis, users where users.email='%s' AND users_pelis.id_usuario = users.id_usuario", mysql_real_escape_string($email));
  5. $usuario->consulta($sql);
  6. $usuario->extraer_registro();
  7. $fuente = new Url();
  8.  
  9. while($usuario->extraer_registro()){
  10. $cartel = $usuario->resultado['id_peli'];
  11. $url = "http://www.imdb.com/title/tt$cartel/";
  12. $fuente->sacar_url($url);
  13. //echo $fuente->cadena;
  14. $cadena_comienzo = '<table border="0" cellpadding="0" cellspacing="0" id="title-overview-widget-layout">
  15. <tr>';
  16. $cadena_fin = '<td id="overview-top">';
  17. echo extraer($fuente->cadena, $cadena_comienzo, $cadena_fin, 1);
  18.  
  19. }

En al bd tengo un id_usuario con un id_peli juntos, y el id_usuario tiene en otra tabla sus cosas asociadas, pero al ejecutar esto sólo me muestra la segunda fila, es decir, tengo en la bd:
id_usuario-----id_peli
1---------------34
1---------------65

Pero al ejecutar sólo sale el cartel correspondiente al id_peli 65, no el otro. ¿Sabéis por qué puede ser?

Un saludo.


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: dimitrix en 26 Marzo 2012, 23:11 pm
El eregi ya no se recomienda usarlo pues esta marcado como obsoleto en php 5.3.


Saludos

Es cierto, pero no sabes como me toca las *****.

Más que nada por que no encontré ninguna alternativa 'similar' ¿Me recomiendas alguna?


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: Shell Root en 27 Marzo 2012, 02:11 am
:http://www.php.net/manual/es/function.preg-match.php


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: dimitrix en 27 Marzo 2012, 10:42 am
:http://www.php.net/manual/es/function.preg-match.php

Shell Root El problema es que no es 'igual'.


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: Pazador en 27 Marzo 2012, 17:47 pm
Código:
http://php.net/manual/es/function.stripos.php


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: Shell Root en 27 Marzo 2012, 20:17 pm
@dimitrix, dime que quieres hacer...


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: dimitrix en 28 Marzo 2012, 01:37 am
@dimitrix, dime que quieres hacer...

Ahora ya lo hice, no me acuerdo que fue, pero recuerdo que eregi iba genial y tenía que migrarlo por que estaba 'obsoleto' y me costó Dios y la madre...


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: Og. en 31 Marzo 2012, 11:06 am
Tal vez esto te sirva de algo.

Código
  1. function getImage($url) { // GET IMDB image
  2.    try {
  3. $doc = new DOMDocument();
  4. $doc->loadHTML( file_get_contents($url) );
  5. $xpath = new DOMXPath($doc);
  6. return $xpath->query('//td[@id="img_primary"]/a/img')->item(0)->getAttribute('src');
  7.    } catch( Exception $e ) { return null; }
  8. }
  9.  
  10. echo getImage("http://www.imdb.com/title/tt0137523/");
  11.  


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: javirk en 31 Marzo 2012, 14:00 pm
Muchas gracias Og. ya está funcionando, pero creo que es demasiado lento si quieres hacer más de una petición, hay alguna forma de acelerarlo? De todas maneras, así está bien.

Un saludo!


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: Og. en 31 Marzo 2012, 17:04 pm
Bueno, cada que obtengas una imagen de cierto ID en IMDb puedes descargar y guardar la imagen con un el mismo ID de la entrada en IMDb, y insertar en una tabla de "visitados" una columna que te diga que ya visitaste ese ID.

Entonces el proceso quedaría así:

1.- Conoces el ID de la pag en IMDb
2.- haces una consulta a una tabla de tu DB que te diga si ya tienes esa imagen
si la tienes:
    devuelves el link local de la imagen que ya descargaste
si no la tienes:
    usas la función que te puse arriba para obtener el link de la imagen
    descargas la imagen a tu servidor
    metes un registro en tu DB
    devuelves el link de la imagen que acabas de descargar


Título: Re: Extraer contenido de una tabla de otra web
Publicado por: javirk en 5 Mayo 2012, 17:06 pm
Hola, al final lo hice guardando el link de las imágenes ya visitadas en una base de datos, y todo funcionaba bien en localhost. Pero cuál es mi sorpresa, que al subirlo a un servidor web (nixiweb, en este caso) no se me ven las imágenes, pero en cambio si visito el link de la imagen y vuelvo a entrar, salen bien. He mirado la consola de errores de Chrome y me da un error 403 (Frobidden) para cada link:
"failed to load resource: the server responded with a status of 403 (forbidden)"
 Es raro, porque esto en localhost no pasaba. ¿Puede ser porque nixiweb tenga alguna restricción?

Un saludo y gracias.