diff --git a/.gitignore b/.gitignore index ffc31ef..134b2ed 100755 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ vignettes/rsconnect/* vignettes/libs/* vignettes/style.log docs +tmp/ diff --git a/R/download.R b/R/download.R index 17d63f3..9049e0d 100755 --- a/R/download.R +++ b/R/download.R @@ -10,17 +10,11 @@ #' #' @export cnc_npag <- function() { - tmp <- fs::file_temp() - fs::dir_create(tmp) - on.exit(fs::dir_delete(tmp)) - arq <- cnc_download_pag(1, tmp) - npags <- arq %>% - xml2::read_html() %>% - xml2::xml_find_first("//td[@align='right']") %>% - xml2::xml_text() %>% - stringr::str_extract("(?<=de )[0-9]+") %>% - as.numeric() - npags + httr::GET("http://www.cnj.jus.br/improbidade_adm/consultar_requerido.php?validar=form&rs=pesquisarRequeridoGetTabela&rst=&rsrnd=0&rsargs[]=&rsargs[]=&rsargs[]=&rsargs[]=&rsargs[]=&rsargs[]=&rsargs[]=I&rsargs[]=0&rsargs[]=POSICAO_INICIAL_PAGINACAO_PHP0&rsargs[]=QUANTIDADE_REGISTROS_PAGINACAO15") |> + httr::content() |> + xml2::xml_find_first(xpath = ".//body/table[2]//b[2]") |> + xml2::xml_text() |> + base::as.numeric() } #' Baixa página do CNC @@ -29,7 +23,7 @@ cnc_npag <- function() { #' Acessa páginas do tipo #' #' -#' @param pag página a ser baixada. +#' @param pag Número da página que será baixado #' @param path caminho da pasta onde os arquivos HTML serão salvos. Se a pasta não existir, será criada. #' #' @return As demais funções retornam o caminho do arquivo baixado. @@ -38,12 +32,14 @@ cnc_npag <- function() { #' #' @export cnc_download_pag <- function(pag, path) { - x <- 'http://www.cnj.jus.br/improbidade_adm/consultar_requerido.php?validar=form&rs=pesquisarRequeridoGetTabela&rst=&rsrnd=0&rsargs[]=&rsargs[]=&rsargs[]=&rsargs[]=&rsargs[]=&rsargs[]=&rsargs[]=I&rsargs[]=0&rsargs[]=POSICAO_INICIAL_PAGINACAO_PHP%s&rsargs[]=QUANTIDADE_REGISTROS_PAGINACAO15' + x <- "http://www.cnj.jus.br/improbidade_adm/consultar_requerido.php?validar=form&rs=pesquisarRequeridoGetTabela&rst=&rsrnd=0&rsargs[]=&rsargs[]=&rsargs[]=&rsargs[]=&rsargs[]=&rsargs[]=&rsargs[]=I&rsargs[]=0&rsargs[]=POSICAO_INICIAL_PAGINACAO_PHP%s&rsargs[]=QUANTIDADE_REGISTROS_PAGINACAO15" u <- sprintf(x, as.character((pag - 1) * 15)) fs::dir_create(path) - arq <- sprintf('%s/pag_%05d.html', path, pag) + arq <- sprintf("%s/%s.html", path, pag) if (!file.exists(arq)) { - r <- httr::GET(u, httr::write_disk(arq, overwrite = TRUE)) + httr::GET(u) %>% + httr::content() %>% + readr::write_lines(arq) } arq } @@ -53,18 +49,21 @@ cnc_download_pag <- function(pag, path) { #' [cnc_download_pessoa()] baixa HTML de pesquisas do tipo #' #' -#' @param link retornado pela função [cnc_parse_pag()]. +#' @param id_condenacao ID da condenação +#' @param path Caminho onde será salvo #' #' @rdname download #' #' @export -cnc_download_pessoa <- function(link, path) { +cnc_download_condenacao <- function(id_condenacao, path) { fs::dir_create(path) - num_link <- gsub('[^0-9]', '', link) - f <- sprintf('%s/%s.html', path, num_link) + # num_link <- gsub('[^0-9]', '', link) + f <- sprintf("%s/%s.html", path, id_condenacao) if (!file.exists(f)) { - link <- paste0('http://www.cnj.jus.br/improbidade_adm/', link) - httr::GET(link, httr::write_disk(f, TRUE)) + link <- paste0("http://www.cnj.jus.br/improbidade_adm/visualizar_condenacao.php?seq_condenacao=", id_condenacao) + httr::GET(link) %>% + httr::content() |> + readr::write_lines(f) } f } @@ -73,33 +72,48 @@ cnc_download_pessoa <- function(link, path) { #' #' [cnc_download_processo()] baixa HTML de pesquisas do tipo #' +#' @param id_processo ID do processo +#' @path path Caminho onde o arquivo será salvo #' #' @rdname download #' #' @export -cnc_download_processo <- function(link, path) { - cnc_download_pessoa(link, path) +cnc_download_processo <- function(id_processo, path) { + fs::dir_create(path) + # num_link <- gsub('[^0-9]', '', link) + f <- sprintf("%s/%s.html", path, id_processo) + if (!file.exists(f)) { + link <- paste0("http://www.cnj.jus.br/improbidade_adm/visualizar_processo.php?seq_processo=", id_processo) + httr::GET(link) %>% + httr::content() |> + readr::write_lines(f) + } + f } #' Baixa infos de pessoa #' #' [cnc_download_pessoa_infos()] baixa HTML de pesquisas do tipo #' +#' @oaram id ID da pessoa +#' @param path Caminho onde o arquivo será salvo #' #' @rdname download #' #' @export -cnc_download_pessoa_infos <- function(link, path) { +cnc_download_pessoa_infos <- function(id, path) { fs::dir_create(path) - num_link <- gsub('[^0-9]', '', link) - f <- sprintf('%s/%s.html', path, num_link) + # num_link <- gsub("[^0-9]", "", link) + f <- sprintf("%s/%s.html", path, id) if (!file.exists(f)) { link <- paste0( "http://www.cnj.jus.br/improbidade_adm/visualizar_condenacao.php?", "seq_condenacao=1&rs=getDadosParte&rst=&rsrnd=0&rsargs[]=", - num_link + id ) - httr::GET(link, httr::write_disk(f, TRUE)) + httr::GET(link) %>% + httr::content() %>% + readr::write_lines(f) } f } diff --git a/R/parse.R b/R/parse.R index 8a5c8dc..c110b42 100755 --- a/R/parse.R +++ b/R/parse.R @@ -1,54 +1,61 @@ +get_number_from_url_parameter <- function(href) { + parts <- href |> stringr::str_split(pattern = "=", simplify = TRUE) + parts |> + purrr::pluck(length(parts)) |> + stringr::str_replace("\\\\'", "") +} + #' Parse dos arquivos HTML baixados #' #' [cnc_parse_pag()] transforma arquivo HTML de uma página do CNC em um data.frame. #' -#' @param arq caminho do arquivo que deve ser processado. +#' @param html string que deve ser processado. #' #' @return Para [cnc_parse_pag()], uma `tibble` com as colunas #' #' \itemize{ -#' \item `id` id (1 a 15) do indivíduo obtido na página. -#' \item `key` `"nm_pessoa"` ou `"num_processo"`, indicando se é o nome da pessoa ou número do processo. -#' \item `value` nome da pessoa ou número do processo. -#' \item `link` para acessar informações da pessoa ou do processo (info utilizada nos outros scrapers). +#' \item `nome` Nome da pessoa +#' \item `num_processo` número do processo +#' \item `condenacao_id` ID da condenação +#' \item `processo_id` ID do processo #' } #' #' @name parse #' #' @export -cnc_parse_pag <- function(arq) { +cnc_parse_pag <- function(html) { + html |> + xml2::read_html() |> + xml2::xml_find_all(xpath = ".//body//table[1]") |> + xml2::xml_children() |> + purrr::discard(\(xml_node) xml2::xml_attr(xml_node, "class") == "\\'fundoTr\\'") |> + purrr::map(\(xml_node) { + # Cada node tem dois filhos, o primeiro o nome da pessoa e o segundo o numero do + # processo + lhs_node <- xml_node |> xml2::xml_find_all(".//td[1]//a") + rhs_node <- xml_node |> xml2::xml_find_all(".//td[2]//a") - aux_tab <- arq %>% - xml2::read_html() %>% - rvest::html_nodes('table') %>% - dplyr::first() - - tb <- aux_tab %>% - rvest::html_table(header = TRUE) %>% - purrr::set_names(c('nm_pessoa', 'num_processo')) %>% - dplyr::mutate(id = 1:n()) %>% - tidyr::pivot_longer(-id, names_to = "key") %>% - dplyr::mutate( - value = stringr::str_replace_all(value, stringr::fixed('\\'), '@'), - value = stringr::str_replace_all(value, "\n|\t|@.", ''), - value = stringr::str_trim(value) - ) + lhs_href <- lhs_node |> xml2::xml_attr("href") + rhs_href <- rhs_node |> xml2::xml_attr("href") - l0 <- aux_tab %>% - xml2::xml_find_all('//a') %>% - rvest::html_attr('href') %>% - stringr::str_replace_all("'|\\\\", '') + nome <- lhs_node |> + xml2::xml_text() |> + stringr::str_replace_all(stringr::fixed("\\"), "@") |> + stringr::str_replace_all("\n|\t|@.", "") |> + stringr::str_trim() - # links <- c( - # l0[stringr::str_detect(l0, '_condenacao')], - # l0[stringr::str_detect(l0, '_processo')] - # ) - - tb %>% - tibble::as_tibble() %>% - # dplyr::mutate(link = links) - dplyr::mutate(link = l0) + condenacao_id <- lhs_href |> get_number_from_url_parameter() + processo_id <- rhs_href |> get_number_from_url_parameter() + base::list( + nome = nome, + condenacao_id = condenacao_id, + num_processo = rhs_node |> xml2::xml_text() |> stringr::str_trim(), + processo_id = processo_id + ) + }) |> + purrr::list_transpose() |> + tibble::as_tibble() } #' Página de pessoa de processos para dados. @@ -67,9 +74,16 @@ cnc_parse_pag <- function(arq) { #' @rdname parse #' #' @export -cnc_parse_pessoa <- function(arq) { +cnc_parse_condenacao <- function(arq) { # data de cadastro h <- xml2::read_html(arq) + + empty_body <- h |> xml2::xml_find_first(xpath = ".//body") |> xml2::xml_length() == 0 + + if (empty_body) { + return(tibble::tibble()) + } + dt_cad <- h %>% xml2::xml_find_all(xpath = '//td[@class="td_form" and @width="20%"]//following-sibling::td[1]') %>% rvest::html_text() %>% @@ -83,33 +97,34 @@ cnc_parse_pessoa <- function(arq) { stringr::str_trim() n_link <- h %>% xml2::xml_find_all(xpath = '//td[@width="85%"]//a') %>% - xml2::xml_attr('href') %>% + xml2::xml_attr("href") %>% stringr::str_trim() tab_processo <- h %>% xml2::xml_find_all("//*[@id='hierarquia']//div") %>% xml2::xml_text() %>% stringr::str_replace_all("[[:space:]]+", " ") %>% stringr::str_trim() %>% - stringr::str_split_fixed(':', 2) %>% + stringr::str_split_fixed(":", 2) %>% data.frame(stringsAsFactors = FALSE) %>% tibble::as_tibble() %>% - purrr::set_names(c('key', 'value')) %>% + purrr::set_names(c("key", "value")) %>% dplyr::mutate(dplyr::across(.fns = stringr::str_squish)) %>% - dplyr::add_row(key = 'n_processo', value = n_processo) %>% - dplyr::add_row(key = 'link', value = n_link) %>% + dplyr::add_row(key = "n_processo", value = n_processo) %>% + dplyr::add_row(key = "link", value = n_link) %>% dplyr::filter(value != "") # dados da pessoa ---- aux_tab_pessoa <- h %>% xml2::xml_find_all('//table[@width="700px" and @align="center"]//tr//table') %>% - dplyr::last() + utils::tail(n=1) tb <- rvest::html_table(aux_tab_pessoa, fill = TRUE) %>% - setNames(c('nome', 'situacao', 'na')) %>% + purrr::pluck(1) %>% + setNames(c("nome", "situacao", "na")) %>% dplyr::select(nome, situacao) %>% dplyr::slice(2) link <- aux_tab_pessoa %>% - xml2::xml_find_first('.//a') %>% - xml2::xml_attr('onclick') + xml2::xml_find_first(".//a") %>% + xml2::xml_attr("onclick") tab_pessoa <- tb %>% dplyr::mutate(link = link) %>% tidyr::pivot_longer(dplyr::everything(), names_to = "key") @@ -117,7 +132,7 @@ cnc_parse_pessoa <- function(arq) { # dados da condenacao ---- assunto <- h %>% xml2::xml_find_all("//script") %>% - dplyr::last() %>% + utils::tail(n=1) %>% xml2::xml_text() %>% stringr::str_extract_all("(?<=addAssunto\\(')[^)]+") %>% purrr::flatten_chr() %>% @@ -131,12 +146,12 @@ cnc_parse_pessoa <- function(arq) { tipo_pena <- h %>% xml2::xml_find_first('//input[@type="radio" and @checked="checked"]') %>% - xml2::xml_attr('value') + xml2::xml_attr("value") tipo_pena <- ifelse( - tipo_pena == 'J', - 'Tr\u00e2nsito em julgado', - '\u00d3rg\u00e3o colegiado' + tipo_pena == "J", + "Tr\u00e2nsito em julgado", + "\u00d3rg\u00e3o colegiado" ) aux_infos <- h %>% @@ -147,15 +162,14 @@ cnc_parse_pessoa <- function(arq) { aux_infos <- aux_infos[-seq_len(indice)] tab_condenacao <- purrr::map_dfr(aux_infos, montar_info) %>% dplyr::mutate(dplyr::across(.fns = stringr::str_squish)) %>% - dplyr::filter(key != 'na', key != 'Tipo Julgamento') %>% - dplyr::add_row(key = 'tipo_pena', value = tipo_pena) %>% + dplyr::filter(key != "na", key != "Tipo Julgamento") %>% + dplyr::add_row(key = "tipo_pena", value = tipo_pena) %>% dplyr::bind_rows(assunto) dplyr::bind_rows(tab_processo, tab_pessoa, tab_condenacao) } montar_info <- function(info) { - key_span <- info %>% xml2::xml_find_first(".//span") @@ -168,7 +182,6 @@ montar_info <- function(info) { stringr::str_squish() tibble::tibble(key, value) - } #' Página de resultados de processos para dados. @@ -194,18 +207,18 @@ cnc_parse_processo <- function(arq) { xml2::xml_text() %>% stringr::str_replace_all("[[:space:]]+", " ") %>% stringr::str_trim() %>% - stringr::str_split_fixed(':', 2) %>% + stringr::str_split_fixed(":", 2) %>% data.frame(stringsAsFactors = FALSE) %>% tibble::as_tibble() %>% - purrr::set_names(c('key', 'value')) %>% + purrr::set_names(c("key", "value")) %>% dplyr::mutate(dplyr::across(.fns = stringr::str_squish)) tab_condenacao <- h %>% xml2::xml_find_first('//table[@width="700px" and @align="center"]') %>% rvest::html_table(fill = TRUE) %>% - dplyr::filter(stringr::str_detect(X1, 'Num. do|Data da')) %>% + dplyr::filter(stringr::str_detect(X1, "Num. do|Data da")) %>% dplyr::select(key = X1, value = X2) %>% - dplyr::mutate(key = gsub(':', '', key)) %>% + dplyr::mutate(key = gsub(":", "", key)) %>% tibble::as_tibble() dplyr::bind_rows(tab_processo, tab_condenacao) %>% @@ -228,15 +241,14 @@ cnc_parse_processo <- function(arq) { #' #' @export cnc_parse_pessoa_infos <- function(arq) { - h <- xml2::read_html(arq) s <- h %>% xml2::xml_text() %>% - stringr::str_match('res = \'(.*?)\';') %>% + stringr::str_match("res = '(.*?)';") %>% as.data.frame(stringsAsFactors = FALSE) %>% with(V2) %>% - stringr::str_split(',') %>% + stringr::str_split(",") %>% unlist() tibble::tibble( @@ -252,8 +264,8 @@ cnc_parse_pessoa_infos <- function(arq) { cod = s[12] ) %>% dplyr::mutate( - uf = ifelse(publico == 'N', '', uf), - sexo = ifelse(tipo_pessoa == 'J', '', tipo_pessoa) + uf = ifelse(publico == "N", "", uf), + sexo = ifelse(tipo_pessoa == "J", "", tipo_pessoa) ) %>% tidyr::pivot_longer(dplyr::everything(), names_to = "key") } diff --git a/R/tidy.R b/R/tidy.R index eee8b45..d2b9bfa 100755 --- a/R/tidy.R +++ b/R/tidy.R @@ -3,9 +3,9 @@ tidy_nm <- function(x) { tolower() %>% abjutils::rm_accent() %>% stringr::str_trim() %>% - stringr::str_replace_all('[^0-9a-z]+', '_') %>% - stringr::str_replace_all('_+', '_') %>% - stringr::str_replace_all('^_|_$', '') + stringr::str_replace_all("[^0-9a-z]+", "_") %>% + stringr::str_replace_all("_+", "_") %>% + stringr::str_replace_all("^_|_$", "") } #' Tidyfica base que vem de parse_cnc_pags @@ -17,15 +17,19 @@ tidy_nm <- function(x) { #' @export tidy_pags <- function(cnc_pags) { cnc_pags_tidy <- cnc_pags %>% - tidyr::unite(v, value, link, sep = '@@@') %>% + tidyr::unite(v, value, link, sep = "@@@") %>% tidyr::spread(key, v) %>% - tidyr::separate(nm_pessoa, c('lab_pessoa', 'link_condenacao'), sep = '@@@') %>% - tidyr::separate(num_processo, c('lab_processo', 'link_processo'), sep = '@@@') %>% + tidyr::separate(nm_pessoa, c("lab_pessoa", "link_condenacao"), sep = "@@@") %>% + tidyr::separate(num_processo, c("lab_processo", "link_processo"), sep = "@@@") %>% dplyr::rename(id_pag = id) %>% - dplyr::mutate(id_processo = stringr::str_extract(link_processo, '[0-9]+$'), - id_condenacao = stringr::str_extract(link_condenacao, '[0-9]+$')) %>% - dplyr::select(arq_pag, id_pag, id_condenacao, id_processo, lab_pessoa, - lab_processo, link_condenacao, link_processo) + dplyr::mutate( + id_processo = stringr::str_extract(link_processo, "[0-9]+$"), + id_condenacao = stringr::str_extract(link_condenacao, "[0-9]+$") + ) %>% + dplyr::select( + arq_pag, id_pag, id_condenacao, id_processo, lab_pessoa, + lab_processo, link_condenacao, link_processo + ) cnc_pags_tidy } @@ -42,244 +46,194 @@ tidy_pags <- function(cnc_pags) { #' @import tidyr #' @export tidy_processos <- function(cnc_processos) { - cnc_processos_spr <- cnc_processos %>% - mutate(key = tidy_nm(key)) %>% - group_by(arq_processo, key) %>% - summarise(value = paste(value, collapse = '\n')) %>% - ungroup() %>% - filter(key != "") %>% - spread(key, value) %>% - select(-`4ra`) - # setNames(c('arq', 'subsecao', names(.)[-c(1, 2)])) - cnc_processos_tidy <- cnc_processos_spr %>% - unite(secao, secao_judiciaria, subsecao, sep = '\n') %>% - mutate(secao = if_else(secao == 'NA\nNA', NA_character_, secao)) %>% - mutate(secao = if_else(is.na(secao), comarca, secao)) + sanitize <- cnc_processos |> + purrr::map_df(\(c) { + df <- c |> + purrr::pluck("df") - cnc_processos_tidy %<>% - mutate(instancia = if_else( - !is.na(`1_grau_justica_estadual`) | - !is.na(`1_grau_justica_federal`), - '1 grau', - if_else( - !is.na(`2_grau_justica_estadual`) | - !is.na(`2_grau_justica_federal`), - '2 grau', - if_else(!is.na(auditoria_militar), 'militar', 'superior') - ) - )) %>% - unite(tribunal, tribunal_de_justica_estadual:tribunal_superior) %>% - mutate( - tribunal = str_replace_all(tribunal, '_NA|NA_', ''), - tribunal = if_else(tribunal == 'NA', NA_character_, tribunal) - ) %>% - unite(vara_camara, - starts_with('gabinete'), - starts_with('varas'), - auditoria_militar) %>% - mutate( - vara_camara = str_replace_all(vara_camara, '_NA|NA_', ''), - vara_camara = if_else(vara_camara == 'NA', NA_character_, vara_camara) - ) %>% - mutate( - dt_propositura = dmy(data_da_propositura_da_acao), - dt_cadastro = dmy_hms(data_da_informacao) - ) %>% - mutate(id_processo = str_match(arq_processo, "([0-9]+)\\.html$")[, 2]) %>% - select( - arq_processo, - id_processo, - dt_cadastro, - n_processo = num_do_processo, + processo_id <- c |> purrr::pluck("processo_id") + + if (base::nrow(df) == 0) { + return(tibble::tibble(processo_id = processo_id)) + } + + df |> + dplyr::filter(stringr::str_length(key) > 0) |> + dplyr::mutate(key = tidy_nm(key)) |> + dplyr::group_by(key) |> + dplyr::group_split() |> + purrr::map_df(\(df_by_key) { + if (base::nrow(df_by_key) > 1) { + return(df_by_key |> + dplyr::mutate(key = stringr::str_c(key, dplyr::row_number(), sep = "_"))) + } + df_by_key + }) |> + tidyr::pivot_wider(names_from = key, values_from = value) |> + tibble::add_column(processo_id = processo_id) + }) + + sanitize |> + dplyr::transmute( + instancia = dplyr::case_when( + !is.na(`2_grau_justica_estadual`) | !is.na(`2_grau_justica_federal`) ~ "2 grau", + !is.na(`1_grau_justica_estadual`) | !is.na(`1_grau_justica_federal`) ~ "1 grau", + !is.na(`auditoria_militar`) ~ "militar", + .default = "superior" + ), + tribunal = dplyr::case_when( + !is.na(tribunal_de_justica_estadual) ~ tribunal_de_justica_estadual, + !is.na(tribunal_regional_federal) ~ tribunal_regional_federal, + !is.na(tribunal_militar_estadual) ~ tribunal_militar_estadual, + ), esfera_processo = esfera, - tribunal, - instancia, - comarca_secao = secao, - vara_camara, - dt_propositura + num_do_processo = num_do_processo, + processo_id = processo_id, + comarca = comarca, + dt_propositura = lubridate::dmy(data_da_propositura_da_acao), + dt_cadastro = lubridate::dmy_hms(data_da_informacao), + esfera_gabinete_desembargador = dplyr::case_when( + !is.na(gabinete_de_desembargador_estadual) ~ "Estadual", + !is.na(gabinete_de_desembargador_federal) ~ "Federal" + ), + gabinete_desembargador = dplyr::case_when( + !is.na(gabinete_de_desembargador_estadual) ~ gabinete_de_desembargador_estadual, + !is.na(gabinete_de_desembargador_federal) ~ gabinete_de_desembargador_federal + ), + secao_judiciaria = secao_judiciaria, + subsecao_1 = dplyr::case_when( + !is.na(subsecao) ~ subsecao, + !is.na(subsecao_1) ~ subsecao_1 + ), + subsecao_2 = subsecao_2, + esfera_vara_juizado = dplyr::case_when( + !is.na(varas_e_juizados_federais) ~ "Federal", + !is.na(varas_e_juizados_estaduais) ~ "Estadual" + ), + vara_juizados_1 = dplyr::case_when( + !is.na(varas_e_juizados_federais) ~ varas_e_juizados_federais, + !is.na(varas_e_juizados_estaduais) ~ varas_e_juizados_estaduais, + !is.na(varas_e_juizados_federais_1) ~ varas_e_juizados_federais_1, + !is.na(varas_e_juizados_estaduais_1) ~ varas_e_juizados_estaduais_1 + ), + vara_juizados_2 = dplyr::case_when( + !is.na(varas_e_juizados_federais_2) ~ varas_e_juizados_federais_2, + !is.na(varas_e_juizados_estaduais_2) ~ varas_e_juizados_estaduais_2 + ), + auditoria_militar = auditoria_militar ) - - cnc_processos_tidy } -#' Tidyfica base que vem de parse_cnc_pessoas, parse_cnc_pags e parse_cnc_processos -#' -#' Tidyfica base que vem de parse_cnc_pessoas, parse_cnc_pags e parse_cnc_processos. +#' Tidyfica base que vem de parse_cnc_condenacoes #' #' @param cnc_condenacoes base raw de condenações. -#' @param cnc_pags base raw das paginas. -#' @param cnc_processos base raw dos processos. #' #' @import dplyr #' @importFrom lubridate dmy #' @import stringr -#' @import tidyr -#' @import janitor +#' @import purrr #' #' @export -tidy_condenacoes <- function(cnc_condenacoes, cnc_pags, cnc_processos) { - loc <- readr::locale(decimal_mark = ',', grouping_mark = '.') +tidy_condenacoes <- function(cnc_condenacoes) { + sanitize <- cnc_condenacoes |> + purrr::map_df(\(c) { + condenacao_id <- c |> purrr::pluck("condenacao_id") + df <- c |> purrr::pluck("df") + + if (base::nrow(df) == 0) { + return(tibble::tibble(condenacao_id = condenacao_id)) + } + + df |> + dplyr::filter(stringr::str_length(key) > 0) |> + dplyr::filter(!(key == "link" & stringr::str_starts(value, "visualizar_processo.php?"))) |> + dplyr::mutate(key = key |> tidy_nm()) |> + dplyr::group_by(key) |> + dplyr::group_split() |> + purrr::map_df(\(df_by_key) { + if (base::nrow(df_by_key) > 1) { + return(df_by_key |> + dplyr::mutate(key = stringr::str_c(key, dplyr::row_number(), sep = "_"))) + } + df_by_key + }) |> + tidyr::pivot_wider(names_from = key, values_from = value) |> + tibble::add_column(condenacao_id = c |> purrr::pluck("condenacao_id")) + }) + + loc <- readr::locale(decimal_mark = ",", grouping_mark = ".") + re_pena <- sprintf( - 'Anos%s([0-9]+)%sMeses%s([0-9]+)%sDias%s([0-9]+)', - '[[:space:]]+', - '[[:space:]]+', - '[[:space:]]+', - '[[:space:]]+', - '[[:space:]]+', - '[[:space:]]+' + "Anos%s([0-9]+)%sMeses%s([0-9]+)%sDias%s([0-9]+)", + "[[:space:]]+", + "[[:space:]]+", + "[[:space:]]+", + "[[:space:]]+", + "[[:space:]]+", + "[[:space:]]+" ) - re_pena_de <- 'De:?[[:space:]]+([0-9]{2}/[0-9]{2}/[0-9]{4})' - re_pena_ate <- 'At\u00e9:?[[:space:]]+([0-9]{2}/[0-9]{2}/[0-9]{4})' - calcula_pena <- function(pena_txt) { - conta <- function(x) { - x <- as.numeric(x) - x[1] * 365 + x[2] * 30 + x[3] - } - apply(str_match(pena_txt, re_pena)[, c(2:4)], 1, conta) - } - cnc_condenacoes_spr <- cnc_condenacoes %>% - mutate( - key = tidy_nm(key), - key = if_else( - key == 'link' & str_detect(value, 'recuperarDados'), - 'link_pessoa', - if_else( - key == 'link' & str_detect(value, 'visualizar_pr'), - 'link_processo', - key - ) - ) - ) %>% - filter(!key %in% unique(tidy_nm(cnc_processos$key))) %>% - group_by(arq_pessoa, key) %>% - summarise(value = paste(value, collapse = '\n')) %>% - ungroup() %>% - spread(key, value) %>% - mutate_all(funs(suppressWarnings(na_if(., '')))) %>% - mutate_all(funs(suppressWarnings(na_if(., 'NA')))) %>% - remove_empty() %>% - rename(arq = arq_pessoa) - - aux_pags <- cnc_pags %>% - tidy_pags() %>% - select(arq_pag, id_pag, id_condenacao, id_processo) + re_pena_de <- "De:?[[:space:]]+([0-9]{2}/[0-9]{2}/[0-9]{4})" + re_pena_ate <- "At\u00e9:?[[:space:]]+([0-9]{2}/[0-9]{2}/[0-9]{4})" - cnc_condenacoes_tidy <- cnc_condenacoes_spr %>% - mutate( - id_pessoa = str_match(link_pessoa, "'([0-9]+)'")[, 2], - id_condenacao = str_match(arq, "([0-9]+)\\.html$")[, 2] - ) %>% - mutate( - dt_pena = dmy(label_data_julg_coleg) - # dt_transito = dmy(data_do_transito_em_julgado), - # dt_pena = if_else(is.na(dt_decisao), dt_transito, dt_decisao) - ) %>% - mutate(teve_inelegivel = tolower(inelegibilidade)) %>% - mutate( - teve_multa = if_else( - str_detect(pagamento_de_multa, 'SIM'), - 'sim', - pagamento_de_multa - ), - vl_multa = if_else( - str_detect(pagamento_de_multa, 'SIM'), + sanitize |> + dplyr::transmute( + condenacao_id = condenacao_id, + dt_pena = lubridate::dmy(label_data_julg_coleg), + teve_inelegivel = stringr::str_detect(inelegibilidade, "SIM"), + teve_multa = base::is.character(pagamento_de_multa) & stringr::str_detect(pagamento_de_multa, "SIM"), + vl_multa = base::ifelse( + teve_multa, readr::parse_number(pagamento_de_multa, locale = loc), NA_real_ - ) - ) %>% - rename(pena_txt = label_pena_privativa) %>% - mutate( - # pena_txt = if_else( - # is.na(pena_privativa_de_liberdade), - # pena_privativa_de_liberdade_aplicada, - # pena_privativa_de_liberdade - # ), - teve_pena = if_else(str_detect(pena_txt, 'SIM'), 'sim', pena_txt), - duracao_pena_regex = calcula_pena(pena_txt), - de_pena = dmy(str_match(pena_txt, re_pena_de)[, 2]), - ate_pena = dmy(str_match(pena_txt, re_pena_ate)[, 2]), - duracao_pena = as.numeric(ate_pena - de_pena) - ) %>% - mutate( - perda_bens = perda_de_bens_ou_valores_acrescidos_ilicitamente_ao_patrimonio, - teve_perda_bens = if_else(str_detect(perda_bens, 'SIM'), 'sim', perda_bens), - vl_perda_bens = if_else( - str_detect(perda_bens, 'SIM'), - readr::parse_number(perda_bens, locale = loc), - NA_real_ - ) - ) %>% - mutate(teve_perda_cargo = tolower(perda_de_emprego_cargo_funcao_publica)) %>% - rename( + ), + teve_pena = base::is.character(label_pena_privativa) & stringr::str_detect(label_pena_privativa, "SIM"), + de_pena = stringr::str_match(label_pena_privativa, re_pena_de)[, 2] |> lubridate::dmy(), + ate_pena = stringr::str_match(label_pena_privativa, re_pena_ate)[, 2] |> lubridate::dmy(), + durancao_pena = base::as.numeric(ate_pena - de_pena), + teve_perda_bens = base::is.character(perda_de_bens_ou_valores_acrescidos_ilicitamente_ao_patrimonio) & stringr::str_detect(perda_de_bens_ou_valores_acrescidos_ilicitamente_ao_patrimonio, "SIM"), + vl_perda_bens = base::ifelse( + teve_perda_bens, + readr::parse_number(perda_de_bens_ou_valores_acrescidos_ilicitamente_ao_patrimonio, locale = loc), + NA + ), + teve_perda_cargo = base::is.character(perda_de_emprego_cargo_funcao_publica) & stringr::str_detect(perda_de_emprego_cargo_funcao_publica, "SIM"), proibicao1 = proibicao_de_contratar_com_o_poder_publico_ou_receber_incentivos_fiscais_ou_crediticios_direta_ou_indiretamente_ainda_que_por_intermedio_de_pessoa_juridica_da_qual_seja_socio_majoritario, proibicao2 = proibicao_de_contratar_com_o_poder_publico_direta_ou_indiretamente_ainda_que_por_intermedio_de_pessoa_juridica_da_qual_seja_socio_majoritario, proibicao3 = proibicao_de_receber_incentivos_crediticios_direta_ou_indiretamente_ainda_que_por_intermedio_de_pessoa_juridica_da_qual_seja_socio_majoritario, - proibicao4 = proibicao_de_receber_incentivos_fiscais_direta_ou_indiretamente_ainda_que_por_intermedio_de_pessoa_juridica_da_qual_seja_socio_majoritario - ) %>% - mutate( - proibicao_txt = str_c(proibicao1, proibicao2, proibicao3, proibicao4, sep = " | "), - teve_proibicao = if_else(str_detect(proibicao_txt, 'SIM'), 'sim', - proibicao_txt), - duracao_proibicao_regex = calcula_pena(proibicao_txt), - de_proibicao = dmy(str_match(proibicao_txt, re_pena_de)[, 2]), - ate_proibicao = dmy(str_match(proibicao_txt, re_pena_ate)[, 2]), - duracao_proibicao = as.numeric(ate_proibicao - de_proibicao) - ) %>% - mutate( - ressarcimento = ressarcimento_integral_do_dano, - teve_ressarcimento = if_else(str_detect(ressarcimento, 'SIM'), 'sim', - ressarcimento), - vl_ressarcimento = if_else( - str_detect(ressarcimento, 'SIM'), - readr::parse_number(ressarcimento, locale = loc), + proibicao4 = proibicao_de_receber_incentivos_fiscais_direta_ou_indiretamente_ainda_que_por_intermedio_de_pessoa_juridica_da_qual_seja_socio_majoritario, + proibicao_txt = stringr::str_c(proibicao1, proibicao2, proibicao3, proibicao4, sep = " | "), + teve_proibicao = base::is.character(proibicao_txt) & stringr::str_detect(proibicao_txt, "SIM"), + de_proibicao = lubridate::dmy(stringr::str_match(proibicao_txt, re_pena_de)[, 2]), + ate_proibicao = lubridate::dmy(stringr::str_match(proibicao_txt, re_pena_ate)[, 2]), + duracao_proibicao = base::as.numeric(ate_proibicao - de_proibicao), + teve_ressarcimento = base::is.character(ressarcimento_integral_do_dano) & stringr::str_detect(ressarcimento_integral_do_dano, "SIM"), + vl_ressarcimento = base::ifelse( + teve_ressarcimento, + readr::parse_number(ressarcimento_integral_do_dano, locale = loc), NA_real_ - ) - ) %>% - mutate( - suspensao_txt = suspensao_dos_direitos_politicos, - teve_suspensao = if_else(str_detect(suspensao_txt, 'SIM'), 'sim', - suspensao_txt), - duracao_suspensao_regex = calcula_pena(suspensao_txt), - de_suspensao = dmy(str_match(suspensao_txt, re_pena_de)[, 2]), - ate_suspensao = dmy(str_match(suspensao_txt, re_pena_ate)[, 2]), - duracao_suspensao = as.numeric(ate_suspensao - de_suspensao), - comunicacao_tse = if_else( - str_detect(suspensao_txt, 'Comunica.+SIM'), - 'sim', - NA_character_ - ) - ) %>% - # separate(cod_assunto, - # paste('assunto_cod', 1:5, sep = '_'), - # sep = '\n', - # fill = 'right') %>% - # separate(nm_assunto, - # paste('assunto_nm', 1:5, sep = '_'), - # sep = '\n', - # fill = 'right') %>% - inner_join(aux_pags, 'id_condenacao') %>% - select( - arq_pag, - id_pag, - arq, - id_condenacao, - id_processo, - id_pessoa, - # infos condenacao - tipo_pena, - dt_pena, - starts_with('assunto'), - # teve tal coisa? - starts_with('teve_'), - # qual o valor? - starts_with('vl_'), - # duracao, de, at\032 - starts_with('duracao_'), - starts_with('de_'), - starts_with('ate_') - ) - cnc_condenacoes_tidy + ), + teve_suspensao = base::is.character(suspensao_dos_direitos_politicos) & stringr::str_detect(suspensao_dos_direitos_politicos, "SIM"), + de_suspensao = stringr::str_match(suspensao_dos_direitos_politicos, re_pena_de)[, 2] |> lubridate::dmy(), + ate_suspensao = stringr::str_match(suspensao_dos_direitos_politicos, re_pena_ate)[, 2] |> lubridate::dmy(), + duracao_suspensao = base::as.numeric(ate_suspensao - de_suspensao), + comunicacao_tse = stringr::str_detect(suspensao_dos_direitos_politicos, "Comunica.+SIM"), + situacao = situacao, + tipo_pena = tipo_pena, + visualizacao_pena = visualizacao_pena, + assunto_cod_1 = assunto_cod_1, + assunto_nm_1 = assunto_nm_1, + assunto_cod_2 = assunto_cod_2, + assunto_nm_2 = assunto_nm_2, + assunto_cod_3 = assunto_cod_3, + assunto_nm_3 = assunto_nm_3, + assunto_cod_4 = assunto_cod_4, + assunto_nm_4 = assunto_nm_4, + assunto_cod_5 = assunto_cod_5, + assunto_nm_5 = assunto_nm_5, + link = link, + ) |> + dplyr::select(!c(proibicao_txt)) } #' Tidyfica base que vem de parse_cnc_pessoas_infos @@ -295,15 +249,20 @@ tidy_pessoas <- function(cnc_pessoa_infos) { cnc_pessoa_tidy <- cnc_pessoa_infos %>% spread(key, value) %>% rename(id_pessoa = id) %>% - mutate(across(.fns = ~na_if(.x, '')), - across(.fns = ~na_if(.x, 'NA'))) %>% + mutate( + across(.fns = ~ na_if(.x, "")), + across(.fns = ~ na_if(.x, "NA")) + ) %>% # mutate_all(funs(suppressWarnings(na_if(., '', 'NA')))) %>% - select(arq_pessoa_infos, id_pessoa, tipo_pessoa, nm_pessoa, - sexo, publico, esfera, orgao, cargo, uf, cod) %>% - mutate(sexo = if_else(!sexo %in% c('F', 'M'), NA_character_, sexo)) %>% - mutate(publico = if_else(!publico %in% c('S', 'N'), NA_character_, publico)) %>% - mutate(esfera = if_else(!esfera %in% c('F', 'D', 'E', 'M'), - NA_character_, esfera)) %>% + select( + arq_pessoa_infos, id_pessoa, tipo_pessoa, nm_pessoa, + sexo, publico, esfera, orgao, cargo, uf, cod + ) %>% + mutate(sexo = if_else(!sexo %in% c("F", "M"), NA_character_, sexo)) %>% + mutate(publico = if_else(!publico %in% c("S", "N"), NA_character_, publico)) %>% + mutate(esfera = if_else(!esfera %in% c("F", "D", "E", "M"), + NA_character_, esfera + )) %>% mutate(uf = if_else(!uf %in% unique(cadmun$uf), NA_character_, uf)) cnc_pessoa_tidy } @@ -326,8 +285,8 @@ tidy_cnc <- function(cnc_condenacoes, cnc_pags, cnc_processos, cnc_pessoa_infos) cnc2 <- tidy_pessoas(cnc_pessoa_infos) cnc3 <- tidy_processos(cnc_processos) tidy_cnc <- cnc1 %>% - inner_join(cnc2, 'id_pessoa') %>% - inner_join(cnc3, 'id_processo') + inner_join(cnc2, "id_pessoa") %>% + inner_join(cnc3, "id_processo") cadmun <- abjData::cadmun pnud_uf <- abjData::pnud_uf @@ -336,41 +295,43 @@ tidy_cnc <- function(cnc_condenacoes, cnc_pags, cnc_processos, cnc_pessoa_infos) pnud_uf %<>% filter(ano == 2010) %>% select(uf, ufn, popt) %>% mutate(uf = as.character(uf)) %>% - inner_join(cadmun, c('uf' = 'cod')) %>% + inner_join(cadmun, c("uf" = "cod")) %>% select(id = uf.y, ufn, popt) - regex_uf_estadual <- '\u00e7a d[eo] (Estado d[oae] )?(.+)$' + regex_uf_estadual <- "\u00e7a d[eo] (Estado d[oae] )?(.+)$" regex_uf_federal <- pnud_uf %>% with(ufn) %>% { - sprintf('(%s)|(%s)', ., abjutils::rm_accent(.)) + sprintf("(%s)|(%s)", ., abjutils::rm_accent(.)) } %>% - paste(collapse = '|') %>% + paste(collapse = "|") %>% regex(ignore_case = TRUE) ufs_estadual <- tidy_cnc %>% - filter(esfera_processo == 'Estadual') %>% + filter(esfera_processo == "Estadual") %>% mutate( ufn_processo = str_match(tribunal, regex_uf_estadual)[, 3], - ufn_processo = str_replace_all(ufn_processo, ' e dos T.+', '') + ufn_processo = str_replace_all(ufn_processo, " e dos T.+", "") ) %>% - inner_join(pnud_uf, c('ufn_processo' = 'ufn')) %>% + inner_join(pnud_uf, c("ufn_processo" = "ufn")) %>% select(id_condenacao, uf_processo = id) ufs_federal_1inst <- tidy_cnc %>% - filter(esfera_processo == 'Federal', instancia == '1 grau') %>% + filter(esfera_processo == "Federal", instancia == "1 grau") %>% mutate(ufn_processo = str_match_all(comarca_secao, regex_uf_federal) %>% - purrr::map_chr( ~ { - x <- as.character(.x[, -1]) - x[x != ''][1] - })) %>% + purrr::map_chr(~ { + x <- as.character(.x[, -1]) + x[x != ""][1] + })) %>% mutate(ufn_processo = toupper(abjutils::rm_accent(ufn_processo))) %>% - inner_join(mutate(pnud_uf, ufn_processo = toupper(abjutils::rm_accent(ufn))), - 'ufn_processo') %>% + inner_join( + mutate(pnud_uf, ufn_processo = toupper(abjutils::rm_accent(ufn))), + "ufn_processo" + ) %>% select(id_condenacao, uf_processo = id) tidy_cnc <- tidy_cnc %>% - left_join(bind_rows(ufs_estadual, ufs_federal_1inst), 'id_condenacao') %>% + left_join(bind_rows(ufs_estadual, ufs_federal_1inst), "id_condenacao") %>% ungroup() control_table <- tpur::control_table @@ -384,7 +345,7 @@ tidy_cnc <- function(cnc_condenacoes, cnc_pags, cnc_processos, cnc_pessoa_infos) filter(str_detect(n1, regex("penal", ignore_case = T))) %>% select(dplyr::contains("n")) %>% gather(nivel, assunto) %>% - filter(assunto != '') %>% + filter(assunto != "") %>% distinct(assunto, .keep_all = T) %>% with(assunto) %>% abjutils::rm_accent() %>% diff --git a/data-raw/da_condenacao.rds b/data-raw/da_condenacao.rds new file mode 100644 index 0000000..f11a24b Binary files /dev/null and b/data-raw/da_condenacao.rds differ diff --git a/data-raw/da_pag.rds b/data-raw/da_pag.rds index 805288b..827fb2d 100644 Binary files a/data-raw/da_pag.rds and b/data-raw/da_pag.rds differ diff --git a/data-raw/da_pessoa.rds b/data-raw/da_pessoa.rds deleted file mode 100644 index f3e244c..0000000 Binary files a/data-raw/da_pessoa.rds and /dev/null differ diff --git a/data-raw/da_pessoa_infos.rds b/data-raw/da_pessoa_infos.rds index 92cce2a..7ab2f53 100644 Binary files a/data-raw/da_pessoa_infos.rds and b/data-raw/da_pessoa_infos.rds differ diff --git a/data-raw/da_processo.rds b/data-raw/da_processo.rds index af553bf..d8880fe 100644 Binary files a/data-raw/da_processo.rds and b/data-raw/da_processo.rds differ diff --git a/data-raw/download-parse.R b/data-raw/download-parse.R deleted file mode 100644 index 3caf8ae..0000000 --- a/data-raw/download-parse.R +++ /dev/null @@ -1,109 +0,0 @@ -library(magrittr) -devtools::load_all() - -pvec <- function (.x, .f, ...) { - future::plan("multisession") - on.exit(future::plan("default")) - p <- progressr::progressor(steps = length(.x)) - ..f <- function(x, ...) { - p() - (purrr::safely(.f))(x, ...) - } - furrr::future_map(.x, ..f, ...) -} - -# pags ------------------------------------------------------------------------ -# download -pags <- seq_len(cnc_npag()) -progressr::with_progress({ - result <- pvec(pags, cnc_download_pag, "data-raw/cnc_pag") -}) - -# parse -arqs <- fs::dir_ls("data-raw/cnc_pag") -progressr::with_progress({ - parsed <- pvec(arqs, cnc_parse_pag) -}) - -# export -da_pag <- purrr::map_dfr(parsed, "result", .id = "arq_pag") -readr::write_rds(da_pag, "data-raw/da_pag.rds", compress = "xz") - -# pessoa ---------------------------------------------------------------------- - -# import -da_pags <- readr::read_rds("data-raw/da_pag.rds") -future::plan(future::sequential) - -links <- da_pags %>% - dplyr::filter(name == "nm_pessoa") %>% - dplyr::pull(link) %>% - unique() - -# download -progressr::with_progress({ - result <- pvec(links, cnc_download_pessoa, "data-raw/cnc_pessoa") -}) - -# parse -arqs <- fs::dir_ls("data-raw/cnc_pessoa") -progressr::with_progress({ - parsed <- pvec(arqs, cnc_parse_pessoa) -}) - -# export -da_pessoa <- purrr::map_dfr(parsed, "result", .id = "arq_pessoa") -readr::write_rds(da_pessoa, "data-raw/da_pessoa.rds", compress = "xz") - - -# processo -------------------------------------------------------------------- - -# import -da_pags <- readr::read_rds("data-raw/da_pag.rds") - -links <- da_pags %>% - dplyr::filter(key == "num_processo") %>% - dplyr::pull(link) %>% - unique() - -# download -progressr::with_progress({ - result <- pvec(links, cnc_download_processo, "data-raw/cnc_processo") -}) - -# parse -arqs <- fs::dir_ls("data-raw/cnc_processo") -progressr::with_progress({ - parsed <- pvec(arqs, cnc_parse_processo) -}) - -# export -da_processo <- purrr::map_dfr(parsed, "result", .id = "arq_processo") -readr::write_rds(da_processo, "data-raw/da_processo.rds", compress = "xz") - -# pessoa info ----------------------------------------------------------------- - -# import -da_pags <- readr::read_rds("data-raw/da_pag.rds") -links <- da_pags %>% - dplyr::filter(key == "nm_pessoa") %>% - dplyr::pull(link) %>% - unique() - -# download -future::plan(future::multisession, workers = 8) -progressr::with_progress({ - result <- pvec(links, cnc_download_pessoa_infos, "data-raw/cnc_pessoa_infos") -}) - -# parse -arqs <- fs::dir_ls("data-raw/cnc_pessoa_infos") -progressr::with_progress({ - parsed <- pvec(arqs, cnc_parse_pessoa_infos) -}) - -# export -da_pessoa_infos <- purrr::map_dfr(parsed, "result", .id = "arq_pessoa_infos") -readr::write_rds(da_pessoa_infos, "data-raw/da_pessoa_infos.rds", compress = "xz") - - diff --git a/data-raw/tidy.R b/data-raw/tidy.R deleted file mode 100644 index 54cf052..0000000 --- a/data-raw/tidy.R +++ /dev/null @@ -1,11 +0,0 @@ -library(magrittr) -devtools::load_all() - -da_pag <- readr::read_rds("data-raw/da_pag.rds") -da_pessoa <- readr::read_rds("data-raw/da_pessoa.rds") -da_pessoa_infos <- readr::read_rds("data-raw/da_pessoa_infos.rds") -da_processo <- readr::read_rds("data-raw/da_processo.rds") - -tidy_cnc <- tidy_cnc(da_pessoa, da_pag, da_processo, da_pessoa_infos) - -usethis::use_data(tidy_cnc, overwrite = TRUE) diff --git a/data-raw/tidy_cnc.rds b/data-raw/tidy_cnc.rds new file mode 100644 index 0000000..7fe2514 Binary files /dev/null and b/data-raw/tidy_cnc.rds differ diff --git a/data/tidy_cnc.rda b/data/tidy_cnc.rda index 13758e0..9fef48d 100755 Binary files a/data/tidy_cnc.rda and b/data/tidy_cnc.rda differ diff --git a/scripts/build_dataset.R b/scripts/build_dataset.R new file mode 100644 index 0000000..d0d4492 --- /dev/null +++ b/scripts/build_dataset.R @@ -0,0 +1,156 @@ +# NOTE: Precisamos remover o pacote cnc porque o furrr não usa a função local +utils::remove.packages("cnc") + +devtools::load_all() + +tmp_dir <- fs::path_join(c(base::getwd(), "tmp")) + +# Diretorios para salvar os HTML de cada pagina +consulta_dir <- fs::path_join(c(tmp_dir, "consulta")) +condenacao_dir <- fs::path_join(c(tmp_dir, "condenacao")) +processo_dir <- fs::path_join(c(tmp_dir, "processo")) +pessoa_info_dir <- fs::path_join(c(tmp_dir, "pessoa_info")) + +if (!fs::dir_exists(tmp_dir)) { + fs::dir_create(tmp_dir) +} + +if (!fs::dir_exists(consulta_dir)) { + fs::dir_create(consulta_dir) +} + +if (!fs::dir_exists(condenacao_dir)) { + fs::dir_create(condenacao_dir) +} + +if (!fs::dir_exists(processo_dir)) { + fs::dir_create(processo_dir) +} + +if (!fs::dir_exists(pessoa_info_dir)) { + fs::dir_create(pessoa_info_dir) +} + +total_pages <- cnc_npag() + +future::plan(future::multisession, workers = 6) + +page_range <- base::seq(from = 1, to = total_pages) + +page_range |> furrr::future_walk(\(page_number) { + cnc_download_pag(page_number, consulta_dir) +}) + +# tibble com lista de todas as pessoas com nome numero processo +# condenacao_id e processo_id +pessoas_consulta_df <- page_range |> purrr::map_df(\(page_number) { + fs::path_join(c(consulta_dir, base::paste0(page_number, ".html"))) |> + readr::read_file() |> + cnc_parse_pag() +}) + + +# Vamos pega os ids de cada condenacao +condenacao_ids <- pessoas_consulta_df |> + dplyr::select(condenacao_id) |> + dplyr::distinct() |> + purrr::pluck(1) + +condenacao_ids |> base::length() + +# Baixa cada condenacao e salva em condenacao_dir +condenacao_ids |> + furrr::future_walk(\(id_condenacao) cnc_download_condenacao(id_condenacao, condenacao_dir)) + +# Vamos pegar os ids do processo +processo_ids <- pessoas_consulta_df |> + dplyr::select(processo_id) |> + dplyr::distinct() |> + purrr::pluck(1) + +processo_ids |> base::length() + +# Baixa cada processo e salva em processo_dir +processo_ids |> + furrr::future_walk(\(id_processo) cnc_download_processo(id_processo, processo_dir)) + +tidy_condenacoes_df <- condenacao_ids |> + purrr::map(\(id) { + df <- fs::path_join(c(condenacao_dir, base::paste0(id, ".html"))) |> + readr::read_file() |> + cnc_parse_condenacao() + + base::list( + condenacao_id = id, + df = df + ) + }) |> + tidy_condenacoes() + +tidy_condenacoes_df |> readr::write_rds(file = "tmp/tidy_condenacoes.rds") + + +tidy_processos_df <- processo_ids |> + purrr::map(\(id) { + df <- fs::path_join(c(processo_dir, base::paste0(id, ".html"))) |> + readr::read_file() |> + cnc_parse_processo() + + base::list(processo_id = id, df = df) + }) |> + tidy_processos() + +tidy_processos_df |> readr::write_rds(file = "tmp/tidy_processos.rds") + +users_info <- tidy_condenacoes_df |> + dplyr::select(c(condenacao_id, link)) |> + dplyr::mutate( + id_user_info = link |> + purrr::map_chr(\(str) + str |> + stringr::str_match("'([0-9]+)'") |> + base::as.vector() |> + utils::tail(n = 1)) + ) + +# Vamos baixar as informacoes de cada pessoa +users_info |> + purrr::pluck("id_user_info") |> + base::unique() |> + furrr::future_walk(\(id) { + cnc_download_pessoa_infos(id, pessoa_info_dir) + }) + + +pessoas_info_san <- users_info |> + purrr::pluck("id_user_info") |> + base::unique() |> + purrr::map_df(\(id) { + fs::path_join(c(pessoa_info_dir, base::paste0(id, ".html"))) |> + readr::read_file() |> + cnc_parse_pessoa_infos() |> + tidyr::pivot_wider(names_from = key, values_from = value) + }) |> + dplyr::rename(id_user_info = id) + + +tidy_pessoas_info_df <- users_info |> + dplyr::left_join(pessoas_info_san, by = "id_user_info") |> + dplyr::select(!c(link, nm_pessoa)) + +tidy_condenacoes_df <- tidy_condenacoes_df |> dplyr::select(!link) + + +pessoas_consulta_df |> readr::write_rds("data-raw/da_pag.rds", compress = "xz") +tidy_processos_df |> readr::write_rds("data-raw/da_processo.rds", compress = "xz") +tidy_condenacoes_df |> readr::write_rds("data-raw/da_condenacao.rds", compress = "xz") +tidy_pessoas_info_df |> readr::write_rds("data-raw/da_pessoa_infos.rds", compress = "xz") + +tidy_cnc <- pessoas_consulta_df |> + dplyr::left_join(tidy_processos_df, by = "processo_id") |> + dplyr::left_join(tidy_condenacoes_df, by = "condenacao_id") |> + dplyr::left_join(tidy_pessoas_info_df, by = "condenacao_id") + +tidy_cnc |> readr::write_rds(file = "data-raw/tidy_cnc.rds", compress = "xz") + +usethis::use_data(tidy_cnc, overwrite = TRUE)