Foros del Web » Programando para Internet » PHP »

Capturar tiempo restante (Parser web)

Estas en el tema de Capturar tiempo restante (Parser web) en el foro de PHP en Foros del Web. Buenas, Más de una vez he intentado parsear webs que tienen algún tipo de javascript y no lo consigo. Por ejemplo quiero obtener el tiempo ...
  #1 (permalink)  
Antiguo 01/02/2011, 06:04
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Capturar tiempo restante (Parser web)

Buenas,

Más de una vez he intentado parsear webs que tienen algún tipo de javascript y no lo consigo. Por ejemplo quiero obtener el tiempo restante de la siguiente oferta

http://www.groupon.es/deals/barcelona

11 horas | 2 minutos | 10 segundos

Sin embargo si capturo del código fuente no me muestra el tiempo. Es un elemento javascript...

<div class="counter"><ul><li id="hoursLeft">-</li><li id="minutesLeft">-</li><li id="secondsLeft">-</li></ul></div>

No se como obtener este tipo de información que se genera con javascript a través de un parser web.

Alguna vez os habéis encontrado con este tipo de "elementos webs" que no son parseables? Cómo lo solucionáis?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 01/02/2011, 10:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Capturar tiempo restante (Parser web)

El problema como bien dices es que eso se crea vía Javascript, por lo que no lo puedes capturar así de simple con una expresión regular, ya que tendrías que crear un motor Javascript en PHP para capturar el script y ejecutarlo y ver cual es la salida.

No conozco a la fecha motores de Javascript escritos en PHP por lo que va a ser una tarea algo complicada.

Saludos.
  #3 (permalink)  
Antiguo 02/02/2011, 01:31
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Capturar tiempo restante (Parser web)

Cita:
Iniciado por GatorV Ver Mensaje
El problema como bien dices es que eso se crea vía Javascript, por lo que no lo puedes capturar así de simple con una expresión regular, ya que tendrías que crear un motor Javascript en PHP para capturar el script y ejecutarlo y ver cual es la salida.

No conozco a la fecha motores de Javascript escritos en PHP por lo que va a ser una tarea algo complicada.

Saludos.
Gracias GatorV, sabes como crear ese motor Javascript que comentas aunque no sea con PHP? hiciste algo parecido alguna vez? :D

Muchas gracias
  #4 (permalink)  
Antiguo 02/02/2011, 05:48
 
Fecha de Ingreso: enero-2007
Mensajes: 146
Antigüedad: 17 años, 2 meses
Puntos: 16
Respuesta: Capturar tiempo restante (Parser web)

No creo que sea necesario enrevesar tanto el tema como para crear un intérprete propio de JS.
Partamos de la base sabiendo que si es algo que el propio JS muestra, será porque lo procesa desde un valor público que vaya oculto en el propio código que nos envía el servidor.
Partiendo de esa premisa, he tirado el hilo y en concreto con la página que indicas, tienen oculto un valor que es el tiempo que queda de la oferta:
Código HTML:
Ver original
  1. <input type="hidden" id="currentTimeLeft" value="40641159"/>
Por lo que he visto observando el JS, parece que se trata de milisegundos.

Teniendo eso, creo que no es necesario mucho más para poder parsear el tiempo restante de la oferta :)
  #5 (permalink)  
Antiguo 02/02/2011, 06:31
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Capturar tiempo restante (Parser web)

Cita:
Iniciado por WeSoRz Ver Mensaje
No creo que sea necesario enrevesar tanto el tema como para crear un intérprete propio de JS.
Partamos de la base sabiendo que si es algo que el propio JS muestra, será porque lo procesa desde un valor público que vaya oculto en el propio código que nos envía el servidor.
Partiendo de esa premisa, he tirado el hilo y en concreto con la página que indicas, tienen oculto un valor que es el tiempo que queda de la oferta:
Código HTML:
Ver original
  1. <input type="hidden" id="currentTimeLeft" value="40641159"/>
Por lo que he visto observando el JS, parece que se trata de milisegundos.

Teniendo eso, creo que no es necesario mucho más para poder parsear el tiempo restante de la oferta :)
Gracias WeSoRz es una solución perfecta.

Ahora solo queda coger ese valor y mediante jquery por ejemplo crear el correspondiente contador de tiempo.

Saludos!
  #6 (permalink)  
Antiguo 02/02/2011, 06:48
 
