Pesquisar palavras no Diário Oficial da União

Publicado por Ademir Ferreira Furtado (última atualização em 10/01/2014)

[ Hits: 8.729 ]

Homepage: diariooficialhoje.com.br

Download in_lwpsearch.pl

Download in_lwpsearch3.pl (versão 2)




Como o script que compartilhei para as pessoas que precisam baixar o Diário Oficial da União normalmente é utilizado para permitir posterior pesquisa de palavras no PDF, esta alteração faz a pesquisa no DOU escolhido procurando as palavras que estão listadas em um arquivo específico.

Deixa de salvar o PDF e cria um arquivo texto com o resultado da pesquisa.
É necessário criar o arquivo com a lista de palavras a serem pesquisadas e salvá-lo no mesmo diretório do script com o nome de "palavras.lst".

Após executar o script, abra o arquivo com o resultado da pesquisa.

Ex.: para executar o script e consultar a seção 2 do DOU, digite na linha de comando:

$ perl in_lwpsearch.pl 2

O resultado da pesquisa estará em um arquivo com o nome "grep_out_yyyy-mm-dd.txt",  onde yyyy-mm-dd indica a data da execução da pesquisa.

  



Versões atualizadas deste script

Versão 2 - Enviado por Ademir Ferreira Furtado em 08/01/2014

Changelog: Com a modificação das URL do site da imprensa nacional em meados de dezembro, houve a necessidade de mudar as seguintes linhas:

Linha:
$doc = get("http://www.in.gov.br/visualiza/index.jsp?jornal=$jornal&pagina=1&data=$dmy");

Substituída por:
$doc = get("http://pesquisa.in.gov.br/imprensa/jsp/visualiza/index.jsp?jornal=$jornal&pagina=1&data=$dmy");

Linha:
getstore("http://www.in.gov.br/servlet/INPDFViewer?jornal=$jornal&pagina=$i&data=$dmy&captchafield=firistAccess", $arq ) && print "$arq (ok)\n" ;

Substituída por:
getstore("http://pesquisa.in.gov.br/imprensa/servlet/INPDFViewer?jornal=$jornal&pagina=$i&data=$dmy&captchafield=firistAccess", $arq ) && print "$arq (ok)\n";

Download in_lwpsearch3.pl


Esconder código-fonte

$|=1;                  # variável que indica  para fazer "flush" após cada operação de escrita

my $jornal= shift;            # recebe o numero do jornal desejado  passado como parâmetro ( 1, 2, 3, 20 ou 1010)
print "Jornal: $jornal\n";

my $arq_palavras= 'palavras.lst';   #nome do arquivo contendo a lista de palavras a serem pesquisadas no texto do pdf  (uma palavra ou expressão por linha)
                        # cada linha com palavra ou expressão será pesquisada em cada linha do pdf;
                        # se no texto do pdf a ser pesquisado a expressão estiver parte em uma linha e parte em outra , 
                        # não será encontrada.

use DateTime;
my $dt=DateTime->now->subtract(hours=>3);      # recupera a data do sistema e subtrai o fuso horário
$ymd=$dt->ymd;             # string da data no formato yyyy-mm-dd
$dmy=$dt->dmy("/");          # string da data no formato dd/mm/yyyy 
$year=$dt->year;               
$mon=substr("0".$dt->month,-2);   
$day=substr("0".$dt->day,-2);

print "Data: $dmy\n";

use LWP::Simple;             # módulo para fazer as requisições http de forma simples
use LWP::Simple::Cookies ( autosave => 1,
                      file => "lwp_cookies.dat" ); # módulo que trata automaticamente do armazenamento e envio de cookies feitos com as requisições de LWP::Simple

