1. Introdução

Antes de começar esse texto, você já deve ter completado os exercícios do tutorial Extrator básico de dados judiciais, em que você aprendeu:

  1. Como identificar padrões nos URL;
  2. Como extrair textos usando a função requests.get();
  3. Como gerar um iterador, usando a função for, para extrair os dados de um conjunto de ADIs;
  4. Como gravar esses dados em arquivos independentes.

Além disso, você também deve ter completado o tutorial do Gerador Básico de CSV, no qual você aprendeu algumas funções importantes, entre as quais extrair um conjunto de dados de dentro de uma string, usando a função extrair, que definimos no Gerador Básico.

Neste tutorial, desenvolveremos um algoritmo que engloba as funções do Extrator Básico e possibilita que você busque todos os dados de quaisquer processos, na pesquisa de andamentos processuais.

2. Entendendo os URLs

Quando você insere nessa pesquisa o número de um processo, como da ADI 6000, você é levado a uma página com um url construído com base em um identificador (o incidente), que não temos como conhecer de antemão.

Porém, no Exercício 6 do tutorial do Extrator Básico, você já tinha decifrado esse enigma, com o auxílio da ADO 333, que, por não existir, deixava na barra de endereços o url da consulta e não o localizador da resposta. Além disso, você já tinha encontrado o padrão que  leva às páginas do acompanhamento processual de cada ação, e que seguem o padrão encontrado na ADO 333:

http://portal.stf.jus.br/processos/listarProcessos.asp?classe=ADO&numeroProcesso=333

Você deve ter chegado no endereço:

http://portal.stf.jus.br/processos/listarProcessos.asp?classe=ADI&numeroProcesso=6000

Entre com o endereço acima no seu navegador e veja qual é o url que aparece quando o servidor do STF carrega a página referente a esta ação. Você verá que o url digitado muda para o formato com o incidente e sem o número do processo.

http://portal.stf.jus.br/processos/detalhe.asp?incidente=5536310

Por que isso ocorre? A consulta que você fez de fato permite ao servidor do STF encontrar o processo que você desejava, mas é pelo incidente que o banco de dados do Tribunal identifica esse feito.

Como incidente é um campo que não aparece em lugar algum da página exibida no navegador, você não seria capaz de encontrá-lo quando utilizava apenas as funções básicas do seu browser. Porém, como você já sabe usar algumas funções avançadas, pode abrir o código fonte e buscar dentro dele a informação sobre o incidente.

3. O código fonte do andamento processual (AP)

Você se lembra que o Ctrl-U abre o código fonte e, com um Ctrl-F, pode identificar o incidente na linha 46. Repare que o tipo desse campo está como "hidden", o que faz com que ele não seja visível pela visualização padrão do navegador.

No Gerador Básico de csv, você já aprendeu a navegar pelo código fonte e a extrair os dados relevantes que estão contidos nele. Existem neste código fonte alguns dados que podem ser extraídos, como o Número Único, o tipo de processo (eletrônico ou físico) ou se ele corre em sigilo ou é público.

Nas linhas 83 e ss, você tem inclusive algumas informações vitais, como o relator, o redator do acórdão e o relator do último incidente.

Porém, você já deve ter percebido que a maior parte dos dados relevantes que estavam presentes na tela do seu navegador quando você teclou o Ctrl-U não pode ser encontrada no código fonte. Em especial, é notável a ausência das partes e dos andamentos.

Por que essas informações não estão visíveis? A resposta é: para melhorar a sua experiência na página. Em vez de o STF enviar para você todos os dados do processo, que podem ser bem grandes e causar muita demora para o carregamento da página, o servidor faz um envio escalonado.

  1. Em primeiro lugar, manda o código fonte;
  2. No código fonte, existem alguns comandos que carregam as informações faltantes, mas isso é feito quando já existem informações na página, o que faz com que você tenha pontos que chamam a sua atenção enquanto o carregamento total é realizado pela porta dos fundos.

4. O javascript

Para que essas informações sejam devidamente carregadas, é preciso  que o código fonte contenha não apenas informações (como era o caso da página do controle concentrado), mas ele também precisa ter alguns comandos pequenos e simples, que chamamos de scripts.

Trata-se de pequenas linhas de comando, que determinam a realização de algumas funções, e que são escritas em uma linguagem que se chama javascript. Essa é uma linguagem leve, que serve muito bem a essa função de codificar scripts em páginas de HTML.

Trata-se da mesma linguagem que é utilizada para determinar que os artigos dos jornais pagos sejam encobertos alguns segundos depois de você começar a ler. Mas ocorre que, quando você via uma reportagem que foi encoberta, é porque normalmente o texto jornalístico foi enviado com o código-fonte e depois coberto por um comando em javascript.

Agora que você conhece o Ctrl-U, você poderá abrir o código fonte dessas reportagens e lê-las diretamente. Porém, como você sabe que o HTML pode ser desconfortável para a leitura humana, você poderá copiar esse código fonte em um leitor de HTML, como o Code Beutify HTML Viewer, que te mostra em uma aba a visualização esperada (output) do código fonte que você coloca na janela de (input).

Em alguns casos, os scripts impedem a visualização da página mesmo assim, mas você pode editar o código-fonte a ser exibido, retirando dele tudo o que não parece texto formatado (o que provavelmente vai excluir os scripts, que costumam ficar no fim do documento).