Fecha de Ingreso: enero-2007
Mensajes: 146
Antigüedad: 17 años, 2 meses
Puntos: 16
Respuesta: Capturar tiempo restante (Parser web)

Código Javascript:
Ver original
  1. setTimer: function(){
  2.   currentTimeLeft=parseInt(currentTimeLeft-secondsForTimer);
  3.   if(currentTimeLeft<=0){
  4.     $('#hoursLeft').empty().append("00");
  5.     $('#minutesLeft').empty().append("00");
  6.     $('#secondsLeft').empty().append("00");
  7.     $('#timerBlock').hide();
  8.     Index.getCurrentParticipants(url_prefix_var,true);
  9.     clearInterval(timerTimeLeft);
  10.   } else {
  11.     var wholeSeconds=parseInt(currentTimeLeft/1000);
  12.     var wholeMinutes=parseInt(currentTimeLeft/60000);
  13.     var wholeHours=parseInt(wholeMinutes/60);
  14.     var seconds=parseInt(wholeSeconds&#37;60);
  15.     var minutes=parseInt(wholeMinutes%60);
  16.     var days=parseInt(wholeHours/24);
  17.     var hours=parseInt(wholeHours%24);
  18.     if(wholeHours<10){
  19.       $('#hoursLeft').empty().append("0"+wholeHours);
  20.     }else{
  21.       $('#hoursLeft').empty().append(wholeHours);
  22.     }
  23.     if(minutes<10){
  24.       $('#minutesLeft').empty().append("0"+minutes);
  25.     }else{
  26.       $('#minutesLeft').empty().append(minutes);
  27.     }
  28.     if(seconds<10){
  29.       $('#secondsLeft').empty().append("0"+seconds);
  30.     }else{
  31.       $('#secondsLeft').empty().append(seconds);
  32.     }
  33.   }
  34. }
  35. setInitialTimer: function(){
  36.   if(currentTimeLeft<=0){
  37.     $('#timerBlock').hide();
  38.     Index.getCurrentParticipants(url_prefix_var,true);
  39.     clearInterval(timerTimeLeft);
  40.   }else{
  41.     var wholeSeconds=parseInt(currentTimeLeft/1000);
  42.     var wholeMinutes=parseInt(currentTimeLeft/60000);
  43.     var wholeHours=parseInt(wholeMinutes/60);
  44.     var seconds=parseInt(wholeSeconds%60);
  45.     var minutes=parseInt(wholeMinutes%60);
  46.     var days=parseInt(wholeHours/24);
  47.     var hours=parseInt(wholeHours%24);
  48.     if(wholeHours<10){
  49.       $('#hoursLeft').empty().append("0"+wholeHours);
  50.     }else{
  51.       $('#hoursLeft').empty().append(wholeHours);
  52.     }
  53.     if(minutes<10){
  54.       $('#minutesLeft').empty().append("0"+minutes);
  55.     }else{
  56.       $('#minutesLeft').empty().append(minutes);
  57.     }
  58.     if(seconds<10){
  59.       $('#secondsLeft').empty().append("0"+seconds);
  60.     }else{
  61.       $('#secondsLeft').empty().append(seconds);
  62.     }
  63.   }
  64. }
Ese es el jQuery que utilizan. De todos modos, si estás haciendo el parse en php, obtener las horas, minutos y segundos, es una operación muy sencilla.

EDIT: Cuidado que en la línea 14 me cambia el símbolo del porcentaje por su entidad HTML.
  #7 (permalink)  
Antiguo 02/02/2011, 10:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Capturar tiempo restante (Parser web)

Buena solución WeSoRz

y no es tan sencillo hacer un motor Javascript, preguntale a Google/Mozilla/Microsoft
  #8 (permalink)  
Antiguo 18/02/2011, 12:04
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Capturar tiempo restante (Parser web)

Cita:
Iniciado por WeSoRz Ver Mensaje
EDIT: Cuidado que en la línea 14 me cambia el símbolo del porcentaje por su entidad HTML.
Te recomiendo que coloques un simbolo de % arriba del código y con eso se resuelve, yo siempre hago algo como
Código PHP:
Ver original
  1. // % -> Puedes borrar esta línea es para evitar un error con el highlight
  2. setTimer: function(){
  3.   currentTimeLeft=parseInt(currentTimeLeft-secondsForTimer);
  4.   if(currentTimeLeft<=0){
  5.     $('#hoursLeft').empty().append("00");
  6.     .........

PD: Me gusto tu ejemplo
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Etiquetas: parser
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 02:34.