$doc = get("http://www.in.gov.br/visualiza/index.jsp?jornal=$jornal&pagina=1&data=$dmy");     #requisição inicial da página do caderno
if ( $doc=~/&totalArquivos=(\d*)"/ ){                     # verifica quantas páginas o caderno tem
   $paginas=$1;
   print "Paginas: $paginas\n";
   foreach $i ( 1..$paginas) {                        # loop para fazer a requisição de todas as páginas
      my $arq="IN-Jornal $jornal - $ymd - pag_$i.pdf";      # nome local do arquivo pdf a ser recuperado
      getstore("http://www.in.gov.br/servlet/INPDFViewer?jornal=$jornal&pagina=$i&data=$dmy&captchafield=firistAccess",
            $arq ) && print "$arq (ok)\n" ;            # faz a requisição e armazena 
      # a linha abaixo extrai o texto do pdf e faz a pesquisa no texto das palavras contidas no arquivo indicado pela variável $arq_palavras
      # incluindo no resultado cinco linhas acima e cinco linhas abaixo da linha com a palavra  e indicando o nome do arquivo e pagina  onde a palavra foi encontrada
      # o resultado  é redirecionado para um arquivo txt cujo nome indica a data da pesquisa. Ex: grep_out_2013_03_10.txt
      system("pdftotext -q '$arq' - |grep -A5 -B5 -i -f $arq_palavras -H --label='$arq  ------> '>> ./grep_out_$year-$mon-$day.txt");
      unlink $arq;
   }
}else { print "IN-Jornal $jornal não disponível!\n" }         #avisa se  o caderno  não está disponível 

Scripts recomendados

Postando mensagem no Facebook com Perl

Avisar por e-mail se o IP da conexão ADSL mudar

Google Tradutor

Script para X-chat

Obtendo a temperatura com Perl


  

Comentários
[1] Comentário enviado por ademirff63 em 02/04/2013 - 10:45h

Automatizei e coloquei tudo em um site, facilitando pra quem quiser fazer download diariamente (não armazeno os antigos):

http://dou.ademirff63.com.br

[2] Comentário enviado por cravo.felipe em 25/04/2013 - 11:29h

como faço para instalar os modulos do perl?

[3] Comentário enviado por talencargomes em 08/01/2014 - 18:39h

Não está funcionando, só acusa erro que o IN 2 não foi encontrado

[4] Comentário enviado por ademirff63 em 08/01/2014 - 22:44h

As seguintes linhas devem ser modificadas (apenas as URL do site da imprensa nacional que foram alteradas em meados de dezembro), enquanto a versão atualizada não estiver disponível para download:

linha:
$doc = get("http://www.in.gov.br/visualiza/index.jsp?jornal=$jornal&pagina=1&data=$dmy");
substituida por:
$doc = get("http://pesquisa.in.gov.br/imprensa/jsp/visualiza/index.jsp?jornal=$jornal&pagina=1&data=$dmy");

linha:
getstore("http://www.in.gov.br/servlet/INPDFViewer?jornal=$jornal&pagina=$i&data=$dmy&captchafield=firistAccess", $arq ) && print "$arq (ok)\n" ;

substituida por:
getstore("http://pesquisa.in.gov.br/imprensa/servlet/INPDFViewer?jornal=$jornal&pagina=$i&data=$dmy&captchafield=firistAccess", $arq ) && print "$arq (ok)\n";

[5] Comentário enviado por reaje em 20/01/2014 - 10:47h

Bom dia, parabéns pelo script.

Tentei rodar e está dando o erro abaixo:

IN-Jornal 3 - 2014-01-20 - pag_198.pdf (ok)
'pdftotext' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.

poderia me ajudar?

[6] Comentário enviado por ademirff63 em 20/01/2014 - 16:25h

O script, apesar de ter sido escrito no linux, e ser compartilhado em um site que reverencia o Linux, que vem com estes programas instalados em praticamente todas as distribuições, também funciona em outros Sistemas Operacionais.
Neste outro S.O. que você usa, é necessária a instalação do programa pdftotext, disponível no link:
ftp://ftp.foolabs.com/pub/xpdf/xpdfbin-win-3.03.zip
Basta fazer o download, descompactar e colocar no mesmo diretório do script ou em algum diretório do path. Tem as duas versões, 32 e 64 bits, conforme a versão do seu S.O..
O mesmo deve ser feito para o programa grep, disponível no link:
http://sourceforge.net/projects/unxutils/files/unxutils/current/UnxUtils.zip/download
Nos dois casos é necessário extrair do arquivo zip apenas o executável citado: pdftotext.exe e grep.exe.

[7] Comentário enviado por ademirff63 em 20/01/2014 - 18:27h

Os módulos podem ser instalados facilmente digitando no prompt:

$ cpan nome::do::modulo

