Foros del Web » Programando para Internet » PHP »

Extraer informacion de una web

Estas en el tema de Extraer informacion de una web en el foro de PHP en Foros del Web. Q tal? Necesito hacer que me extraiga solo una parte de un contenido que tenga la web, o sea: (ejemplo) En un foro pre-fabricado --> ...
  #1 (permalink)  
Antiguo 27/06/2007, 14:57
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Extraer informacion de una web

Q tal?
Necesito hacer que me extraiga solo una parte de un contenido que tenga la web, o sea: (ejemplo)
En un foro pre-fabricado --> mensajes de hoy. Necesito que me muestre en mi web los mensajes de hoy de esa página web...
¿Cómo hago para que ésto sea posible?
Es decir, necesito que me extraiga solamente el contenido, el usuario, el topic, fecha, etc...
Pero fue solo un ejemplo, no es ésto lo que espécíficamente tengo que hacer... pero es algo similar...

Espero sus ayudas lo más rápido posible..
Gracias
  #2 (permalink)  
Antiguo 27/06/2007, 16:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Extraer informacion de una web

Puedes usar fsockopen para abrir la pagina web, luego usar preg_match para seleccionar en base a expresiones regulares el contenido que necesites e irlo almacenando en variables.

Saludos.
  #3 (permalink)  
Antiguo 27/06/2007, 17:21
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Re: Extraer informacion de una web

Me podrías dar un minimo resumen de como sería un script similar a lo que yo busco? de todas maneras estoy investigando a full con el tema este...

Gracias GatorV...
  #4 (permalink)  
Antiguo 27/06/2007, 17:58
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Re: Extraer informacion de una web

Por cierto, es de carácter urgente resolver este problema...
Como a mi me gusta ayudar los demás, ni bien inician un topic... me gustaría que me den una mano a mi también... jajajaj lo digo de buen humor.. no se lo tome a nadie mal... lo que estoy diciendo jaja :)


EDIT: Edito, porque no quiero postear tan seguido... xD

Código:
<?php
$contenido=file_get_contents('http://www.cristalab.com/foros');
$regexp='/(?:<br \/>)(?:<a href="profile\.php.*>)?(.+)(?:<\/a>)?(?:\ <a href="viewtopic\.php.*"><img src="templates\/smartBlue\/images\/icon_latest_reply\.gif")/';
preg_match_all($regexp,$contenido,$matches);
print($contenido);
?>
Ese es un ejemplo de un tutorial que lei por ahi, ahora,.. como hago para extraer cualquier parte de la web, cualquiera, la que les guste...?
Gracias...
Obviamente el print($contenido) no tiene que ir, porque sino, estaría mostrando la web del tutorial..
Grax

Última edición por carmagedon; 27/06/2007 a las 18:41
  #5 (permalink)  
Antiguo 27/06/2007, 21:06
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Re: Extraer informacion de una web

Por favor, creo que GatorV podrás sacarme del paso...
Vos sabés que esa web está formada asi: web.com/archivo.php?varaible=33... es decir, recibe un valor de un formulario por medio de post... y no se como hacer para extraer el contenido de ese enlace, porque no tiene nada "web.com/archivo.php?varaible=33" si no se completa un formulario previamente, si hubiera estado en GET no existiría ningun problema...
A ver... es carácter urgente :P
Saludetes
  #6 (permalink)  
Antiguo 27/06/2007, 22:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Extraer informacion de una web

Si lo que quieres es enviar una variable por medio de POST, vas a tener que usar fsockopen y escribir en las cabeceras que vas a hacer un POST y no un GET, posteriormente enviar la variable y recibir el resultado.

Para facilidad te recomiendo usar la clase Snoopy ya que tiene metodos para enviar variables via POST.

Saludos.
  #7 (permalink)  
Antiguo 28/06/2007, 10:18
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Re: Extraer informacion de una web

Pues no hay caso...

Código:
<?php
$destino = "www.php.net";
$da = fsockopen($destino, 80, $errno, $errstr, 30); 
if (!$da) {
    echo "$errstr ($errno)<br />\n";
} else {
    $salida = "POST / HTTP/1.1\r\n";
    $salida .= "Host: $destino\r\n";
    $salida .= "Connection: Close\r\n\r\n";

    fwrite($da, $salida);
    while (!feof($da)) {
        $extract = fgets($da, 128); ##Extraigo
    }
    preg_match( "/^div id='leftbar'/" , $extract , $guarda , PREG_OFFSET_CAPTURE);
    print_r($guarda);
    fclose($da);
}
?>
No hace nada, yo lo que quiero es que aunque sea, que me tire el contenido del div id='leftbar'/... es para probar... pero me tira, diciendo Array ()
  #8 (permalink)  
Antiguo 28/06/2007, 11:32
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Extraer informacion de una web

En tus cabeceras dices que haces un POST pero sin embargo no envias ninguna variable, adicionalmente necesitas especificar el encoding que debe ser application/www-url-encoded, y tambien el tamanio de las variables que debes de obtener, luego te recomiendo hacer un echo $extract para que veas si estas recibiendo la pagina completa. (Ya que estas usando $extract = en lugar de $extract .= para concatenar).

