você está aqui: Home  → Arquivo de Mensagens Programação Shell Linux: Inscrições Abertas

Baixando o Diário Oficial inteiro de uma vez só

Colaboração: Bruno Buys

Data de Publicação: 09 de Agosto de 2007

Quem precisa trabalhar com o Diário Oficial da União tem que usar um aplicativo em javascript no site da Imprensa Nacional, que, convenhamos, deixa a desejar. Só se vê uma página de cada vez, é lento e não dá para fazer buscas no Diário inteiro.

Eu decidi escrever o shell script abaixo porque salvar página por página no braço não era uma opção, e também porque precisei citar o link direto para o arquivo pdf de uma página.

O script aceita quatro formas de rodar:

baixadiario secao1  # baixa somente a secao 1 do D.O.
baixadiario secao2  # baixa somente a secao 2 do D.O.
baixadiario secao3  # baixa somente a secao 3 do D.O.

e

baixadiario  # sem argumento nenhum ele baixa o D.O. inteiro

Ao fim do processo, o arquivo links.txt guarda os links para cada página do D.O.. Facilita a vida de quem precisa citar páginas, enviar links por email ou coisa parecida.

OBS - O número de página é o último número antes da extensão: "do3-86.pdf" significa "D.O. seção 3, página 86"

OBS 2 - Para quem tiver o pdfjoin instalado (parte do pacote 'pdfjam', no Debian Sarge), os últimos três comandos juntam os pdf's das seções em um único pdf. Quem não fizer questão disso, pode comentar as três linhas, para não ficar vendo mensagem de erro.

#!/bin/bash

# Baixadiario, baixa os DO's do site da Imprensa Nacional. Bruno Buys, dez-2005, out-2006.
# Sob os termos da licensa GNU GPL, v2.0.

ANO=`date +%Y`
MES=`date +%m`
DIA=`date +%d`


# Baixa as paginas com a informacao do numero de pdf's das secoes do DO.

for N in 1 2 3 ; do

       wget "http://www.in.gov.br/imprensa/jsp/jsp/jornaiscompletos/visualizacao/pdf/visualiza_pdf.jsp?jornal=do&secao="$N"&pagina=1&data="$DIA"/"$MES"/"$ANO""

       mv visua* index$N.htm   #Vamos guardar o index, depois, por conveniencia
done

#Isso salva os numeros de paginas que cada secao do DO tem.
SEC1=`cat index1.htm |grep -o totalarquivos="[0-9]*[0-9]"|cut -c15-`
SEC2=`cat index2.htm |grep -o totalarquivos="[0-9]*[0-9]"|cut -c15-`
SEC3=`cat index3.htm |grep -o totalarquivos="[0-9]*[0-9]"|cut -c15-`

funcao_pega_0a9(){

       for ((d=1;d<10;d++)) ; do

       wget http://www.in.gov.br/materias/pdf/do/secao"$1"/"$DIA"_"$MES"_"$ANO"/do"$1"-"$d".pdf

       echo  "http://www.in.gov.br/materias/pdf/do/secao"$1"/"$DIA"_"$MES"_"$ANO"/do"$1"-"$d".pdf" >> links.txt

       mv do"$1"-"$d".pdf `basename do"$1"-"$d".pdf "$d".pdf`00$d.pdf

       done
}

funcao_pega_10a99(){

if [ $2 -le 100 ] ; then

       for ((d=10;d<$2;d++)) ; do

       wget http://www.in.gov.br/materias/pdf/do/secao"$1"/"$DIA"_"$MES"_"$ANO"/do"$1"-"$d".pdf

       echo  "http://www.in.gov.br/materias/pdf/do/secao"$1"/"$DIA"_"$MES"_"$ANO"/do"$1"-"$d".pdf" >> links.txt

       mv do"$1"-"$d".pdf `basename do"$1"-"$d".pdf "$d".pdf`0$d.pdf

       done
fi

if [ $2 -gt 100 ] ; then

       for ((d=10;d<100;d++)) ; do

       wget http://www.in.gov.br/materias/pdf/do/secao"$1"/"$DIA"_"$MES"_"$ANO"/do"$1"-"$d".pdf

       echo "http://www.in.gov.br/materias/pdf/do/secao"$1"/"$DIA"_"$MES"_"$ANO"/do"$1"-"$d".pdf" >> links.txt

       mv do"$1"-"$d".pdf `basename do"$1"-"$d".pdf "$d".pdf`0$d.pdf

       done
fi
}

funcao_pega_restantes(){

       for ((d=100;d<$2;d++)) ; do

       wget http://www.in.gov.br/materias/pdf/do/secao"$1"/"$DIA"_"$MES"_"$ANO"/do"$1"-"$d".pdf

       echo "http://www.in.gov.br/materias/pdf/do/secao"$1"/"$DIA"_"$MES"_"$ANO"/do"$1"-"$d".pdf" >> links.txt

       done

}

funcao_pega_secao_1(){
funcao_pega_0a9 1
funcao_pega_10a99 1 $SEC1
funcao_pega_restantes 1 $SEC1
}

funcao_pega_secao_2(){
funcao_pega_0a9 2
funcao_pega_10a99 2 $SEC2
funcao_pega_restantes 2 $SEC2
}

funcao_pega_secao_3(){
funcao_pega_0a9 3
funcao_pega_10a99 3 $SEC3
funcao_pega_restantes 3 $SEC3
}


case $1 in

secao1)
       funcao_pega_secao_1

;;
secao2)
       funcao_pega_secao_2

;;
secao3)
       funcao_pega_secao_3
;;
*)
       funcao_pega_secao_1
       funcao_pega_secao_2
       funcao_pega_secao_3
;;
esac


#Opcional, pra quem tiver o pdfjoin (parte do pacote 'pdfjam', no Debian) instalado:

pdfjoin `ls do1*.pdf` --outfile secao1.pdf
pdfjoin `ls do2*.pdf` --outfile secao2.pdf
pdfjoin `ls do3*.pdf` --outfile secao3.pdf

exit 0


Veja a relação completa dos artigos de Bruno Buys