1
resposta

Web scraping site Ibama

Pessoal gostaria de extrair uns dados que estao como hiperlinks em xls e xlsx no site do IBAMA. A minha dificuldade é gravar esses arquivos no meu diretorio do jupyter notebook ou em um sqlite.

import requests
import os
from bs4 import BeautifulSoup, SoupStrainer

url = 'https://www.ibama.gov.br/agrotoxicos/relatorios-de-comercializacao-de-agrotoxicos#boletinsanuais'

#Determinando as extensões do arquivo  de interesse
file_types = ['.xls', '.xlsx' ]


#Fazendo a requisição no site e criando o objeto beatifulsoup
response = requests.get(url, verify = False)
soup = BeautifulSoup(response.content, 'html.parser', parse_only=SoupStrainer('a'))

#Pegando todos links e separando os arquivos .xls e xlsx
links = []
for link in soup:
    if link.has_attr('href'):

        for file_type in file_types:        
            if link['href'].endswith(file_type):
                links.append('https://www.ibama.gov.br' + link['href'])

#Conexão ao banco de dados
engine = create_engine('sqlite:///IBAMA.sqlite')

#Criando um diretório temporário
tempdir = tempfile.mkdtemp()

#Criando nome dos arquivos
file_name = []
for url in links:
    print(' Buscando %s' % url)
    _response = requests.get(url, verify = False)
    file_name.append(url.split('/')[-1])


#Consultando o status_code da requisição    
if response.status_code >= 300: 
        print(url, 'Falhou')
        continue



# Manipula o arquivo temporário e carrega o dado

#     with tempfile.TemporaryFile(suffix = '.xls', dir=tempdir) as arquivo:
#         arquivo.write(_response.content)
# with open('test.xls', 'wb') as output:
#     output.write(_response.content)

eu consigo separar os hiperlinks mais ao achei uma solução para gravar em diretorio .

1 resposta

Olá Rodolfo, tudo bem? Espero que sim!

Desculpe pela demora em retornar.

Você pode utilizar a biblioteca wget para fazer o download dos arquivos. Caso não tenha ela instalada, basta escrever no terminal o comando:

pip install wget

Utilizei a biblioteca os para criar uma pasta downloads no diretório em que se encontra o seu arquivo de script, caso ela não exista.

Dentro do for onde você estava criando o nome dos arquivos, ao invés de armazenar em uma lista, utilizei a biblioteca os novamente para criar o caminho onde será salvo o arquivo e utilizei a wget para realizar o download do arquivo passando a url para o download e o caminho do arquivo.

Vou deixar aqui abaixo o código com alguns comentários nos locais em que efetuei mudanças.

import requests
import os
from bs4 import BeautifulSoup, SoupStrainer
import warnings # Biblioteca para remover os avisos no terminal
import wget # Biblioteca para baixar arquivos a partir de uma url


warnings.filterwarnings('ignore') # Ignorando avisos no terminal
url = 'https://www.ibama.gov.br/agrotoxicos/relatorios-de-comercializacao-de-agrotoxicos#boletinsanuais'

#Determinando as extensões do arquivo  de interesse
file_types = ['.xls', '.xlsx' ]

#Fazendo a requisição no site e criando o objeto beatifulsoup
response = requests.get(url, verify = False)
soup = BeautifulSoup(response.content, 'html.parser', parse_only=SoupStrainer('a'))

#Pegando todos links e separando os arquivos .xls e xlsx
links = []
for link in soup:
    if link.has_attr('href'):
        for file_type in file_types:        
            if link['href'].endswith(file_type):
                links.append('https://www.ibama.gov.br' + link['href'])

# Cria uma pasta com nome downloads se ela não existir, no diretório atual
if not os.path.exists('downloads'):
    os.makedirs('downloads')

# Criando nome dos arquivos, baixando as planilhas e colocando na pasta downloads com o nome do arquivo selecionado
for url in links:
    _response = requests.get(url, verify = False)
    nome_arquivo = url.split('/')[-1] # Armazenando o nome do arquivo
    diretorio = os.path.join(str(os.getcwd()), 'downloads\\', str(nome_arquivo)) # Armazenando o diretório atual + pasta downloads + nome arquivo
    wget.download(url, diretorio) # Baixando os arquivos para o diretório downloads

Abaixo tem uma imagem com os arquivos baixados após rodar o código:

Arquivos xlsx baixados através da biblioteca wget no python

Apenas uma observação, a cláusula continue é utilizada dentro de loops e acusará um erro caso utilize dentro do if, conforme você utilizou.

Qualquer coisa estou à disposição. Bons estudos!