Saludos.
  #9 (permalink)  
Antiguo 28/06/2007, 12:33
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Re: Extraer informacion de una web

El grave problema que se me presenta, es que la página web de la cual tengo que acceder me dice lo siguiente:

Código:
Warning: fsockopen() [function.fsockopen]: unable to connect to http://PAGINAWEB.com/index.php:80 (Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?) in C:\EasyPHP 2.0b1\www\index.php on line 44
Unable to find the socket transport "http" - did you forget to enable it when you configured PHP? (60488448)
Hmmm... porqué puede ser?
El tema es que no se aplicar lo de encoding...

PD: Por favor, no me mostrarías un ejemplo que vos tengas, que funcione? porque ya no se que hacer... gracias de antemano.

Última edición por carmagedon; 28/06/2007 a las 12:38
  #10 (permalink)  
Antiguo 28/06/2007, 12:41
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Extraer informacion de una web

Creo vas a tener que resolver antes de eso lo de los sockets, si te esta saliendo eso es porque no tienes soporte para abrir paginas via http, aunque no se que codigo estes utilizando ya que en si deberias de poner solo la direccion sin http.

Como te dije en un post anterior, es mas facil si utilizas la clase Snoopy tiene muchisimos metodos que te pueden ahorrar trabajo.

Saludos.
  #11 (permalink)  
Antiguo 28/06/2007, 12:46
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Re: Extraer informacion de una web

Estoy viendo eso de Snoppy, luego te aviso.
Con respecto a la dirección, pues si le saco el HTTP, me dice lo siguiente:
Código:
Warning: fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: Host desconocido. in C:\EasyPHP 2.0b1\www\index.php on line 45
Warning: fsockopen() [function.fsockopen]: unable to connect to www.paginaweb.com/index.php:80 (Unknown error) in C:\EasyPHP 2.0b1\www\index.php on line 45
(60488132)
Código:
Linea 45
$destino = "www.paginaweb.com/index.php";
$abrir = fsockopen($destino,80,$errno,$errstr,30);
Ahora me pongo a investigar sobre la clase Snoopy... que no lo conozco...
  #12 (permalink)  
Antiguo 28/06/2007, 12:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Extraer informacion de una web

Código PHP:
$destino "www.paginaweb.com"
Para obtener index.php tienes que pasarlo en la cabecera ya sea en POST o GET:
Código PHP:
$header "GET /index.php /HTTP1.1"
  #13 (permalink)  
Antiguo 28/06/2007, 13:16
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Re: Extraer informacion de una web

No me gusta postear tan seguido en un mismo topic, prefiero evitar tantos post para estar en algo inconcluso... te envié un PM, si lo podemos solucionar por privado joya, porque ya que sos el unico en que me ayuda ern este problema. Luego, si lo podemos resolver en pm, publico la respuesta de mi problema, por si alguien lo tiene o lo puede llegar a nacesitar...
Gracias..
  #14 (permalink)  
Antiguo 28/06/2007, 14:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Extraer informacion de una web

Te respondo por aca.

Mira puedes usar esta funcion:
Código PHP:
function httpSocketRequest($host$method$path$data) {
    
$method strtoupper($method);

    if (
$method == "GET") {
        
$path.= '?'.$data;
    }

    
$filePointer fsockopen($host80$errorNumber$errorString);

    if (!
$filePointer) {
        echo 
$errorNumber ":" $errorString;
        return 
false;
    }

    
$requestHeader $method." ".$path."  HTTP/1.1\r\n";
    
$requestHeader.= "Host: ".$host."\r\n";
    
$requestHeader.= "User-Agent:      Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0\r\n";
    
$requestHeader.= "Content-Type: application/x-www-form-urlencoded\r\n";

    if (
$method == "POST")    {
        
$requestHeader.= "Content-Length: ".strlen($data)."\r\n";
    }
    
    
$requestHeader.= "Connection: close\r\n\r\n";
    
    if (
$method == "POST") {
        
$requestHeader.= $data;
    }          

    
fwrite($filePointer$requestHeader);
    
    
$responseHeader '';
    
$responseContent '';

    do {
        
$responseHeader.= fread($filePointer1);
    } while (!
preg_match('/\\r\\n\\r\\n$/'$responseHeader));
    
    while (!
feof($filePointer)) {
        
$responseContent.= fgets($filePointer128);
    }
       
    return 
chop($responseContent);

La llamas en dado caso asi:
Código PHP:
$postarr = array();
$postarr['var1'] = "valor1";
$postarr['var2'] = "valor2";
$postarr['var3'] = "valor3";
$data http_build_query$postarr );
$contenido httpSocketRequest"mipaginaweb.com""post""/index.php"$data ); 
Esto te debe de regresar el contenido de una web y pasarle los parametros por POST.

Saludos.
  #15 (permalink)  