Caso surja alguma dúvida na instalação dos módulos, consulte esta página: http://www.cpan.org/modules/INSTALL.html

[8] Comentário enviado por reaje em 21/01/2014 - 13:46h

ok! o erro que falei sumiu mas
está exibindo o seguinte:
--------------------------------------------------------------------------------
IN-Jornal 3 - 2014-01-21 - pag_207.pdf (ok)
pdftotext version 3.03
Copyright 1996-2011 Glyph & Cog, LLC
Usage: pdftotext [options] <PDF-file> [<text-file>]
-f <int> : first page to convert
-l <int> : last page to convert
-layout : maintain original physical layout
-fixed <fp> : assume fixed-pitch (or tabular) text
-raw : keep strings in content stream order
-htmlmeta : generate a simple HTML file, including the meta informatio
n
-enc <string> : output text encoding name
-eol <string> : output end-of-line convention (unix, dos, or mac)
-nopgbrk : don't insert page breaks between pages
-opw <string> : owner password (for encrypted files)
-upw <string> : user password (for encrypted files)
-q : don't print any messages or errors
-cfg <string> : configuration file to use in place of .xpdfrc
-v : print copyright and version info
-h : print usage information
-help : print usage information
grep: unrecogniz --helped option `--label='IN-Jornal'
: print usage informationUsage:
grep -? [OPTION]: print usage information...PATTERN [FILE]...
Try `grep --help' for more information.
--------------------------------------------------------------------------------

e o txt não é carregado

[9] Comentário enviado por ademirff63 em 28/01/2014 - 20:30h

No seu Sistema Operacional há alguns problemas com as aspas simples e também há a necessidade de usar caracteres de escape para preservar as aspas duplas, além de não funcionar a opção --label.
Então faça a seguinte alteração, para funcionar:


estas linhas:

system("pdftotext -q '$arq' - |grep -A5 -B5 -i -f $arq_palavras -H --label='$arq ------> '>> ./grep_out_$year-$mon-$day.txt");
unlink $arq;

substituir por:

system("pdftotext \"$arq\"");
my $arqtxt=$arq;
$arqtxt=~s/\.pdf/\.txt/i;
system("grep -A5 -B5 -i -f $arq_palavras -H \"$arqtxt\">> ./grep_out_$year-$mon-$day.txt");
# system("pdftotext -q \"$arq\" - |grep -A5 -B5 -i -f $arq_palavras -H >> ./grep_out_$year-$mon-$day.txt");
unlink $arq;
unlink $arqtxt;

É isso aí. Abraço!

[10] Comentário enviado por chamojo em 26/05/2014 - 11:38h

Bom dia.
Ademir, pode me tirar uma dúvida. Estou tentando passar o suplemento da Anvisa (DOU) para TXT. Só que o arquivo ele formata errado, pois eles usam as vezes 2 colunas e quando salvo o pdf em txt não fica legal. Ja passou por isso? tem alguma sugestão? obrigado Eduardo

[11] Comentário enviado por rmenezes em 18/06/2014 - 15:27h

Pessoal, bom dia!

Estou tentando usar este script, mas ainda não consegui. Baixei e instalei o pdftotext e o grep. Depois ele pediu para instalar os módulos DateTime e LPW::Simple::Cookies, instalei também. E então tentei rodar o script, mas ele está acusando algum erro relacionado ao pdftotext, mas como disse acima, eu instalei este programa.

C:\Perl64\bin>perl in_lwpsearch3.pl 2
Jornal: 2
Data: 18/06/2014
Paginas: 48
IN-Jornal 2 - 2014-06-18 - pag_1.pdf (ok)
'pdftotext' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
IN-Jornal 2 - 2014-06-18 - pag_2.pdf (ok)
'pdftotext' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
IN-Jornal 2 - 2014-06-18 - pag_3.pdf (ok)
'pdftotext' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.
IN-Jornal 2 - 2014-06-18 - pag_4.pdf (ok)
'pdftotext' não é reconhecido como um comando interno
ou externo, um programa operável ou um arquivo em lotes.

E assim vai até a pag_48.pdf

Alguém poderia me ajudar?

[12] Comentário enviado por ademirff63 em 25/06/2014 - 05:50h

