Obtener datos oficiales de fertilizantes con Python es un proceso basado en scrapear la web que contiene estos datos. En este caso, estos datos no pueden ser accedidos por medio de una api rest o descargarlos en su conjunto.
La fuente de estos datos es el Ministerio de agricultura, pesca y alimentación del gobierno de España. En esta web se pueden consultar los datos en forma de búsqueda siguiendo ciertos parámetros especificados en un formulario. El objetivo será descargar el conjunto completo de los datos oficiales de productos fertilizantes admitidos mediante varios scripts en Python.
Librerías utilizadas
Obtener el listado de fertilizantes autorizados con Python
Para obtener el listado de fertilizantes autorizados con Python se han iterado las distintas páginas que tiene la web y de cada una se obtenido la información.
base_url = 'https://www.mapa.gob.es/app/consultafertilizante/ListadoFertilizantes.aspx?Page='
products = []
n_pages = 70
for i in range(0,n_pages + 1):
partial_products = get_products(base_url+str(i))
for p in partial_products:
products.append(p)
El bloque de código en cuestión llama a una función para cada url generada. Con esta función se scrapea el listado de fertilizantes que componen la url pasada como parámetro.
def get_products(url):
page = requests.get(url)
page.encoding='utf-8'
pagetext = page.text
tree = BeautifulSoup(pagetext)
table_tag = tree.select("table")[1]
links = get_links(table_tag)
tab_data = [[item.text for item in row_data.select("th,td")]
for row_data in table_tag.select("tr")]
data = tab_data[2::]
for i in range(0,len(data)):
data[i].append(links[i])
return data
Cada url suministrada a la función anterior está formada por una página web que contiene una tabla como la siguiente:

El objetivo de la función es obtener cada una de estas columnas junto el enlace a la documentación de cada fertilizante. Para esto último se hace uso de otra función que se ejecuta una única vez y obtiene el enlace de la documentación para cada fila de la tabla scrapeada.
def get_links(table_tag):
links = []
for row_data in table_tag.select("tr"):
link_tag = row_data.find('a', href=True)
if(link_tag == None):
continue
links.append('https://www.mapa.gob.es/app/consultafertilizante/' + link_tag.get('href'))
return links
Código | Tipo | Nombre comercial | Fabricante | F. de registro | Url |
F0000063/2021 | Abono órgano-mineral NPK | BOY 12 | JOSE FUSTE, S.A. | 27/04/2011 | https://www.mapa.gob.es/app/consultafertilizante/DetalleFertilizante.aspx?clave=63 |
Obtener la composición de los fertilizantes autorizados con Python
Una vez realizado un scraping básico para obtener todos los fertilizantes autorizados, se pueden obtener multitud de datos adicionales según cuál sea el objetivo. En este caso, vamos a obtener la composición básica de cada fertilizante.
El proceso se basa en aplicar la siguiente función a cada fertilizante obtenido anteriormente pasándole su respectiva url:
def get_composition(url):
global components
global equivalencies
page = requests.get(url)
page.encoding='utf-8'
pagetext = page.text
tree = BeautifulSoup(pagetext)
if(len(tree.select("table"))>2):
table_tag = tree.select("table")[3]
tab_data = [[item.text for item in row_data.select("th,td")]
for row_data in table_tag.select("tr")]
composition = ''
for e in tab_data:
if(e[0] in components and e[1] != '-'):
if e[0] in equivalencies.keys():
composition += e[1] +'% ' + equivalencies[e[0]] + '; '
else:
composition += e[1] +'% ' + e[0] + '; '
return composition[0:-2]
else:
return None
Los componentes y las equivalencias son definidos de forma estática para obtener el resultado deseado.
Código | Tipo | Nombre comercial | Fabricante | F. de registro | Url | Composition |
F0000063/2021 | Abono órgano-mineral NPK | BOY 12 | JOSE FUSTE, S.A. | 27/04/2011 | https://www.mapa.gob.es/app/consultafertilizante/DetalleFertilizante.aspx?clave=63 | 6,0% Nitrógeno (N); 10,0% Fósforo (P); 6,0% Potasio (K) |
Código y datos
El código se ha desarrollado de dos formas, con un notebook y con dos scripts, uno para obtener los fertilizantes únicamente y otro para obtenerlos con la composición. Ambos scripts tienen cómo salida un fichero en csv con sus respectivos datos.
Notebook
Posible proyecto futuro
Teniendo en cuenta que no se puede acceder a estos datos mediante una API es complicado crear sistemas que requieran estos datos actualizados. Por ello, una solución podría ser crear una API REST con Python que mediante un cron diario o semanal realice este proceso de scraping y almacene de forma actualizada los mismos. Para que posteriormente estos se puedan servir a otros sistemas de forma sencilla y actualizada.