Source code for dgi.catalogo.utils
import re
import requests
from datetime import datetime
from bs4 import BeautifulSoup
[docs]def recupera_informacoes_da_listagem(url: str) -> dict:
"""Função para mapeamento das características presentes na busca que está sendo realizada
Args:
url (str): URL da página de query de imagens do DGI/INPE que deve ser analisada
Returns:
dict: Dicionário conténdo as informações da página, dentre elas
elementos: ``int``: Quantidade de elementos encontrados na query de imagens
paginas: ``int``: Quantidade de páginas para alocar os elementos encontrados
"""
res = requests.get(url)
if res.status_code != 200:
raise RuntimeError("Ops! Erro no link {}".format(url))
if res.content == b"\xef\xbb\xbf\n\n <h5>Nenhum registro encontrado!</h5>":
raise RuntimeError("Nenhum registro foi encontrado no link {}".format(url))
soup = BeautifulSoup(res.content, features="lxml")
return {
"elementos": int(soup.findAll('td')[1].find('b').text),
"paginas": int(soup.findAll('td')[0].text.split()[-1])
}
[docs]def lista_para_data(lista: list) -> datetime:
"""Transforma a lista de tempo coletado do DGI/INPE para Date
Args:
lista (list): Lista com as datas coletadas
Returns:
datetime: Data no formato Y-M-D:H:M:S
"""
dia = lista[0].split(":")[1]
hora = lista[1].replace("Hora", "").split("S")[0][1:]
return datetime.strptime(f"{dia}:{hora}", "%Y-%m-%d:%H:%M:%S")
[docs]def formata_lista_de_imagens(soup, pagina, nome_do_local) -> list:
"""Função para formatar os dados de imagens da listagem presente no objeto BeautifulSoup4
Args:
soup (bs4.BeautifulSoup): Objeto da página de query de imagens do DGI/INPE
pagina (int): Número da página que foi raspada
nome_do_local (str): Nome do local onde as imagens da página foram coletados
Returns:
list: Lista de dicionários, estes que contém as informações das imagens
"""
lista_de_imagens = []
imagens_na_pagina = soup.findAll("span", id=re.compile("^imagemblink\d+"))
quadrantes_das_imagens = soup.findAll("div", id=re.compile("^nuvens\d+"))
centro_da_imagens = soup.findAll("div", id=re.compile("^centro\d+"))
coord_superior_imagens = soup.findAll("div", id=re.compile("^superior\d+"))
coord_inferior_imagens = soup.findAll("div", id=re.compile("^inferior\d+"))
dados_extras_das_imagens = soup.findChildren("td")
for imagem, quadrantes, centro, coord_sup, coord_infer, index in zip(
imagens_na_pagina, quadrantes_das_imagens, centro_da_imagens, coord_superior_imagens,
coord_inferior_imagens, range(0, len(imagens_na_pagina))):
i = imagem.find("img")
# Recuperando as coordenadas
centros = centro.findChildren("td")
superior = coord_sup.findChildren("td")
inferior = coord_infer.findChildren("td")
# Recuperando dados de quadrantes
qn = quadrantes.findChildren("td")
informacoes_extras = dados_extras_das_imagens[9 + (90 * index)].text.replace("\t", "").split()
orbita, ponto = informacoes_extras[2].split("/")
data = lista_para_data(informacoes_extras[3:5])
lista_de_imagens.append({
"nome": i["src"].split("/")[-1].split("_")[1],
"quicklook_url": "http://www.dgi.inpe.br/" + i["src"],
"satelite": i["src"].split("/")[2],
"instrumento": i["src"].split("/")[3],
"orbita": int(orbita),
"ponto": int(ponto),
"data_imagem": data,
"data_insercao_no_banco": datetime.now(),
"quantidade_nuvens": {
"quadrante_1": int(qn[4].text),
"quadrante_2": int(qn[8].text),
"quadrante_3": int(qn[13].text),
"quadrante_4": int(qn[17].text)
},
"pagina": pagina,
"centro_da_cena": {
"type": "Point",
"coordinates": [
float(centros[7].text),
float(centros[4].text)
]
},
"poligono_da_cena": {
"type": "Polygon",
"coordinates": [[ [
float(superior[13].text), # Superior esquerdo
float(superior[6].text)
], [
float(superior[16].text), # Superior direito
float(superior[9].text)
], [
float(inferior[16].text), # Inferior direito
float(inferior[9].text)
], [
float(inferior[13].text), # Inferior esquerdo
float(inferior[6].text)
], [
float(superior[13].text), # Superior esquerdo (Para fechar o poligono)
float(superior[6].text)
]]]
},
"local": nome_do_local
})
return lista_de_imagens