Gostaria de fazer essa raspagem de dados, porem a requisição não está funcionando, o que eu preciso fazer? Acredito na hora da requisição do site
“
import requests
from bs4 import BeautifulSoup
import csv
import os
import logging
from datetime import datetime
import time
from requests.exceptions import RequestException
Configurar logging
logging.basicConfig(level=logging.INFO, format=’%(asctime)s – %(levelname)s – %(message)s’)
def validar_data(data_str):
“””Valida o formato de data (mm/aaaa).”””
try:
datetime.strptime(data_str, “%m/%Y”)
return True
except ValueError:
return False
def solicitar_parametros():
“””Solicita e valida os parâmetros de entrada do usuário.”””
while True:
termo_pesquisa = input(‘Qual o termo a ser pesquisado? ‘)
if termo_pesquisa:
break
else:
print(“O termo de pesquisa não pode estar vazio.”)
while True:
data_inicial = input('Insira data inicial (mm/aaaa): ')
if validar_data(data_inicial):
break
else:
print("Formato de data inválido. Por favor, use mm/aaaa.")
while True:
data_final = input('Insira data final (mm/aaaa): ')
if validar_data(data_final):
break
else:
print("Formato de data inválido. Por favor, use mm/aaaa.")
return termo_pesquisa, data_inicial, data_final
def realizar_requisicao(url, session, method=’get’, retries=3, **kwargs):
“””Realiza uma requisição HTTP com tentativas de repetição.”””
for tentativa in range(retries):
try:
if method == ‘get’:
response = session.get(url, verify=False, **kwargs)
elif method == ‘post’:
response = session.post(url, verify=False, **kwargs)
response.raise_for_status() # Lança um erro para códigos de status HTTP >= 400
return response
except RequestException as e:
logging.warning(f”Tentativa {tentativa + 1} falhou: {e}”)
time.sleep(2) # Espera antes de tentar novamente
raise Exception(f”Falha ao realizar a requisição após {retries} tentativas.”)
def salvar_dados_csv(dados_acordaos, diretorio, nome_arquivo):
“””Salva os dados extraídos em um arquivo CSV.”””
caminho_completo = os.path.join(diretorio, nome_arquivo)
with open(caminho_completo, 'w', newline='', encoding='utf-8') as arquivo_csv:
campos = ['Número do Processo', 'Tipo do Recurso', 'Data da Sessão', 'Relator(a)', 'Nº Acórdão', 'Decisão', 'Ementa(s)']
escritor_csv = csv.DictWriter(arquivo_csv, fieldnames=campos)
escritor_csv.writeheader()
escritor_csv.writerows(dados_acordaos)
logging.info(f’Os dados foram salvos em {caminho_completo}’)
def main():
termo_pesquisa, data_inicial, data_final = solicitar_parametros()
# URL da página de consulta de jurisprudência
url_base = ‘https://carf.fazenda.gov.br/sincon/public/pages/ConsultarJurisprudencia/consultarJurisprudenciaCarf.jsf’
session = requests.Session()
# Passo 0: Realizar a requisição inicial
try:
response = realizar_requisicao(url_base, session)
except Exception as e:
logging.error(f"Erro ao realizar a requisição inicial: {e}")
return
# Passo 1: Realizar a pesquisa
payload = {
'formPesquisaJurisprudencia:dataInicialInputDate': data_inicial,
'formPesquisaJurisprudencia:dataFinalInputDate': data_final,
'formPesquisaJurisprudencia:valor_pesquisa3': termo_pesquisa,
'formPesquisaJurisprudencia:btnPesquisar': 'Pesquisar'
}
try:
response = realizar_requisicao(url_base, session, method='post', data=payload)
except Exception as e:
logging.error(f"Erro ao realizar a pesquisa: {e}")
return
soup = BeautifulSoup(response.content, 'html.parser')
# Passo 2: Capturar links dos acórdãos e acessar suas páginas
acordaos_links = []
for link in soup.find_all('a', id=lambda x: x and x.startswith('tblJurisprudencia:')):
acordaos_links.append(link['href'])
dados_acordaos = []
# Passo 3: Navegar em cada link de acórdão e capturar as informações
for link in acordaos_links:
acordao_url = f’https://carf.fazenda.gov.br{link}’
try:
response = realizar_requisicao(acordao_url, session)
soup = BeautifulSoup(response.content, ‘html.parser’)
numero_processo = soup.find('span', id='formAcordaos:numProcesso').text
tipo_recurso = soup.find('span', id='formAcordaos:labeTipoRecurso').find_next_sibling().text.strip()
data_sessao = soup.find('span', id='formAcordaos:dataSessao').text
relator = soup.find('span', id='formAcordaos:relator').text
numero_acordao = soup.find('span', id='formAcordaos:numDecisao').text
decisao = soup.find('span', id='formAcordaos:textDecisao').text.strip()
ementa = soup.find('span', id='formAcordaos:ementa').text.strip()
dados_acordaos.append({
'Número do Processo': numero_processo,
'Tipo do Recurso': tipo_recurso,
'Data da Sessão': data_sessao,
'Relator(a)': relator,
'Nº Acórdão': numero_acordao,
'Decisão': decisao,
'Ementa(s)': ementa
})
except AttributeError as e:
logging.error(f"Erro ao extrair dados do acórdão: {e}")
continue
except Exception as e:
logging.error(f"Erro ao acessar acórdão: {e}")
continue
# Passo 4: Salvar os dados em um arquivo CSV
while True:
diretorio = input("Digite o diretório onde deseja salvar o arquivo CSV (ou pressione Enter para usar o padrão): ")
if not diretorio:
diretorio = "C:\Users\kho\Documents\Projetos\[web_scraping]IPI_Refrigerantes"
if os.path.isdir(diretorio):
break
else:
print("Diretório inválido. Por favor, tente novamente.")
nome_arquivo = input("Digite o nome do arquivo CSV: ") + ".csv"
salvar_dados_csv(dados_acordaos, diretorio, nome_arquivo)
if name == “main“:
main()
“
Espero conseguir salvar em csv o resultado da raspagem
Kamila Analytics is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.