johny_ferreira

baixar metadados do ICA na INDE

Jul 6th, 2021 (edited)
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.15 KB | None | 0 0
  1. """Script para baixar metadados publicados pelo ICA no geonetwork da INDE."""
  2.  
  3. import requests
  4. import json
  5.  
  6.  
  7. def tratar_nome_de_arquivo(nome):
  8.     string = nome
  9.     unallowed_chars = [
  10.         '/', ':', '\\', '.', '=', '+', '%', '&', '(',
  11.         ')', '[', ']', '{', '}', '<', '>', ';', '?',
  12.         '^', '`', '~', '*', '!', '"'
  13.     ]
  14.  
  15.     for char in unallowed_chars:
  16.         if char in string:
  17.             arr = string.split(char)
  18.             string = ''.join(arr)
  19.  
  20.     return string
  21.  
  22. def baixar_catalogo(begin, end):
  23.     url = "https://metadados.inde.gov.br/geonetwork/srv/por/q"
  24.     querystring = {
  25.         "_content_type":"json",
  26.         "bucket":"s101",
  27.         "facet.q":"category/ICA",
  28.         "fast":"index",
  29.         "from":begin,
  30.         "resultType":"details",
  31.         "sortBy":"title",
  32.         "sortOrder":"reverse",
  33.         "to":end
  34.     }
  35.     response = None
  36.     try:
  37.         response = requests.request("GET", url, params=querystring)
  38.     except Exception as e:
  39.         return False
  40.     catalogo = json.loads(response.text)
  41.     return catalogo
  42.  
  43.  
  44. def get_limite_por_requisicao(catalogo):
  45.     return int(catalogo["@maxPageSize"])
  46.  
  47.  
  48. def get_contagem_total_de_metadados(catalogo):
  49.     return int(catalogo["summary"]["@count"])
  50.  
  51.  
  52. def get_metadado(uuid):
  53.     url = "https://metadados.inde.gov.br/geonetwork/srv/api/records/" + uuid + "/formatters/xml?approved=true"
  54.     response = requests.request("GET", url)
  55.     return response.text
  56.  
  57.  
  58. def salvar_arquivo_texto(nome, extensao, conteudo):
  59.     nome_arquivo = tratar_nome_de_arquivo(nome) + "." + extensao
  60.     with open(nome_arquivo, mode="wt") as arquivo:
  61.         arquivo.write(conteudo)
  62.  
  63.  
  64. def listar_metadados(quantidade, limite_por_requisicao):
  65.     if quantidade < 1:
  66.         raise Exception("Quantidade de metadados solicitada menor que 1.")
  67.     if limite_por_requisicao < 1:
  68.         raise Exception("numero de metadados listados por requisicao menor que 1.")
  69.  
  70.     inicio = 1
  71.     fim = limite_por_requisicao
  72.     metadados = []
  73.  
  74.     paginas = quantidade // limite_por_requisicao
  75.     if quantidade % limite_por_requisicao > 0:
  76.         paginas += 1
  77.  
  78.     for i in range(paginas):
  79.         inicio = i * limite_por_requisicao + 1
  80.         fim = i * limite_por_requisicao + limite_por_requisicao
  81.         catalogo = baixar_catalogo(inicio, fim)
  82.         metadados.extend([{"nome": x["title"], "uuid":x["geonet:info"]["uuid"]} for x in catalogo["metadata"]])
  83.  
  84.     return metadados
  85.  
  86.  
  87. def main():
  88.     print("# Obtendo lista, aguarde...")
  89.     sumario = baixar_catalogo(1, 1)
  90.     total = get_contagem_total_de_metadados(sumario)
  91.     limite_por_requisicao = get_limite_por_requisicao(sumario)
  92.     lista = listar_metadados(total, limite_por_requisicao)
  93.  
  94.     print("# Foram obtidos " + str(total) + " metadados do catálogo.")
  95.     progresso = 1
  96.     for metadado in lista:
  97.         print("    baixando " + str(progresso) + " de " + str(total) + ": " + metadado["uuid"])
  98.         xml = get_metadado(metadado["uuid"])
  99.         salvar_arquivo_texto(metadado["nome"] + "_" + metadado["uuid"], "xml", xml)
  100.         progresso += 1
  101.     print("# Fim")
  102.  
  103. if __name__ == '__main__':
  104.     main()
  105.  
Add Comment
Please, Sign In to add comment