Para operar essas requisições, nós utilizamos a biblioteca requests, que tem uma função especialmente desenhada para realizar esse pedido: a função requests.get(). A utilização dessa função dentro do seu programa exige a importação da biblioteca requests, que pode ser feita pelo comando:

import requests

As importações de bibliotecas costumam vir em bloco no início dos nossos programas. Uma vez importado o pacote (package), você pode utilizar as suas funções por meio do nome composto NomeDaBiblioteca.NomeDaFunção, que no nosso caso resulta em requests.get().

Note que você também pode importar individualmente a função get, por meio do comando:

from requests import get

Usada essa fórmula, a função get é importada para o seu programa, o que possibilita utilizá-la diretamente pelo nome get(). Em nossos programas, utilizaremos o nome completo requests.get() porque essa abordagem deixa clara a origem dessa função.

O HTTP também define vários tipos de retorno, inclusive os códigos 400 (que indica requisições impossíveis de serem processadas) e 500 (que indica que o servidor não conseguiu processar uma requisição aparentemente válida). Outro protocolo comum é o HTTPS, que de fato é o mesmo HTTP, mas com uma camada a mais de dados, que permite o uso de criptografia (daí o S, de secure).

Quando navegamos pela internet, esse processo de requisições e retornos é intermediado pelos nossos navegadores (browsers), como o Chrome, o Firefox e o Edge. Cada resposta bem sucedida que esses programas recebem é processada por eles, que exibem em nossas telas as imagens devidamente formatadas. Assim, a função dos navegadores é:

  1. solicitar as informações referentes ao conteúdo hospedado em um servidor;
  2. receber as respostas enviadas pelo servidor onde a página está hospedada;
  3. processar essas informações para que elas sejam exibidas de acordo com os parâmetros de formatação contido no HTML.

No nosso processo de extração de dados, não utilizaremos os navegadores para processar as requisições e respostas, mas utilizaremos o próprio Python, que tem bibliotecas capazes de gerir esses pedidos de forma direta, utilizando-se do protocolo HTTP. Com isso, é dispensável o aprendizado específico das minúcias desse protocolo, bastando apenas saber que a função request.get() solicita como resposta o conteúdo hospedado em um URL.

Para começar o seu trajeto hacker, escolha uma ADI e busque o seu endereço por meio de uma pesquisa na página STF/Processos/ADI, ADC, ADO e ADPF. Eu escolhi a adi 6058, mas você pode optar por qualquer ADI.

O que nos interessa é localizar o url que está na barra de endereços do seu navegador (neste caso, o Chrome), no alto da figura acima, e você pode inseri-la no modelo abaixo.

import requests

url = 'Insira o URL do processo que você escolheu'

user_agent = {'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}

html = requests.get(url, headers = user_agent).text

print (html)
Extrator1. Módulo básico de extração

Quando você rodar esse programa, ele deve imprimir no console o Código Fonte da página, além definir esse conteúdo como valor da variável html. Como isso é feito exatamente?

A primeira parte importa a biblioteca requests, que você não precisa instalar porque ela já faz parte dos recursos do Anaconda. Para facilitar a visualização, é comum deixar uma linha em branco depois dessa parte inicial de importação das bibliotecas.

A segunda define uma variável url, atribuindo a ela o valor do URL do processo que você escolheu. Lembre-se que é preciso colocar o endereço entre aspas (tanto faz se simples ou duplas), pois trata-se de uma variável do tipo string.

A terceira parte define o User-agent, que indica os tipos de programa com os quais os dados apresentados devem ser compatíveis. Para que essa requisição funcione em todos os sites, precisamos alterar um dos pontos padrão do requests.get(), que  identifica os pedidos que são feitos com o User-agent : 'python-requests/2.24.0'. Para evitar dificuldades, você pode utilizar o Author Name padrão, que indica que o tipo de resposta que você pretende pode ser compatível com os navegadores padrão do mercado:

user_agent = {'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}

A quarta usa o comando get da biblioteca requests, que por isso deve ser inserido como requests.get. Esse comando envia uma requisição HTTP de tipo GET, o que significa que essa solicitação pede ao servidor o envio do conteúdo contido no url. Ao acrescentar o ".text", você indica que deseja atribuir à variável html o conteúdo do Código Fonte da página. Para incorporar o User-agent na requisição, repare que o comando tem uma argumento header = user_agent.

Por fim, a última linha define a impressão no console do conteúdo da variável html, que contém o texto do código fonte.

Para aprofundar:
Se você esquecer de colocar o ".text", o requests.get(url) retornará apenas a indicação de que houve uma resposta de tipo 200, que indica um retorno com sucesso. Isso ocorre proque, de fato, o comando requests.get(url) não retorna um texto, mas um objeto do tipo models.Response, que envolve todos os elementos do retorno dado pelo servidor, segundo o protocolo HTTP. Já se você trocar o ".text" por ".encoding", você obterá o tipo de codificação que a biblioteca requests identificou como sendo o encode da resposta do STF (no caso, será o encoding iso-8859-1). Se você quiser ver todos esses elementos, cole no Spyder o código abaixo e observe a tabela de valores.
import requests

url = 'Insira o URL do processo que você escolheu'

user_agent = {'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'}

response = requests.get(url, headers = user_agent)
codigo = response.encoding
html = response.text

print (html)
print (codigo)
print (response)
Módulo de extração expandido