Existem estratégias de extração específicas para lidar com o javascript, e que estão contidas em bibliotecas do Python, como a Selenium e a Scrapy. Essas são ferramentas que serão exploradas no Extrator Avançado, e que permitem executar os scripts e, com isso, acessar as informações cujo carregamento é determinado por eles. Neste momento,  vamos usar uma estratégia mais simples: identificar os urls contidos nos scripts em Javascript, mas sem executar esses códigos.

5. Identificando urls nos scripts

Você deve ter identificado que na linha 106, há um "href=#partes" que parece promissor como o link para a página de partes. O fato de haver uma lista ( entre os marcadores <ul> e </ul>) com vários itens (cada um entre os marcadores <li> e </li>) sugere que, neste ponto, deve haver links para as informações dos andamentos, das partes, das decisões e para os outros itens que têm um href definido nesse trecho de código.

Todavia, quando você clica sobre o #partes, ele leva você para uma página que, apesar de se chamar partes, tampouco tem informações sobre as partes no seu código fonte:

http://portal.stf.jus.br/processos/detalhe.asp?incidente=5536310#partes

De fato, trata-se da mesma página do incidente, apenas com um marcador apontando para a aba das partes. Não temos aí uma resposta, mas temos uma pista: possivelmente, devemos achar mais algo relevante com o nome #partes, e se continuarmos procurando (experimente um Ctrl-F que busque 'partes'), encontramos nas linhas 227 um trecho interessante.

Veja que se trata de um script (entre os marcadores de HTML <script> e </script>) e que a linha 225 sugere que se trata de um javascript. O que nos interessa aqui é que você não precisa saber nada de javascript para entender que, na linha 227, existe um elemento muito semelhante a outros que temos encontrados, ao analisar urls:

'abaPartes.asp?incidente=5536310'

Trata-se de uma combinação de um path (abaPeticoes.asp) com uma query (?incidente=5536310), que pode ser acoplada com o endereço da página da ADI6000 e que conduz aos dados completos sobre as partes. Esse mesmo formato se repete até a linha 243, com diferentes paths e a mesma query, com o incidente da ADI 6000. Essas informações são suficientes para que você consiga acessar todos os dados contidos na página do acompanhamento processual dessa ação.

Você deve ter percebido que basta acrescentar aos elementos acima o início da url da própria página:

http://portal.stf.jus.br/processos/

6. Extraindo o campo incidente

Com esse exercício, você tem as urls das páginas que contém as informações a serem buscadas. Você deve ter notado esses localizadores são construídos com o incidente do processo, o que faz com que você possa usá-los como modelos para extrair outros processos, desde que você tenha identificado previamente o campo incidente.

Para facilitar essa operação, o módulo dsd.py conta com uma função buscar os dados do acompanhamento processual (AP), chamada dsd.solicitar_dados_AP(), que requisita dados do servidor do STF, usando o url padrão das páginas do Andamento Processual.

A estrutura básica da solicitação é a mesma do dsd.solicitar_dados_CC(), mas há uma peculiaridade a ser enfrentada neste ponto: o encoding das páginas do acompanhamento processual é efetivamente o utf-8, e extrair as páginas sem essa definição acaba gerando uma gravação equivocada dos dados.

Se você quiser entender de forma mais detalhada essa questão do encoding e seu impacto nos nossos códigos, leia o texto complementar Definindo o encoding dos dados extraídos.

Você deve ter chegado a um código semelhante a:

import dsd

# Definição dos parâmetros de busca
Classe = "ADI"
NumeroInicial = 6000
NumeroFinal = 6000

#iterador para buscar os processos
for vezes in range (NumeroFinal-NumeroInicial+1):
 
    NumProcesso = str(NumeroFinal-vezes)
           
    # Extração das informações
    html = dsd.solicitar_dados_AP(Classe, NumProcesso)
    
    # extrai campo incidente do html
    incidente = dsd.extrair(html,'id="incidente" value="', '">')
    
    print (Classe+NumProcesso + ', ' + incidente)

Note que optamos por manter o módulo de definição dos parâmetros de busca, com um Número Inicial igual ao Número Final, para podermos buscar os incidentes de um intervalo de processos.

7 Extraindo os dados das abas

7.1 Função solicitar_dados()

Agora que você conseguiu isolar o campo incidente, pode construir com base nele os extratores das informações contidas em cada uma das abas da página de acompanhamento processual (partes, andamentos, etc.), a partir dos urls que você já identificou no Exercício 5, que fazem uso desse identificador.

Para essa finalidade, o módulo dsd.py tem uma função genérica, que extrai dados no encoding UTF-8, desde que você forneça os elementos da url como argumentos.

As outras funções de busca trabalhadas até aqui [solicitar_dados_CC() e solicitar_dados_AP()] são específicas, pois elas se valem dos modelos de endereçamento das páginas de controle concentrado e de andamento processual. Por esse motivo, elas solicitam parâmetros mais simples: apenas a classe e o número do processo.

Já a solicitar_dados() precisa que sejam fornecidos os 3 elementos do url:

  1. em primeiro lugar, temos a parte fixa dos processos do acompanhamento processual, que não varia: 'http://portal.stf.jus.br/processos/';
  2. em segundo lugar, temos o indicador do campo, que varia conforme a aba em que está a informação na página. São os elementos que descobrimos no Exercício 5, tais como 'abaPartes.asp?incidente=';
  3. incidente, que é individual para cada processo.

Essa função gera uma url completa, a partir desses 3 elementos, que são concatenados e buscados na página, com um ecoding utf-8.