← view all posts

Buscando Trenes en Renfe

Alguna gente me ha preguntado cómo extraigo la información de Renfe para poder elaborar los horarios que se muestran en la aplicación de Trenes, y en la webApp Spanish Train Times.

Es bastante sencillo. Utilizo como base la dirección http://www.renfe.es/horarios/index.html [1], donde se pueden consultar todos los viajes (que no sean de cercanías) de la red española. Si hacéis una búsqueda (por ejemplo, Vigo -> Madrid el 1 de Diciembre de 2009), vereis que se abre una ventana con los resultados. Esta ventana tiene varios marcos (frames), el que nos interesa es el que contiene los horarios, así que mostramos solamente ese marco, y vemos su dirección:

http://horarios.renfe.es/hir/hjhir130.jsp?O=22303&D=MADRI&AF=2009&MF=12&DF=01&SF=2&ID=s [2]

Los parámetros los marco en negrilla, y son:

O: código de la estación origen
D: código de la estación destino
AF: Año (cuatro dígitos)
MF: Mes (de 1 a 12, dos dígitos)
DF: Día (dos dígitos)
SF: Día de la semana (un dígito, de 1 a 7 -Lunes a Domingo)
ID: una "s" :P

Así que es tan sencillo como rellenar estos parámetros de acorde con la consulta que se quiere hacer. Los códigos de las estaciones se pueden ver en el link "Todas las estaciones", que os lleva a esta página: http://horarios.renfe.es/hir/hjhir110.jsp [3]

Viendo el código fuente, se ve que el link de cada estación es del tipo:  <a href="javascript:hir2('XXXXX')" class="entrar">, donde XXXXX es el código de 5 caracteres de la estación. Hay estaciones con códigos numéricos y otras con letras.

Si se quiere hacer siempre la misma búsqueda, pues se anota el código y se usa en la dirección [2]. Si en cambio se quiere hacer un buscador completo de todas las estaciones, hay que tener una base de datos (o un fichero, como en mis aplicaciones) con la correspondencia entre nombre de estación y código.  Para extraer todos los códigos de ese html usad la herramienta que más os convenga, en mi caso he utilizado Vim y expresiones regulares para ir limpiando el fichero y quedándome solamente con el listado de estaciones. Algo como este fichero: CodigosRenfe.txt  (no está actualizado)

Luego está el tema de coger los resultados de los horarios, y mostrarlos de una manera determinada. En el caso de la webApp, se ven así:



Para ello simplemente hay que parsear el html a pelo, no hay otra alternativa. El mecanismo de parsing que se utilice es a gustos de cada uno. En el caso de la webApp, es mediante expresiones regulares en PHP (ver ejemplo de script), y en el caso de la aplicación Trenes, es un objeto NSScanner el que se encarga del parseado.

La clara desventaja de esta forma de conseguir los resultados es que es totalmente dependiente del formato del html. Renfe no dispone (que yo sepa) de una API pública para poder realizar consultas en su sistema, así que esta es la única manera que conozco de hacerlo. Altamente ineficaz, imprevisible y con muy baja tolerancia a fallos.

Como decimos en Gallego: "Eche o que hai"


--- Comments --------

Muchas gracias Diego
Será de mucha ayuda!! Ya te contaré ;)
Joan Domenech ~ 11 months ago

Muy buena :)
Siempre me han resultado interesantes los parsers a pelo de "servicios webs"
Ya de paso decirte q me encanta tu nueva página
Un saludo
kile ~ 10 months ago

Gracias, un saludote! :)
Diego ~ 10 months ago

  
»Post a comment
(Tags allowed: <b> <u> <s>)

 
Write down: PLANET  

← view all posts


All content is Copyright 2009 Diego Fernández Goberna, unless otherwise stated.