Skip to content

DemikFR/Data-Pipeline-Python-Azure-Data-Lake

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 

Repository files navigation


Pipeline de Extração de Dados da Web para o Azure Data Lake

Ingestão de dados no Azure Data Lake com web scraping no Python

Os dados usados se encontram na base de dados abertos da CONAB.

Table of Contents
  1. Sobre o Projeto
  2. Iniciar o Projeto
  3. Extração dos Dados
  4. Ingestão dos Dados
  5. Agradecimentos
  6. License
  7. Contact

Sobre o Projeto

O projeto foi originado por um desafio de minha graduação de banco de dados na FIAP (Faculdade de Informática e Administração), que consiste em pensar em um problema do agronegócio para ser resolvido utilizando uma plataforma de data lake.

Para ser realizada a solução do problema, foi escolhido usar o processo de ELT e o Azure Data Lake Gen1, pois além de realizar a análise do momento, os dados deverão ser reaproveitados no futuro.

Ferramentas

Para realizar este projeto, foi usado as seguintes ferramenta:

  • Python
  • Microsoft Azure

Iniciar o Projeto

  1. Clone este Repositório
    git clone https://github.com/DemikFR/Data-Pipeline-Python-Azure-Data-Lake.git
  2. Instale todas as bibliotecas em seu Python
     pip install wget
     pip install azure-mgmt-resource
     pip install azure-mgmt-datalake-store
     pip install azure-datalake-store
  3. Verifique a sua credencial Tenant ID do Azure, conforme a documentação da Microsoft. e depois coloque ela no seu código que se encontra no script
     adlCreds = lib.auth(tenant_id='YOUR_TENANT_ID', resource = 'https://datalake.azure.net/')

Preparação do Azure

Para criar o Azure Data Lake Gen1 é importante fazer antes um grupo de recursos do Azure. É fundamental observar que o nome do grupo de recursos não deve conter caracteres especiais, incluindo espaços, e deve ser composto apenas por letras minúsculas. Essa regra de nomenclatura é essencial para garantir a correta configuração e funcionamento do Azure Data Lake Gen1.

Grupo de Recursos do Azure

Com o grupo de recursos será possível organizar os serviços que tem um mesmo objetivo, neste caso, para analisar as safras de produtos agrícolas brasileiro.

Agora que o Grupo de Recursos foi criado, podemos prosseguir com a criação do Data Lake. Selecione o recurso Data Lake Storage Gen1 e, em seguida, forneça as informações necessárias. É importante observar o nome da instância que você está criando, pois esse nome será utilizado para acessar o Data Lake por meio do Python. Certifique-se de escolher um nome significativo e memorável para facilitar o acesso e o gerenciamento do Data Lake posteriormente.

Criação do Azure Data Lake Storage Gen1

Após concluir a criação do Azure Data Lake Gen1, já será possível começar a utilizá-lo.

Interface Azure Data Lake

Extração dos Dados (Web Scraping)

Após analisar a forma de disponibilização dos dados, foi verificado que as bases estão armazenadas em formatos mistos, sendo tanto em .XLS quanto em .XLSX. Além disso, antes de acessar a página de download dos dados, é necessário passar por outra página que os separa em seis categorias: Safra de Grãos, Safra de Café, Safra de Cana-de-Açúcar, Séries Históricas, Progresso de Safra e Mapeamentos Agrícolas. Inicialmente, será coletar apenas os dados das quatro primeiras categorias, nos formatos .XLSX.

Com a biblioteca Beautiful Soup, será possível realizar o processo de web scraping que automatizará o download e envio dos arquivos de dados ao Azure Data Lake.

Assim, foi criada uma função que recebe uma URL, no caso a página que dá acesso às categorias dos dados e uma expressão expressão de busca que será aplicada ao atributo "title" do HTML, a fim de encontrar algo semelhante.

 def get_soup(url, search):
 response = requests.get(url)
 
 # Verificar se a conexão foi bem sucedida
 if response.status_code == 200:
     soup = bs(response.content, 'html.parser')

     # Retornar as páginas onde terão as de download
     return soup.find_all('a', href=True, attrs={'title': re.compile(search)}) 
 else:
     return f'Página{link["title"]} está inacessível. Código: {response.status_code}'

