Skip to content

Instantly share code, notes, and snippets.

@jtrecenti
Last active June 17, 2025 12:55
Show Gist options
  • Save jtrecenti/789bfef6c99c93d6f50507574275732f to your computer and use it in GitHub Desktop.
Save jtrecenti/789bfef6c99c93d6f50507574275732f to your computer and use it in GitHub Desktop.
import pandas as pd
import os
import requests
from urllib.parse import urlencode
import json
ses = requests.Session()
# download da lista de processos ----------------------------------------------
# usei como critério "*", o que resultou em 9645
# decisões na jurisprudência.
u_base = 'https://jurisprudencia.cade.gov.br/api/select/'
for i in range(10):
arquivo = f'json/cade_{(i+1):02d}_de_10.json'
print(arquivo)
if not os.path.exists(arquivo):
query = (
('q', 'conteudo:*'),
('start', str(1000*i)),
('rows', '1000'), # mesmo que não tenha a opção no site, funciona
('fq', 'descricao_tipo_acesso:("PUBLICO")'),
('hl.maxAnalyzedChars', '-1'),
('fq', 'colecao:("jurisprudencia")'),
('hl', 'on'),
('sort', 'data_ordem%20desc')
)
r = ses.get(u_base, params = urlencode(query, safe='():%'))
with open(arquivo, 'w') as f:
json.dump(r.json(), f)
# parse da lista de processos ------------------------------------------------
# aqui, obtemos um DataFrame com os resultados da pesquisa
arquivos = ['json/' + i for i in os.listdir('json/')]
df = []
for arquivo in arquivos:
with open(arquivo, 'r') as f:
r = json.load(f)
docs = r['response']['docs']
df.append(pd.DataFrame(docs))
df = pd.concat(df)
df.shape
df.to_parquet('cade.parquet')
df.info()
def pesquisar_processo(processo):
processo_num = processo.replace('/', '').replace('-', '').replace('.', '')
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
params = {
'acao_externa': 'protocolo_pesquisar',
'acao_origem_externa': 'protocolo_pesquisar',
'id_orgao_acesso_externo': '0',
}
data = f'txtProtocoloPesquisa={processo}&q=&chkSinProcessos=P&txtParticipante=&hdnIdParticipante=&txtUnidade=&hdnIdUnidade=&selTipoProcedimentoPesquisa=&selSeriePesquisa=&txtDataInicio=&txtDataFim=&g-recaptcha-response=&sbmPesquisar=Pesquisar&txtNumeroDocumentoPesquisa=&txtAssinante=&hdnIdAssinante=&txtDescricaoPesquisa=&txtAssunto=&hdnIdAssunto=&txtSiglaUsuario1=&txtSiglaUsuario2=&txtSiglaUsuario3=&txtSiglaUsuario4=&hdnSiglasUsuarios=&hdnSiglasUsuarios=&partialfields=prot_pesq%3A*{processo_num}*+AND+sta_prot%3AP&requiredfields=&as_q=&click=2&hdnFlagPesquisa=1'
response = requests.post(
'https://sei.cade.gov.br/sei/modulos/pesquisa/md_pesq_processo_pesquisar.php',
params=params,
headers=headers,
data=data,
)
soup = BeautifulSoup(response.text, 'html.parser')
td = soup.find('td', class_='pesquisaTituloEsquerda')
links = td.find_all('a')
link = 'https://sei.cade.gov.br/sei/modulos/pesquisa/' + links[0]['href']
r = requests.get(link)
soup = BeautifulSoup(r.text, "html.parser")
# Encontre todas as linhas de dados (ignorando o cabeçalho)
rows = soup.select("tr.infraTrClara")
data = []
for row in rows:
cols = row.find_all("td")
if not cols or len(cols) < 6:
continue # pula linhas vazias ou incompletas
# Documento/Processo: a coluna 1 tem o <a> com o onclick
doc_a = cols[1].find("a", class_="ancoraPadraoAzul")
if doc_a and "onclick" in doc_a.attrs:
onclick = doc_a["onclick"]
# Extrai o link de dentro do window.open('...')
match = re.search(r"window\.open\('([^']+)'", onclick)
link = match.group(1) if match else None
else:
link = None
# Unidade: pode ter <a> ou texto puro
unidade = cols[5].get_text(strip=True)
data.append({
"numero": cols[1].get_text(strip=True),
"tipo_documento": cols[2].get_text(strip=True),
"data_documento": cols[3].get_text(strip=True),
"data_registro": cols[4].get_text(strip=True),
"unidade": unidade,
"link": 'https://sei.cade.gov.br/sei/modulos/pesquisa/' + link,
})
data = pd.DataFrame(data)
return data
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment