Leer código HTML de una página web

2,227 views
Skip to first unread message

ArturoPC

unread,
Apr 14, 2012, 5:46:16 AM4/14/12
to publice...@googlegroups.com
Son 4:30 a.m. en Lima, Perú y despierto pensando en una solución a una necesidad de mis clientes.

Les cuento los antecedentes: Estos clientes trabajan con la Aduana Peruana y desde mi sistema realizan diversas transacciones vía web services. El tema pasa que deben realizar esas transacciones dentro de los plazos establecidos por la ley general de aduanas. A veces, por equis motivos, no se pueden cumplir dichos plazos y hay que pagar una sanción. Si la sanción se paga antes de que Aduanas notifique, se paga solo el 10% de la multa.

Ahora, mis clientes necesitan saber la fecha límite para realizar sus transacciones y la fecha en la que la realizaron. Ya le hemos solicitado a Aduanas que nos brinde esa información vía un webservice, pero el tiempo de espera será alto, ya hemos hecho antes alguna solicitud similar y Aduanas desarrolló la solución como un año después.

Buscando una solución más inmediata se me ocurrió extraer los datos de las consultas que brinda Aduanas a través de su portal. Por ejemplo, si van a este enlace:

Se percatarán que hay un campo que dice "Fecha de llegada" y ese dato es, precisamente, uno de los que necesito.

A la hora de analizar el HTML generado por Aduanas veo el siguiente código:
<TR VALIGN=top><TD ><P><B>Fecha de Llegada: </B></TD> 
<TD>28/03/2012 06:00</TD> 
<VALIGN=top><TD ><P><B>P.Bruto: </B></TD> 
<TD>23,231,020.04</TD></TR>

¡Eureka! Grito de la emoción, tengo el dato a mi disposición... 

Y... la pregunta del millón es ¿cómo hago para obtener dicho código HTML, analizarlo, capturar el dato y mostrarlo al usuario? Claro, todo eso de manera transparente para el usuario.

En este momento me voy a poner a investigar, si alguien me da pistas, genial, iré informando mis avances.

Arturo PC.

ArturoPC

unread,
Apr 14, 2012, 6:28:57 AM4/14/12
to publice...@googlegroups.com
Siendo las 5.18 am ya tengo una función que realiza la tarea que necesito.

*
** Función para ver contenido de una página web
FUNCTION ObtenerContenidoPaginaWeb
LPARAMETERS lcUrl, lcGuardarComo
LOCAL loIE, lcContenidoURL
   loIE = CREATEOBJECT("InternetExplorer.Application")
   loIE.Navigate(lcUrl)
   * Esperar mientras se obtiene página
   WAIT WINDOW "Espere por favor, obteniendo datos..."
   DO While loIE.Busy OR loIE.ReadyState#4
   ENDDO
   *
   lcContenidoURL = loIE.Document.Body.InnerText
   STRTOFILE(lcContenidoURL, lcGuardarComo)
   *
   MESSAGEBOX("Archivo creado", 64, "Confirmación")
   RETURN .T.
ENDFUNC

La función recibe dos parámetros: URL a consultar y archivo donde guardar el resultado.

Para llamar a la función:

Si se percatan, en este caso estoy grabando el contenido en un archivo TXT.

Ahora, me toca darle los retoques a la función:
- Validar los parámetros recibidos.
- Validar que la URL responda.
- Hacer una barra de avance de la descarga de la web.
- Pensaba que tal vez, no se necesite grabar un archivo sino solo se requiera en memoria; por ejemplo, para grabarlo en un campo memo. En este caso, el segundo parámetro sería opcional.

Bueno, les haré llegar mis avances.

Slds,

Arturo PC.

ArturoPC

unread,
Apr 14, 2012, 6:35:44 AM4/14/12
to publice...@googlegroups.com
Me olvidaba. Los detalles del objeto  InternetExplorer  en:


Slds,

ArturoPC

Mario López

unread,
Apr 14, 2012, 8:38:42 AM4/14/12
to Comunidad de Visual Foxpro en Español
@Arturo:

así como está el programa VFP hace lo que se llama "busy wait": ocupa
el procesador mientras
está esperando, con lo que hace que el otro proceso sea mucho más
lento y también el propio
proceso de espera sea poco "responsivo", por ejemplo, a un eventual
botón de cancelación del
proceso.

Yo agregaría dentro del bucle algo como

DO While loIE.Busy OR loIE.ReadyState # 4
=INKEY(.5)
DOEVENTS
ENDDO


Saludos,
Mario

---

ArturoPC

unread,
Apr 16, 2012, 9:33:04 AM4/16/12
to publice...@googlegroups.com
Gracias Mario, un buen punto el que indicas...

Mauricio Ruben Molinero

unread,
Apr 16, 2012, 10:22:44 AM4/16/12
to publice...@googlegroups.com
clear
lnseconds=SECONDS()
SET SAFETY off
loHTTP = CREATEOBJECT('WinHttp.WinHttpRequest.5.1')
   * OR:
*loHTTP = CREATEOBJECT('WinHttp.WinHttpRequest.5.0') && or is that just '... .5'???
lohttp.SetTimeouts(999999,999999,999999,999999)
lcOrigen = 'Tornquist,AR'
lcDestino = 'Bahia Blanca,AR'

TEXT TO lcURL TEXTMERGE PRETEXT 11
ENDTEXT

lohttp.Open('GET',lcUrl,.f.)
lohttp.Send(' GET HTTP/1.1 ')

STRTOFILE( lohttp.ResponseText,'web.txt')
? 'Ejecucion', SECONDS()-lnSeconds
MODIFY FILE web.txt

Saludos!

Mauricio R. Molinero,

ArturoPC

unread,
Apr 16, 2012, 11:54:05 AM4/16/12
to publice...@googlegroups.com
Gracias Mauricio:

Revisando tu código me encontré con estas diferencias con respecto al método que expuse anteriormente:
- Devuelve el código HTML, el código que yo expuse devuelve el contenido de la URL.
- Es más rápido. Si bien, esto es algo relativo hice la siguiente prueba: ejecutar 25 veces, intercaladas, los dos métodos. Excepto en una ocasiones, en las demás WINHTTP fue más rápido que el IE.

Si bien debería buscarla yo, en este momento estoy full, te agradecería si tiene documentación a la mano,

Slds

ArturoPC.

PD: Segunda vez que escribo este mensaje, la primera no se publicó, Justo cuando menos tiempo tengo, grrrr.

ssanmiguelh

unread,
Apr 16, 2012, 4:57:14 PM4/16/12
to publice...@googlegroups.com
Hola Arturo, una vez descargado has lo siguiente :

CREATE CURSOR PAGINA (Contenido c(254))
APPEND FROM 'prueba.txt' TYPE SDF
SELECT CTOD(SUBSTR(ALLTRIM(contenido),20,10)) FECHADES;
FROM Pagina WHERE RECNO() = 9 INTO CURSOR curAduana

Esto te va a funcionar solo si la página se mantiene tal cual , es decir que siempre en el registro Nº9 figure la FECHA DE DESCARGA.

- Otra forma es busc´ndolo dentro del TXT , existe esta función pero no la recuerdo el uso, busca en la ayuda:
STREXTRACT()


Saludos.
Reply all
Reply to author
Forward
0 new messages