En esta entrada aprenderás a extraer datos de Sitios Webs haciendo peticiones al servidor utilizando el lenguaje de programación ASP clásico.
1)
Inicializar las variables
Response.Buffer
= True
Dim
xml
2) Decidir cómo crear el objeto
Con:
Set xml =
Server.CreateObject("Microsoft.XMLHTTP")
O con:
Set
xml = Server.CreateObject("MSXML2.ServerXMLHTTP")
En
mi caso utilizaré “MSXML2.ServerXMLHTTP” porque cuando
utilicé “Microsoft.XMLHTTP” en una Web dónde
había una redirección, me mostraba error y no podía obtener la nueva Web a la
que estaba redireccionando.
A
continuación veamos algunas diferencias entre XMLHTTP y ServerXMLHTTP
XMLHTTP
se utiliza,
generalmente, en la comunicación cliente-servidor (por ejemplo, en una petición
a un Servicio Web), también en transferencias de datos, por ejemplo utilizando
el protocolo FTP. También permite el almacenamiento automático de la url en la memoria
caché. XMLHTTP utiliza WinInet (Windows Internet Explorer) para su funcionamiento.
Por
su parte ServerXMLHTTP está destinado a la
comunicación entre servidores, aplicaciones clientes y procesamiento de
peticiones entre clientes. En ServerXMLHTTP el estado se mantiene “activo”, es decir, la información
enviada/recibida desde/hacia un destino se retiene en la conexión actual para ser
utilizada en futuras transacciones de datos
ServerXMLHTTP
crea una
pila de cliente http, es decir, una sesión independiente del cliente http, lo
que implica que pueden existir varias instancias activas del objeto ServerXMLHTTP en función de la
memoria y la disponibilidad de conexiones. El objeto ServerXMLHTTP puede
ser utilizado además para hacer peticiones/envío de datos de una aplicación a
otra, incluso cuando se requiere que sea en tiempo real.
3)
Abrir la conexión, en mi caso utilizaré el método POST aunque puedes utilizar
GET u otro en dependencia del caso.
·
- site es el sitio Web al
cuál quieres hacerle la petición.
·
- False
es un indicador booleano que muestra si la llamada es o no asíncrona.
xml.Open "POST", site,
False
4)
Hacemos la petición con:
xml.Send
3) Si al hacer la
petición te da un error puedes controlarlo con el típico try-catch aunque en
ASP clásico se hace de esta manera:
Colocas este código
al inicio de tu .asp “On
Error Resume Next”
Y
luego después del xml.Send
capturas
el error (como aparece a continuación), en mi caso obligo a que el estado sea “Error
404” aunque lo puedes programar de forma diferente.
dim
webStatus: webStatus = vbNullString
If Err.Number <> 0
Then
webStatus
= ERROR_404
response.write "Error:" & Err.Number
& " " & "Desc:" & Err.Description
else
webStatus
= xml.status
end if
On Error GoTo 0
5)
Si el estado es “200”
if (webStatus = 200) then
'Aquí puedes coger todos los datos que necesites
End
if
Datos que puedes
extraer de la Web
xml.responseText 'Código Html del sitio Web, mostrándolo por pantalla de esta manera response.write
"<xmp>" & xml.responseText & "</xmp>"
xml.getOption(-1) 'Extrae la url de la Web, lo que nos ayudaría en caso de una redirección a
comprobar si el “site” ha cambiado
Si
quieres tener información de las páginas que enlaza nuestro sitio web en
cuestión, aquí te dejo el código
'Declaración
de Variables
Dim responseT : responseT =
vbNullString
Dim registroExpresion :
registroExpresion = vbNullString
Dim matches : matches =
vbNullString
Dim http : http =
vbNullString
Dim match : match =
vbNullString
Set http =
Server.CreateObject("WinHttp.WinHttpRequest.5.1")
'http.SetTimeouts resolveTimeout,
connectTimeout, sendTimeout, receiveTimeout
http.SetTimeouts 60000,
60000, 600000, 60000
http.Open "GET", site,
False
http.Send
'Esperamos
unos segundos a que termine la operación de envío asincrónico.
If http.WaitForResponse(5)
Then
responseT
= http.ResponseText
End If
Set http = Nothing
Set registroExpresion = New
RegExp
registroExpresion.IgnoreCase
= True
registroExpresion.Global =
True
'Creamos
la expression regular para extraer la url
registroExpresion.Pattern = "<a
href=""(http|https)://(?!" & site &
")(.*?)"""
Set matches =
registroExpresion.Execute(responseT)
If matches.Count > 0 Then
For Each match In matches
response.write "URL= " &
match.SubMatches(1) & "<br/>"
Next
Else
response.write
“No matches”
End If
*Aquí
algunos enlaces que pueden ser de utilidad para el desarrollo de este tema:
Para
probar expresiones regulares: http://regexr.com/
Sobre
expresiones regulares:
Códigos
de estados http