Foros del Web » Programando para Internet » PHP »

Problema al obtener Html de una URL

Estas en el tema de Problema al obtener Html de una URL en el foro de PHP en Foros del Web. Hola quiero obtener el contenido de una url, ya he probado algunos metodos y el que más cercano está, es con curl_init() , me devuelve ...
  #1 (permalink)  
Antiguo 09/10/2011, 21:59
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 años
Puntos: 3
Problema al obtener Html de una URL

Hola quiero obtener el contenido de una url, ya he probado algunos metodos y el que más cercano está, es con curl_init(), me devuelve el html correctamente, pero me surge un problema con algunas url, el problema mayor es que mi servidor no soporta la opcion CURLOPT_FOLLOWLOCATION (que seria que si hay una redirección este la siga) (requiere open_basedir ="" y safe_mode = Off) no quisiera modificar esas opciones.

Entonces lo que hice fue curl_getinfo($rch, CURLINFO_HTTP_CODE); y si es = 301 o 302 obtener el Location y consultar esa url, pero esta no devuelve el contenido real, sospecho que me esta faltando asignar alguna cookie, pero es hay donde me travo, si bien se como obtenerla no se como asignarla.

este es el código básico (sin la redención)
Código PHP:
Ver original
  1. function ver($url)
  2. {
  3.  
  4.     $ch = curl_init();
  5.  
  6.     curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1");
  7.     curl_setopt($ch, CURLOPT_HEADER, false);
  8.     curl_setopt($ch, CURLOPT_NOBODY, false);
  9.     curl_setopt($ch, CURLOPT_FORBID_REUSE, false);
  10.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  11.     curl_setopt($ch, CURLOPT_URL, $url);
  12.     //curl_setopt($ch, CURLOPT_COOKIESESSION, true);
  13.     //curl_setopt($ch,  CURLOPT_COOKIEJAR, "listin");
  14.     //curl_setopt($ch,  CURLOPT_COOKIEFILE, "listin");
  15.  
  16.     $tmp = curl_exec($ch);
  17.  
  18.     curl_close ($ch);
  19.     return $tmp;
  20. }

para no dar muchas vueltas alguien sabe como podria obtener el contenido de esta url?

Código:
http://www.taringa.net/posts/reviews/12759660/Como-ver-Cuevana-en-HD-_Facil_.html#pagina-3
como ven es la página 3 de los comentarios.


Saludos.
__________________
www.leandroascierto.com
  #2 (permalink)  
Antiguo 09/10/2011, 22:45
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Problema al obtener Html de una URL

Hace tiempo publique un par de funciones para poder seguir redireccionamientos con cURL cuando por configuracion no se puede (open_basedir y/o safe mode): http://www.forosdelweb.com/f18/aport...bit-ly-808160/

Por lo demas, yo creo que si tendras que darle algunas vueltas, si te atoras con algo (o te mareas), nos muestras tu codigo y trataremos de ayudarte.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 10/10/2011, 00:32
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 años
Puntos: 3
Respuesta: Problema al obtener Html de una URL

Muchas gracias por su respuesta Triby, testie su código pero sigue sin funcionar, de echo no me esta arrojando ningún resultado.
Esto es lo que estoy haciendo.