O programa pdftotext não deve estar em um diretório listado no path. É só acrescentar o diretório à variável path, ou então colocá-lo no mesmo diretório do script, ou ainda em um diretório listado no path, como o c:\windows.

[13] Comentário enviado por rmenezes em 16/07/2014 - 09:09h

ademirff63, muito obrigado! O script está rodando perfeitamente.

Rodrigo

[14] Comentário enviado por rmenezes em 17/07/2014 - 09:04h

ademirff63, bom dia!

Se não for pedir demais gostaria de uma dica para que, ao invés de retornar 5 linhas acima e 5 cinco linhas abaixo, ele retornasse somente o termo presente na lista de palavras, caso ele esteja presente no diário oficial. Na verdade trabalho em outra área profissional e estou adaptando esta busca que você fez para me informar somente se um número de processo foi citado no DOU. Pois na verdade tenho uma lista de centenas de numeros de processos e se por um acaso houverem 10 processos da minha lista citados num só dia, retornará um arquivo txt com um resultado muito grande. Até tentei modificar o comando grep -A5 -B5 para grep -A1 -B1, mas mesmo assim o retorno de palavras ainda é muito grande, pois é o que o que o script entende como uma linha do pdf.

Ou seja, quero somente que retorne o termo presente na minha lista de palavras.

Abraço,

Rodrigo


[15] Comentário enviado por ademirff63 em 19/07/2014 - 10:28h

Rodrigo

É só omitir estas opções e acrescentar a opção -o, para que apareça apenas a palavra encontrada.

[16] Comentário enviado por rmenezes em 21/07/2014 - 10:08h

O antigo comando era system("grep -A5 -B5 -i -f $arq_palavras -H \"$arqtxt\">> ./dnpmresultados_$day-$mon-$year.txt");

eu troquei o as opções -A5 -B5 por -o, mas não funcionou. Apareceu o seguinte:

IN-Jornal 3 - 2014-07-21 - pag_216.pdf <ok>
grep: invalid option -- o
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

[17] Comentário enviado por rmenezes em 21/07/2014 - 10:10h

Até digitei grep --help, mas não aparece lá sobre a opção -o.

[18] Comentário enviado por ademirff63 em 03/08/2014 - 19:29h

Considerando que o domínio diariooficial.kissr.com apontava para os arquivos disponibilizados no meu dropbox e não está mais disponível, quem quiser fazer download dos diários oficiais da União e do estado de São Paulo, é só seguir no Twitter @dokissr, onde publico os links assim que faço o upload para http://dou.ademirff63.com.br, diariamente.

[19] Comentário enviado por ademirff63 em 03/08/2014 - 19:39h


[17] Comentário enviado por rmenezes em 21/07/2014 - 10:10h:

Até digitei grep --help, mas não aparece lá sobre a opção -o.


Tudo depende da versão do grep que você está usando e qual o sistema operacional.
Dê uma olhada em http://sourceforge.net/projects/unxutils.



[20] Comentário enviado por AmarEl em 22/05/2015 - 11:00h


Olá Ademir!

Tenho feito o download do diário da união no formato que vc disponibiliza na sua pagina e copio como txt para manipula-lo melhor, mas preciso do txt de alguns diários mais antigos e que sua pagina não disponibiliza. Qual código você aplica para gerar um arquivo txt com a sequencia correta igual da sua pagina? Tentei com diversos comandos do pdftotext mas sempre havia uma quebra de padrões...

Agradeço se puder me ajudar, Vlw!

[21] Comentário enviado por ademirff63 em 22/05/2015 - 12:54h

Boa Tarde!

Nao sei bem se entendi a sua pergunta.
Para gerar o txt formatado como no site (html), utilizo o parametro -htmlmeta no comando:
pdftotext -htmlmeta arquivo.pdf
Depois, para retirar os caracteres indesejados ou substituir alguns cabecalhos ou rodapes, utilizo o seguinte comando perl com expressao regular para substituicao de texto:
perl -pi -e "s/indesejado/desejado/g" arquivo.html
Assim substituo tudo que for indesejado pelo desejado no arquivo.html
Agora precisa dar uma olhada no tutorial perl para expressoes regulares e ver o que pode ser feito, que vai muito alem disso.
Depois , tudo pode ser colocado em um arquivo de lote (.bat) e fica muito mais facil.






Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts