Releases: marcellofilgueiras/trf5
Markdown explicando a funçao
explicando construção e uso da função
Disponível em: https://rpubs.com/marcellofilgueiras/scrapper_trf5
title: "TCC Curso-R: Scrapper TRF5"
author: "Marcello S. Filgueiras"
date: "24/10/2021"
output:
html_document:
theme: readable
toc: true
number_section: true
toc_float:
collapsed: false
smooth_scroll: false
Apresentação
Olá sou Marcello Filgueiras, faço Direito na UFJF (Universidade Federal de Juiz de Fora), e me interesso por Jurimetria. Minha ideia é baixar dados de tribunais para fazer pesquisa acadêmica, mas também estou tentando entrar com consultoria jurídica em mercado da jurimetria.
O objetivo desse scrapper é baixar a jurisprudência, o conjunto de decisões do TRF-5, o Tribunal Regional Federal do Nordeste, bem como a consulta processual de cada um dos processos específicos, que irá buscar metadados do processo, suas partes e as respectivas movimentações.
Portanto, são dois scrappers: Um do buscador de jurisprudência, outro da consulta processual.
Aqui estão os pacotes usados nesse processo.
knitr::opts_chunk$set(echo = TRUE)
#mais na primeira
library(tidyverse)
library(httr)
library(abjutils)
library(jsonlite)
#Mais a segunda
library(xml2)
library(rvest)
library(lubridate)
Buscador de Jurisprudência
Trata-se de um buscador de julgados que vai te retornar decisões dos tribunais, a partir de uma pesquisa em texto, possibilitando de filtrar por orgão julgador, por relator que redigiu o acórdão ou por período de tempo. Por fim, ainda, é possível buscar diretamente o julgado com o número do processo específico.
Apesar de parecer uma requisição POST, o site leva a uma API escondida que utiliza requisições GET. Os dados vêm em json, o que possibilita muito menos trabalho no parsing.
Acessando a API escondida
Parece um POST por ser um formulário, mas leva a uma API que dá .json, por meio de um GET, que tem a seguinte URL base.
url_base <- "https://julia-pesquisa.trf5.jus.br/julia-pesquisa/api/documentos:dt?"
Teste Super Específico
Ao fazer uma pesquisa na Jurisprudência pelo texto de "28,86%" em referência a uma tese consolidada sobre direito aumento de salários de professores federais no montante de 28,86%, do Relator Alcides Saldanha Lima, da 3ª Turma recursal, num espaço de 10 anos.
Nos headers, estes são os parâmetros que retornam do navegador:
Dentro da query, essa busca pode ser feita com {httr}.
query_teste_especifico<- list(
"draw" = "1",
"columns[0][data]" = "codigoDocumento",
"columns[0][name]" = "",
"columns[0][searchable]" = "true",
"columns[0][orderable]" = "false",
"columns[0][search][value]" = "",
"columns[0][search][regex]" = "false",
"start" = "0",
"length" = "10",
"search[value]" = "",
"search[regex]" = "false",
"pesquisaLivre" = "28,86%",
"numeroProcesso" = "",
"orgaoJulgador" = "3ª TURMA",
"relator" = "ALCIDES SALDANHA LIMA",
"dataIni" = "01/01/2010",
"dataFim" = "03/10/2021",
"_" = "1633297312330")
teste_especifico <- httr::GET(url_base,
query =query_teste_especifico)
# Vendo o resultado, temos um Json, com dados em Listas.
content(teste_especifico) %>%
str(max=2)
Podemos ver então que, de início, conseguimos baixar todos os processos, com parâmetros bem definidos, nos seguintes parâmeteros:
Parâmetro | Dados Buscados |
---|---|
"pesquisaLivre" | "28,86%", |
"numeroProcesso" | "", |
"orgaoJulgador" | "3? TURMA", |
"relator" | "ALCIDES SALDANHA LIMA", |
"dataIni" | "01/01/2010", |
"dataFim" | "03/10/2021", |
Esses headers respondem, portanto, ao que colocamos no buscador. O que fazem os outros parâmetros, especialmente para paginação?
Poderíamos saber, mas essa busca retornou apenas um julgado. Vamos então para quantidades maiores de julgados, com uma requisição mais genérica.
Mas os dados estão dentro do elemento de nome "data".
Teste Genérico
Nesse teste, procuramos somente pelo testo "28,86%":
query_teste_generico <- list(
"draw" = "1",
"columns[0][data]" = "codigoDocumento",
"columns[0][name]" = "",
"columns[0][searchable]" = "true",
"columns[0][orderable]" = "false",
"columns[0][search][value]" = "",
"columns[0][search][regex]" = "false",
"start" = "0",
"length" = "10",
"search[value]" = "",
"search[regex]" = "false",
"pesquisaLivre" = "28,86%",
"numeroProcesso" = "",
"orgaoJulgador" = "",
"relator" = "",
"dataIni" = "",
"dataFim" = "",
"_" = "1633297312330")
teste_generico <- httr::GET(url_base,
query = query_teste_generico)
content(teste_generico)%>%
str(max=2)
Temos 9000 julgados, com 10 por página. Vamos então trocar de página para ver o que acontece:
Sabemos, portanto, que aumentando o parâmetro start, ele vai começar a exibir a partir dos próximos 10 julgados. Ele também registra no draw qual número de páginas que você está (na verdade, quantas você trocou). Ao final um parâmetro underline misterioso que registra, ao que parece, o número de vezes que uma requisição foi pedida no site. Ele sobe progressivamente, mas se você acessa o site. Estamos chegando na forma de saber como a API funciona.
Última questão. Os parâmetro draw e underline misterioso podem ser retirados?
O draw não pode ser retirado, retorna erro:
httr::GET(url_base,
query = list(
"columns[0][data]" = "codigoDocumento",
"columns[0][name]" = "",
"columns[0][searchable]" = "true",
"columns[0][orderable]" = "false",
"columns[0][search][value]" = "",
"columns[0][search][regex]" = "false",
"start" = "0",
"length" = "10",
"search[value]" = "",
"search[regex]" = "false",
"pesquisaLivre" = "28,86%",
"numeroProcesso" = "",
"orgaoJulgador" = "",
"relator" = "",
"dataIni" = "",
"dataFim" = "",
"_" = "1633297312330")) %>%
content()
Mas o misterioso underline com número pode sumir:
httr::GET(url_base,
query = list(
"draw" = "1",
"columns[0][data]" = "codigoDocumento",
"columns[0][name]" = "",
"columns[0][searchable]" = "true",
"columns[0][orderable]" = "false",
"columns[0][search][value]" = "",
"columns[0][search][regex]" = "false",
"start" = "0",
"length" = "10",
"search[value]" = "",
"search[regex]" = "false",
"pesquisaLivre" = "28,86%",
"numeroProcesso" = "",
"orgaoJulgador" = "",
"relator" = "",
"dataIni" = "",
"dataFim" = "")) %>%
content() %>%
str(max=2)
Vamos então criar a função para baixar os dados!
Baixando e Iterando
Se temos 10 processos por página e um universo de 9000 julgados, é só iterar a função 900 vezes com starts diferentes, 0, 10 e 20 e assim vai. O parâmetros draw poderiam ser de 1, 2 e 3, mas só com o 1 funciona, acredito que sendo interpretado como a primeira página que você acessa, so que com o starts diferente.
trf5_baixar_cjsg <- function(pesquisa_livre = "", orgao_julgador = "",
relator = "", data_inicial = "", data_final = "",
diretorio = "") {
# Vamos ter a url_base
url_base <- "https://julia-pesquisa.trf5.jus.br/julia-pesquisa/api/documentos:dt?"
# Vamos baixar a primeira página.
query_1 = list(
"draw" = "1",
"columns[0][data]" = "codigoDocumento",
"columns[0][name]" = "",
"columns[0][searchable]" = "true",
"columns[0][orderable]" = "false",
"columns[0][search][value]" = "",
"columns[0][search][regex]" = "false",
"start" = "0",
"length" = "10",
"search[value]" = "",
"search[regex]" = "false",
"pesquisaLivre" = pesquisa_livre,
"numeroProcesso" = "",
"orgaoJulgador" = orgao_julgador,
"relator" = relator,
"dataIni" = data_inicial,
"dataFim" = data_inicial)
# Fazemos uma sequência de página
n_observacoes <- httr::GET(url_base,
query= query_1) %>%
content() %>%
pluck("recordsTotal")
# Pegando o número de starts pela página
n_starts <- seq(0,n_observacoes,10)
# Fazendo o Map colocando o número de starts de character
purrr::map(.x= n_starts,
~httr::GET(url_base,
query= list(
"draw" = "1",
"columns[0][data]" = "codigoDocumento",
"columns[0][name]" = "",
"columns[0][searchable]" = "true",
"columns[0][orderable]" = "false",
"columns[0][search][value]" = "",
"columns[0][search][regex]" = "false",
"start" = as.character(.x),
"length" = "10",
"search[value]" = "",
"search[regex]" = "false",
"pesquisaLivre" = pesquisa_livre,
"numeroProcesso" = "",
"orgaoJulgador" = orgao_julgador,
"relator" = relator,
"dataIni" = data_inicial,
"dataFim" = data_final),
# Fazendo write_disk para salvar na minha pasta
# nome da pasta ...