Antiguo 28/06/2007, 15:10
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Re: Extraer informacion de una web

En $postarr que pongo exactamente?? Porque el contenido lo tengo en TR distintos... o sea, el contenido está todo en una tabla...
Se hacen llamar <td class=a1> y cambian el valor de a los otros TD...

Gracias!
  #16 (permalink)  
Antiguo 28/06/2007, 15:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Extraer informacion de una web

$postarr es un arreglo con las variables que quieras enviar via POST al destino, esa funcion ya te regresa todo el contenido (html) el cual tu tienes que ya analizar y usar si lo requieres preg_match.

Saludos.
  #17 (permalink)  
Antiguo 28/06/2007, 15:25
 
Fecha de Ingreso: abril-2007
Mensajes: 144
Antigüedad: 17 años
Puntos: 4
Re: Extraer informacion de una web

Hola.
Tadabia no entiendo muy bien que pretendes hacer carmagedon.
Pero si lo que quieres es extraer contenido de una web ¿No seria mejor si la cargas con fopen y despues ya seleccionas la parte que te intersa?
  #18 (permalink)  
Antiguo 28/06/2007, 15:31
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Re: Extraer informacion de una web

Sería muy sencillo hacerlo asi xDDDDDDD
Me gustaría estar en vos para ver como lo harías... jajajaja... aun estoy viendo como hacerlo funcionar al script de GatorV...
  #19 (permalink)  
Antiguo 28/06/2007, 15:43
 
Fecha de Ingreso: abril-2007
Mensajes: 144
Antigüedad: 17 años
Puntos: 4
Re: Extraer informacion de una web

Ha, que no vi que la pagina que quieres extraer se crea con una variable enviada por post. Entonces el fopen no vale. Perdon no vi el post donde esplicabas esto.

Pues creo que la solucion de GatorV va ha ser la mejor.
  #20 (permalink)  
Antiguo 28/06/2007, 15:44
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Re: Extraer informacion de una web

GatorV:

Código:
$postarr['variable1'] = $numero_enviado;
$postarr['variable2'] = "2";
$postarr['Submit'] = "Enviar";
$data = http_build_query( $postarr );
$contenido = httpSocketRequest("www.web.com", "post", "/archivo.php", $data);  
print_r($contenido);
Al hacer el print_r($contenido) lo que me dice es esto:
3680936818

¿A qué se debe?
  #21 (permalink)  
Antiguo 28/06/2007, 15:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Extraer informacion de una web

Es lo que te esta enviando de regreso el servidor, deberias de checar si sin usar el script (inyectando de manera manual) el url sirve igual a lo mejor creando un formulario y ves que salida te da.

Saludos.
  #22 (permalink)  
Antiguo 28/06/2007, 15:59
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Re: Extraer informacion de una web

Obviamente tengo un formulario con un input con el name = numero_enviado;
Al completar el form se ejecuta tu script y me muestra ese mensaje... mejor dicho, ese número... lo ideal sería que me muestre (como ya dije previamente) el contenido de las tablas... voy a seguir inspeccionando el código.. a ver q puedo hacer...

Saludos
  #23 (permalink)  
Antiguo 28/06/2007, 16:16
 
Fecha de Ingreso: abril-2007
Mensajes: 144
Antigüedad: 17 años
Puntos: 4
Re: Extraer informacion de una web

Pues a mi me funciona perfectamente la funcion que a puesto GatorV
  #24 (permalink)  
Antiguo 30/06/2007, 13:01
Avatar de carmagedon  
Fecha de Ingreso: junio-2005
Ubicación: Argentina
Mensajes: 794
Antigüedad: 18 años, 10 meses
Puntos: 23
Re: Extraer informacion de una web

Qué raro que te funcione perfectamente, si podés mostrame con que web probaste y que formulario hiciste para que te funcione... porque ya no se que hacer... me dijieron que pruebe en borrar el easyphp y en instalar php + mysql + apache por separado... no se... creo que no sería un grave problema eso... yo trabajo con php5...
Hmm por favor, fijate si me podés poner con que web probaste y que te funcionó...
Se que seguro estoy cansando a todos con este topic, pero no logro hacerlo funcionar... ese es el problema...
Gracias
  #25 (permalink)  
Antiguo 30/06/2007, 15:41
 
Fecha de Ingreso: abril-2007
Mensajes: 144
Antigüedad: 17 años
Puntos: 4
Re: Extraer informacion de una web

No hay que hacer ningun formulario.
El formulario seria solo para probar el server en caso de que no te funcione.

Yo tengo PHP4.4, y lo probe con una pagina mia, pidiendo una pagina de respuesta a un formulario de registro que tambien es mia y esta en el mismo site, y he probado que carga la pagina correctamente y los datos en post los procesa bien. Funciona como tiene que funcionar.

revisa el codigo, no pongas ningun formulario, solo pasale el valor de las variables en el array $postarr , asegurate de que los nombres de las variables y su valor son correctos para el formulario de la pagina que pretendes cargar.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:01.