Módulo Aranha
Expandir código fonte
from pathlib import Path
import requests
from bs4 import BeautifulSoup
class Aranha:
"""
Busque dados no sistema local e realize requisições pela web.
Esta classe possui apenas um método público, obter(), que chama
os demais métodos privados obter_remoto(), __obter_local() e
__obter_meteograma.
Os métodos privados retornam um objeto BeautifulSoup, mas ele nunca
é retornado para fora da classe pelo método público obter() e sim
salvo na propriedade soup de cada objeto da classe Cidade.
"""
def obter(self, lista_cidades):
"""
Verifique se os arquivos locais já existem e obtenha da rede.
Este método determina se os arquivos locais para a data atual existem
e busca-os da rede em caso negativo, solicitando antes a confirmação
para cada requisição externa.
Após obter os dados na forma de um arquivo HTML, eles são salvos
em um objeto BeautifulSoup que é então gravado no atributo soup
de cada objeto Cidade.
Class variables
:param lista_cidades: lista com objetos da classe Cidade
"""
for c in lista_cidades:
try:
if not Path(c.saida_html).exists():
confirma = input(
'[aranha.obter] ' + c.saida_html +
' não encontrado. Deseja baixar? [s/N] ')
if confirma == 'S' or confirma == 's':
c.soup = self.__obter_remoto(c)
else:
input('[aranha.obter] Requisição não executada. ' +
'Pressione ENTER para continuar: ')
else:
print(' [aranha.obter] ' + c.saida_html + ' encontrado ')
c.soup = self.__obter_local(c)
except AttributeError:
print(' [aranha.obter] AttributeError: A cidade ' +
c.nome + ' foi inicializada corretamente?')
except Exception as e:
print(' [aranha.obter] ' + str(e))
try:
sel = 'img-fluid rounded mx-auto d-block'
c.meteograma = c.soup.find('img', class_=sel).get('src')
if Path(c.saida_meteograma).exists():
print(' [aranha.obter_meteograma] ' + c.saida_meteograma +
' encontrado')
else:
confirma = input(
'[aranha.obter_meteograma] ' + c.saida_meteograma +
' não encontrado. Deseja baixar? [s/N] ')
if confirma == 'S' or confirma == 's':
print(' [aranha.obter_meteograma] Baixando ' +
c.saida_meteograma)
self.__obter_meteograma(c)
else:
input('[aranha.obter] Requisição não executada. ' +
'Pressione ENTER para continuar: ')
except AttributeError:
print(' [aranha.obter] AttributeError: A cidade ' +
c.nome + ' foi inicializada corretamente?')
except Exception as e:
print(' [aranha.obter] ' + str(e))
def __obter_remoto(self, c):
""""
Busque dados através de uma requisição GET para a url remota.
Este método faz uma requisição HTTP externa.
:rtype: BeautifulSoup object
:param c: cidade passada pelo método público obter()
:return: BeautifulSoup object soup
"""
try:
with open(c.saida_html, 'w') as local:
print(' [aranha.obter_remoto] Obtendo arquivo remoto de: ' +
c.url_remota)
resposta = requests.get(c.url_remota)
print(' [aranha.obter_remoto] Resposta: ' + str(resposta))
soup = BeautifulSoup(resposta.content, 'html.parser')
local.write(soup.prettify())
except Exception as e:
print(' [aranha.obter_remoto] ' + str(e))
return soup
def __obter_local(self, c):
"""
Carregue dados já existentes no sistema local.
:rtype: BeautifulSoup object
:param c: cidade passada pelo método público obter()
:return: BeautifulSoup object soup
"""
try:
local = open(c.saida_html, 'r')
except FileNotFoundError:
print(' [aranha.obter_local] Arquivo HTML para ' +
c.nome + ' não encontrado')
except IOError:
print(' [aranha.obter_local] Erro de entrada e saída')
except Exception as e:
print(' [aranha.obter_local] ' + str(e))
else:
with local:
print(' [aranha.obter_local] Carregando arquivo local ')
soup = BeautifulSoup(local, 'html.parser')
return soup
def __obter_meteograma(self, c):
"""
Baixe a imagem do meteograma e salve diretamente no sistema local.
Este método faz uma requisição HTTP externa.
:param c: cidade passada pelo método público obter()
"""
resposta = requests.get(c.meteograma)
if resposta.status_code == 200:
try:
with open(c.saida_meteograma, 'wb') as saida:
saida.write(resposta.content)
except IOError:
print(' [aranha.obter_meteograma] Erro de entrada e saída')
except Exception as e:
print(' [aranha.obter_meteograma] ' + str(e))
else:
print(' [aranha.obter_meteograma] Meteograma salvo ' +
'(resposta: ' + str(resposta.status_code) + ')')
else:
print(' [aranha.obter_meteograma] Erro baixando meteograma: '
+ str(resposta.status_code))
Classes
class Aranha
-
Busque dados no sistema local e realize requisições pela web.
Esta classe possui apenas um método público, obter(), que chama os demais métodos privados obter_remoto(), __obter_local() e __obter_meteograma.
Os métodos privados retornam um objeto BeautifulSoup, mas ele nunca é retornado para fora da classe pelo método público obter() e sim salvo na propriedade soup de cada objeto da classe Cidade.
Expandir código fonte
class Aranha: """ Busque dados no sistema local e realize requisições pela web. Esta classe possui apenas um método público, obter(), que chama os demais métodos privados obter_remoto(), __obter_local() e __obter_meteograma. Os métodos privados retornam um objeto BeautifulSoup, mas ele nunca é retornado para fora da classe pelo método público obter() e sim salvo na propriedade soup de cada objeto da classe Cidade. """ def obter(self, lista_cidades): """ Verifique se os arquivos locais já existem e obtenha da rede. Este método determina se os arquivos locais para a data atual existem e busca-os da rede em caso negativo, solicitando antes a confirmação para cada requisição externa. Após obter os dados na forma de um arquivo HTML, eles são salvos em um objeto BeautifulSoup que é então gravado no atributo soup de cada objeto Cidade. :param lista_cidades: lista com objetos da classe Cidade """ for c in lista_cidades: try: if not Path(c.saida_html).exists(): confirma = input( '[aranha.obter] ' + c.saida_html + ' não encontrado. Deseja baixar? [s/N] ') if confirma == 'S' or confirma == 's': c.soup = self.__obter_remoto(c) else: input('[aranha.obter] Requisição não executada. ' + 'Pressione ENTER para continuar: ') else: print(' [aranha.obter] ' + c.saida_html + ' encontrado ') c.soup = self.__obter_local(c) except AttributeError: print(' [aranha.obter] AttributeError: A cidade ' + c.nome + ' foi inicializada corretamente?') except Exception as e: print(' [aranha.obter] ' + str(e)) try: sel = 'img-fluid rounded mx-auto d-block' c.meteograma = c.soup.find('img', class_=sel).get('src') if Path(c.saida_meteograma).exists(): print(' [aranha.obter_meteograma] ' + c.saida_meteograma + ' encontrado') else: confirma = input( '[aranha.obter_meteograma] ' + c.saida_meteograma + ' não encontrado. Deseja baixar? [s/N] ') if confirma == 'S' or confirma == 's': print(' [aranha.obter_meteograma] Baixando ' + c.saida_meteograma) self.__obter_meteograma(c) else: input('[aranha.obter] Requisição não executada. ' + 'Pressione ENTER para continuar: ') except AttributeError: print(' [aranha.obter] AttributeError: A cidade ' + c.nome + ' foi inicializada corretamente?') except Exception as e: print(' [aranha.obter] ' + str(e)) def __obter_remoto(self, c): """" Busque dados através de uma requisição GET para a url remota. Este método faz uma requisição HTTP externa. :rtype: BeautifulSoup object :param c: cidade passada pelo método público obter() :return: BeautifulSoup object soup """ try: with open(c.saida_html, 'w') as local: print(' [aranha.obter_remoto] Obtendo arquivo remoto de: ' + c.url_remota) resposta = requests.get(c.url_remota) print(' [aranha.obter_remoto] Resposta: ' + str(resposta)) soup = BeautifulSoup(resposta.content, 'html.parser') local.write(soup.prettify()) except Exception as e: print(' [aranha.obter_remoto] ' + str(e)) return soup def __obter_local(self, c): """ Carregue dados já existentes no sistema local. :rtype: BeautifulSoup object :param c: cidade passada pelo método público obter() :return: BeautifulSoup object soup """ try: local = open(c.saida_html, 'r') except FileNotFoundError: print(' [aranha.obter_local] Arquivo HTML para ' + c.nome + ' não encontrado') except IOError: print(' [aranha.obter_local] Erro de entrada e saída') except Exception as e: print(' [aranha.obter_local] ' + str(e)) else: with local: print(' [aranha.obter_local] Carregando arquivo local ') soup = BeautifulSoup(local, 'html.parser') return soup def __obter_meteograma(self, c): """ Baixe a imagem do meteograma e salve diretamente no sistema local. Este método faz uma requisição HTTP externa. :param c: cidade passada pelo método público obter() """ resposta = requests.get(c.meteograma) if resposta.status_code == 200: try: with open(c.saida_meteograma, 'wb') as saida: saida.write(resposta.content) except IOError: print(' [aranha.obter_meteograma] Erro de entrada e saída') except Exception as e: print(' [aranha.obter_meteograma] ' + str(e)) else: print(' [aranha.obter_meteograma] Meteograma salvo ' + '(resposta: ' + str(resposta.status_code) + ')') else: print(' [aranha.obter_meteograma] Erro baixando meteograma: ' + str(resposta.status_code))
Métodos
def obter(self, lista_cidades)
-
Verifique se os arquivos locais já existem e obtenha da rede.
Este método determina se os arquivos locais para a data atual existem e busca-os da rede em caso negativo, solicitando antes a confirmação para cada requisição externa.
Após obter os dados na forma de um arquivo HTML, eles são salvos em um objeto BeautifulSoup que é então gravado no atributo soup de cada objeto Cidade.
parâmetro lista_cidades
-
lista com objetos da classe Cidade
Expandir código fonte
def obter(self, lista_cidades): """ Verifique se os arquivos locais já existem e obtenha da rede. Este método determina se os arquivos locais para a data atual existem e busca-os da rede em caso negativo, solicitando antes a confirmação para cada requisição externa. Após obter os dados na forma de um arquivo HTML, eles são salvos em um objeto BeautifulSoup que é então gravado no atributo soup de cada objeto Cidade. :param lista_cidades: lista com objetos da classe Cidade """ for c in lista_cidades: try: if not Path(c.saida_html).exists(): confirma = input( '[aranha.obter] ' + c.saida_html + ' não encontrado. Deseja baixar? [s/N] ') if confirma == 'S' or confirma == 's': c.soup = self.__obter_remoto(c) else: input('[aranha.obter] Requisição não executada. ' + 'Pressione ENTER para continuar: ') else: print(' [aranha.obter] ' + c.saida_html + ' encontrado ') c.soup = self.__obter_local(c) except AttributeError: print(' [aranha.obter] AttributeError: A cidade ' + c.nome + ' foi inicializada corretamente?') except Exception as e: print(' [aranha.obter] ' + str(e)) try: sel = 'img-fluid rounded mx-auto d-block' c.meteograma = c.soup.find('img', class_=sel).get('src') if Path(c.saida_meteograma).exists(): print(' [aranha.obter_meteograma] ' + c.saida_meteograma + ' encontrado') else: confirma = input( '[aranha.obter_meteograma] ' + c.saida_meteograma + ' não encontrado. Deseja baixar? [s/N] ') if confirma == 'S' or confirma == 's': print(' [aranha.obter_meteograma] Baixando ' + c.saida_meteograma) self.__obter_meteograma(c) else: input('[aranha.obter] Requisição não executada. ' + 'Pressione ENTER para continuar: ') except AttributeError: print(' [aranha.obter] AttributeError: A cidade ' + c.nome + ' foi inicializada corretamente?') except Exception as e: print(' [aranha.obter] ' + str(e))