Alcides Ramos Cordero

Software Engineer

Creando un scraper con PHP

En el post anterior estuvimos hablando sobre La importancia del feedback y hoy toca un post más práctico: la creación de un scraper con PHP.

Introducción

Groso modo un scraper es un programa ETL (Extract + Transform + Load) cuya fuente de datos son sitios web. Para ello, estos programas suelen[^1] simular la navegación de un usuario a través del protocolo HTTP y analizar así todo el árbol de contenidos remoto.

[^1]: Veremos en el siguiente caso práctico que no siempre es así.

Caso Práctico: Códigos postales de España

Veamos el caso práctico de extraer los códigos postales de España.

España es una país que está políticamente distribuído en 52 provincias. Para ser exactos, en 50 provincias más dos ciudades autónomas pero que a efectos prácticos, tienen la misma consideración que una provincia para este caso práctico.

Así pues, cada provincia puede tener códigos postales que van del 1 al 999.

Por ejemplo:

Provincia Código de Provincia Rango de posibles códigos postales
Álava 1 01001..01999
Madrid 28 28001..28999
Melilla 52 52001..52999

Los códigos de provincia se pueden consultar en el Instituto Nacional de Estadística

Análisis de la página de Correos

Actualmente Correos.es es la única entidad autorizada para la gestión y mantenimiento de los cógidos postales en nuestro país. Lamentablemente dicha entidad no ofrece una base de datos gratuíta o una API accesible para su consulta. En cambio, la ofrecen como servicio de pago por el módico precio de 831,80€.

Descargo de responsabilidades

La información que deseo obtener no es otra que la relación de código postal y municipio que es una información de interés popular y, por lo tanto, no debería ser ofrecida como un servicio de pago, máxime cuando el Estado le asigna partidas presupuestarias anuales en concepto de subvenciones.

Buscador de Códigos Postales

La página web de Correos ofrece un buscador que permite realizar búsquedas por dirección y/o código postal.

Si realizamos una búsqueda con la herramienta Developer Tools activa, en la pestaña Network podemos ver peticiones de este tipo:

GET https://api1.correos.es/digital-services/searchengines/api/v1/suggestions?text=08001

La cual da como posibles respuestas:

Peticiones Válidas

Respuesta

{
  "suggestions": [
    {
      "text": "08001, Barcelona, Barcelona, Cataluña, ESP",
      "longitude": 2.1686990270000592,
      "latitude": 41.380160001000036
    }
  ]
}
Peticiones Inválidas

Respuesta

{
  "code": "404",
  "message": "Not Found",
  "moreInformation": {
    "description": "Not results found.",
    "link": "www.correos.es"
  }
}

Scraper con PHP

Para la creación de esta herramienta he usado los siguientes recursos:

Puedes acceder desde aquí al código fuente de la herramienta, la cual contiene todos los comandos necesarios para su puesta en marcha y utilización.

Resultado

Como resultado de todo el proceso se han generado 52 ficheros CSV, uno por provincia, con la información deseada.

Para simplificar el proceso de importación y manipuación de datos, se ha unificado todos los ficheros en uno solo.

Si deseas descargar dicho fichero puedes descargarlo desde aquí.

Versión del documento

[^v1.0]: Última Modificación: 24/02/2023