Após a criação da função, foi implementado um loop "for" que percorre a lista de elementos retornados pela função. Em seguida, outro loop é utilizado para realizar uma nova busca por elementos dentro da página acessada com base na primeira lista. Dessa forma, o link de acesso ao dataset é extraído e será posteriormente inserido na função de ingestão de dados, que será detalhada no capítulo dedicado a essa funcionalidade.

 url_base = 'https://www.conab.gov.br'

 url_acesso = 'https://www.conab.gov.br/info-agro/safras'

 lista_repo = get_soup(url_acesso, 'Safra')[0:3]

 for i in lista_repo:
 
   # Buscar datasets em cada repositório de dados do Conab
   link_repo = url_base+i['href'] # Funcionalidade do Python que ajuda a acessar elementos específicos do HTML

   for j in get_soup(link_repo, 'xlsx'):

       # Acessar os dados de cada dataset e inserir no Azure Data Lake
       link_dataset = url_base+j['href'] # Funcionalidade do Python que ajuda a acessar elementos específicos do HTML

       ingest(adlsFileSystemClient, j['title'], link_dataset)

Ingestão dos Dados

No momento em que a extração dos dados foi concluída com sucesso, já é possível prosseguir com o processo de ingestão. No entanto, antes de iniciar, é fundamental configurar o ambiente que estabelecerá a conexão com o Azure Data Lake. Após realizar a etapa 3 do Iniciar o Projeto, deve-se conectar no seu ADL já criado na etapa de Preparação do Azure e depois com o código abaixo, usar o nome do ADLGen1.

 adlsAccountName = 'datalakeminsaitsafras'
 adlsFileSystemClient = core.AzureDLFileSystem(adlCreds, store_name=adlsAccountName)

A função de ingestão é projetada para receber três parâmetros essenciais. O primeiro parâmetro é o "file_system", que representa o sistema de arquivos atuando como um contêiner no Azure Data Lake (ADL). Como mencionado anteriormente, esse sistema de arquivos foi criado utilizando o código fornecido anteriormente.

O segundo parâmetro é o "file_dl_name", que define o nome do arquivo no Azure Data Lake. Esse parâmetro é crucial para identificar o arquivo específico que será armazenado no Data Lake.

Por fim, o terceiro parâmetro é o "link_file", que no contexto desse pipeline é o link de download do dataset. É por meio desse caminho que a função de ingestão será capaz de localizar o arquivo a ser importado e realizar a operação de ingestão no Azure Data Lake.

Note que em primeiro momento, será utilizado a biblioteca wget para realizar o download do dataset na pasta e depois subir o arquivo na nuvem, isso manterá a integridade dos dados.

 def ingest(file_system, file_dl_name, link_file):

   try:
   # Download the Dataset
     response = wget.download(link_file) # Baixar o dataset

     ## Upload a file

     multithread.ADLUploader(file_system, lpath=f'/content/{file_dl_name}', rpath=f'/Datasets_Safras/{file_dl_name}'
                             , nthreads=64, overwrite=True) # Pega o arquivo baixado e realiza o upload para o Azure
     print(f'O upload do arquivo {file_dl_name} foi efetuado com sucesso!')
   except exception:
     print(f'Erro! O upload do arquivo {file_dl_name} não foi bem sucedido!') # Em caso de algum erro ocorrer ao baixar ou enviar o dataset para o Azure

Por fim, os dados já estarão presentes no Azure Data Lake, pronto para os próximos procedimentos de análise.

Datasets no ADL

Agradecimentos

O trabalho está sendo feito junto com a minha amiga Yuki Shimura, que ficou encarregada da transformação e análise dos dados.

License

Distributed under the MIT-LICENSE. See LICENSE.txt for more information.

Contact

Demik Freitas - Linkedin - demik.freitast2d18@gmail.com

Project Link: https://github.com/DemikFR/Data-Pipeline-Python-Azure-Data-Lake

About

Pipeline for ingest data on Azure Data Lake

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published