Código PHP:
Ver original
  1. <?php
  2.  
  3. //--------------------------------------
  4. $url = "http://www.taringa.net/posts/reviews/12759660/Como-ver-Cuevana-en-HD-_Facil_.html#pagina-3";
  5.  
  6. $options[CURLOPT_URL] = $url;
  7. $options[CURLOPT_USERAGENT] = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1";
  8. $options[CURLOPT_FOLLOWLOCATION] = true;
  9. $options[CURLOPT_RETURNTRANSFER] = true;
  10. $data = sm_curl($options);
  11.  
  12. echo $data['response'];
  13. //--------------------------------------
  14.  
  15. function sm_curl($options){
  16.     // Hay que seguir redireccionamientos?
  17.     $follow = (isset($options[CURLOPT_FOLLOWLOCATION])) ? $options[CURLOPT_FOLLOWLOCATION] : false;
  18.  
  19.     // Instanciamos cURL
  20.     $go = curl_init();
  21.     $response = array();
  22.     if(ini_get('open_basedir') != '' || ini_get('safe_mode' == 'On') && $follow) {
  23.         // Aqui entramos solo si hay que seguir redireccionamientos y
  24.         // open_basedir o safe_mode estan activos
  25.  
  26.         // Eliminamos la opcion CURL para seguir redireccionamientos
  27.         unset($options[CURLOPT_FOLLOWLOCATION]);
  28.  
  29.         // Establecemos las opciones
  30.         curl_setopt_array($go, $options);
  31.  
  32.         // Ejecutamos y seguimos redireccionamientos
  33.         $response = curl_redir_exec($go);
  34.     } else {
  35.         curl_setopt_array($go, $options);
  36.         // Ejecutar
  37.         $response['response'] = curl_exec($go);
  38.         $response['headers'] = curl_getinfo($go);
  39.  
  40.         // Obtener errores
  41.         $response['errorNumber'] = curl_errno($go);
  42.         $response['errorMessage'] = curl_error($go);
  43.     }
  44.     curl_close($go);
  45.     return $response;
  46. }
  47.  
  48. // Seguir redireccionamientos con open_basedir o safe_mode = On
  49. function curl_redir_exec($ch) {
  50.     static $curl_loops = 0;
  51.     static $curl_max_loops = 20;
  52.     if ($curl_loops++>= $curl_max_loops) {
  53.         $curl_loops = 0;
  54.         return array('response' => '', 'headers' => '', 'errorNumber' => '47', 'errorMessage' => 'Too many redirects');
  55.     }
  56.     curl_setopt($ch, CURLOPT_HEADER, true);
  57.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  58.     $data = curl_exec($ch);
  59.     $data = str_replace("\n\r", "\n", $data);
  60.     list($header, $data) = explode("\n\n", $data);
  61.     $headers = curl_getinfo($ch);
  62.     $http_code = $headers['http_code'];
  63.     if ($http_code == 301 || $http_code == 302) {
  64.         $matches = array();
  65.         preg_match('/Location:(.*?)\n/', $header, $matches);
  66.         $url = @parse_url(trim(array_pop($matches)));
  67.         if (!$url) {
  68.             //couldn't process the url to redirect to
  69.             $curl_loops = 0;
  70.             return array('response' => '', 'headers' => '', 'errorNumber' => 3, 'errorMessage' => 'The URL was not properly formatted (redirect).');
  71.         }
  72.         $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
  73.         if (!$url['scheme'])
  74.             $url['scheme'] = $last_url['scheme'];
  75.         if (!$url['host'])
  76.             $url['host'] = $last_url['host'];
  77.         if (!$url['path'])
  78.             $url['path'] = $last_url['path'];
  79.         $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
  80.         curl_setopt($ch, CURLOPT_URL, $new_url);
  81.         return curl_redir_exec($ch);
  82.     } else {
  83.         $curl_loops=0;
  84.         return array(
  85.             'response' => $data,
  86.             'headers' => $headers,
  87.             'errorNumber' => curl_errno($ch),
  88.             'errorMessage' => curl_error($ch),
  89.         );
  90.     }
  91. }
  92.  
  93. ?>


Espero pueda ayudarme, desde ya muchas gracias.

Saludos.
__________________
www.leandroascierto.com
  #4 (permalink)  
Antiguo 10/10/2011, 01:46
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Problema al obtener Html de una URL

Que obtienes si usas var_dump($data); ?
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 10/10/2011, 01:58
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 años
Puntos: 3
Respuesta: Problema al obtener Html de una URL

Hola, bien parece que no funcionaba porque es dinámico y utiliza javascript

antes que nada modifique algo en tu funcion

esto
Código PHP:
Ver original
  1. $data = str_replace("\n\r", "\n", $data);
  2.     list($header, $data) = explode("\n\n", $data);

por esto
Código PHP:
Ver original
  1. $pos =  strpos($data,"\n\r");
  2.     $header = substr($data,0, $pos);
  3.     $data = substr($data,$pos + 3 );
ya que sino se corta el html


bien la cuestión es que mostraba el html de la pagina principal al post, asi que agregue #pagina-3 a la url de mi php

http://www.misitio.com/test/test2.php#pagina-3

y salto un script que muestra un error ya que no reconoce el servidor, lo que da nota que se escribe utilizando javascript.

Bien eso aclaro mi duda, lo que no se como resolveré mas adelante jejje.

Gracias por todo.
__________________
www.leandroascierto.com
  #6 (permalink)  
Antiguo 10/10/2011, 03:25
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Problema al obtener Html de una URL

Yo me pregunto porque batallas buscando obtener los comentarios por cURL cuando hay un feed disponible y posiblemente te pueda dar mejores resultados:

<link rel="alternate" type="application/atom+xml" title="Comentarios del post:Cómo ver Cuevana en HD [Fácil]" href="/rss/12759660/comentarios/" />
__________________
- León, Guanajuato
- GV-Foto
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 05:00.