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:
- Nombre de la localización coincidente
- Latitud
- Longitud
Peticiones Válidas
Key | Value |
---|---|
URL | https://api1.correos.es/digital-services/searchengines/api/v1/suggestions?text=08001 |
Status Code | 200 OK |
Respuesta
{
"suggestions": [
{
"text": "08001, Barcelona, Barcelona, Cataluña, ESP",
"longitude": 2.1686990270000592,
"latitude": 41.380160001000036
}
]
}
Peticiones Inválidas
Key | Value |
---|---|
URL | https://api1.correos.es/digital-services/searchengines/api/v1/suggestions?text=01999 |
Status Code | 200 OK |
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:
- Dockerized PHP - Un entorno dockerizado para el desarrollo de aplicaciones con PHP.
- Bash - La shell del Proyecto GNU.
- Sublime Text - Un simple editor de textos.
- GuzzlePHP - Un cliente HTTP realizado en PHP.
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