Problemas con cURL

Iniciado por #Aitor, 8 Enero 2014, 18:47 PM

0 Miembros y 1 Visitante están viendo este tema.

#Aitor

Buenas... estaba siguiendo unos 'cursos' si así se pueden llamar de cURL, en el cual uno de los ejercicios, era extraer los subscriptores que tenía un canal de youtube...

El problema está, en que, por alguna razón no puedo extraer nada, porque no guarda nada, o al menos el array se encuentra completamente vacio...

Código (php) [Seleccionar]
<?php
// Variable url.
$url 'http://www.youtube.com/user/'.$_POST['user'].'/about';

// Curl-bot.
$ch curl_init();
curl_setopt($chCURLOPT_URL$url);
curl_setopt($chCURLOPT_USERAGENT'Mozilla/4.0 (compatible; MSTE 5.01; Windows NT 5.0');
curl_setopt($chCURLOPT_HTTPHEADER, array('Accept-Language: es-es,en'));
curl_setopt($chCURLOPT_TIMEOUT10);
curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);

// Guardar en página.

$result curl_exec($ch);
$error curl_error($ch);
curl_close($ch);
echo $error;


// Parsear.

preg_match_all('(<ul class="about-stats"><li class="about-stat"><span class="about-stat-value">(.*)</span> suscriptores</li>)'$result$sus);
$susR $sus[1][0];
  print_r($sus);
  echo 'Suscriptores: ' $susR;

?>


Formulario.html
Código (php) [Seleccionar]
<html>
<head><title>Prueba con bots</title></head>

<body>

<form method="POST" action="bots.php">
<input type="text" name="user"/>
<input type="Submit" value="INTRODUCIR USUARIO DE YOUTUBE"/>
</form>

</body>
</html>




Resultado:
Código (html) [Seleccionar]
Notice: Undefined offset: 1 in C:\xampp1\htdocs\PHP\Bots\bots.php on line 25
Array ( [0] => Array ( ) [1] => Array ( ) ) Suscriptores:

Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

#Aitor

#1
Ya está solucionado, pero no termino de entender por qué, con esto si funciona:

Código (php) [Seleccionar]
preg_match_all("(<span class=\"about-stat-value\">(.*)</span> suscriptores)", $result, $sus);

Pero con el otro no, cuando es el mismo código pero un poquito más largo, de hecho como este había uno identico, por lo que pensé que tendría que coger más trozo para que no se equivocase...

Si alguien pudiese aclararme eso, se lo agradezco, saludos!
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

Shell Root

#2
Supongo, aunque no estoy seguro, que es porque tiene un salto de linea, es decir,... es diferente ver esto:
Código (html4strict) [Seleccionar]
<li class="about-stat">
  <span class="about-stat-value">88</span> suscriptores
</li>


a esto:
Código (html4strict) [Seleccionar]
<li class="about-stat"><span class="about-stat-value">88</span> suscriptores</li>




Ahora para que se entienda lo que quiero decir, realizamos un preg_replace para que elimine todos los saltos de linea, así:
Código (php) [Seleccionar]
$result = preg_replace("/\r\n+|\r+|\n+|\t+/i", " ", $result);
Printeamos la variable de $result y vemos el código fuente queda en 1 sola linea, buscamos lo que nos interesa y vemos que quedo así:
Código (html4strict) [Seleccionar]
<li class="about-stat">         <span class="about-stat-value">88</span> suscriptores       </li>
Queriendo decir qué si ponemos esa string para que matchee en el preg_match_all, debería de darnos el resultado real:
Código (php) [Seleccionar]
preg_match_all('(<li class="about-stat">         <span class="about-stat-value">(.*)</span> suscriptores       </li>)', $result, $sus);




De momento sólo se me ocurre agregarle el salto de linea para evitar el preg_replace, quedando: -no me la llevo muy bien con las expresiones regulares, así que sale medio feo-
Código (php) [Seleccionar]
preg_match_all('(<li class="about-stat">([\n*])<span class="about-stat-value">(.*)</span> suscriptores)', $result, $sus);
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

#Aitor

Cita de: @shellroot en  9 Enero 2014, 06:57 AM
Supongo, aunque no estoy seguro, que es porque tiene un salto de linea, es decir,... es diferente ver esto:
Código (html4strict) [Seleccionar]
<li class="about-stat">
  <span class="about-stat-value">88</span> suscriptores
</li>


a esto:
Código (html4strict) [Seleccionar]
<li class="about-stat"><span class="about-stat-value">88</span> suscriptores</li>




Ahora para que se entienda lo que quiero decir, realizamos un preg_replace para que elimine todos los saltos de linea, así:
Código (php) [Seleccionar]
$result = preg_replace("/\r\n+|\r+|\n+|\t+/i", " ", $result);
Printeamos la variable de $result y vemos el código fuente queda en 1 sola linea, buscamos lo que nos interesa y vemos que quedo así:
Código (html4strict) [Seleccionar]
<li class="about-stat">         <span class="about-stat-value">88</span> suscriptores       </li>
Queriendo decir qué si ponemos esa string para que matchee en el preg_match_all, debería de darnos el resultado real:
Código (php) [Seleccionar]
preg_match_all('(<li class="about-stat">         <span class="about-stat-value">(.*)</span> suscriptores       </li>)', $result, $sus);




De momento sólo se me ocurre agregarle el salto de linea para evitar el preg_replace, quedando: -no me la llevo muy bien con las expresiones regulares, así que sale medio feo-
Código (php) [Seleccionar]
preg_match_all('(<li class="about-stat">([\n*])<span class="about-stat-value">(.*)</span> suscriptores)', $result, $sus);

Curioso cuanto menos, esa forma de conseguir el código en una linea sin problemas.

Muchísimas gracias por la ayuda, funciona perfectamente.

Un saludo!

Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

EFEX

Tambien con php se puede obtener, crear, modificar elementos DOM. Como por ejemplo la clase DOMDocument, pero no soporta atributos de tipo 'class=nombreClase' en vez tenes que utilizar DOMXPath para buscar cada clase y retornar la deseada, creo.

Pero por suerte existe otra clase Simple HTML DOM Parser, hasta utiliza selectores tal como jquery, muy util.

Código (php) [Seleccionar]

include_once('simple_html_dom.php'); //incluimos la clase

$result = '<li class="about-stat"><span class="about-stat-value">6</span>Subscribers</li>';

$html = str_get_html($result); //Crear elementos DOM a partir de un string tambien puede ser desde un sitio pero con file_get_html($html)
$found =  $html->find('.about-stat-value', 0)->plaintext; //Buscamos el primer elemento con el atribudo class=about-stat-value y obtenemos su contenido

echo 'Suscriptores: ' . $found ;


http://simplehtmldom.sourceforge.net/
http://simplehtmldom.sourceforge.net/manual.htm
GITHUB