Pages

Thursday, April 27, 2006

Baixando todos os arquivos de um tipo de uma URL

O Davidson publicou uma dica muito interessante sobre como baixar todos os arquivos .tgz de um dos mirros do FreeRock GNOME, essa dica você lê aqui.

A minha dica é mais lenta, usa mais comandos, depende de mais softwares, é mais complicada, mas é muito fácil de adaptar para qualquer link. A dica do Davidson também pode ser adaptada a qualquer link, mas deve ser "percebido" qual a expressão deve entrar no comando sed. Se você consegue gerar a expressão para o sed (pode tentar, não deverá ser difícil!), use a dica dele. Do contrário, você terá duas opções: aprende a usar expressões regulares ou procurar outra solução. Foi exatamente nesse ponto que gerei esse post.

Eu gostaria de fazer uma coisa semelhante a ele, gostaria de pegar todos os arquivos .pdf de uma página que não tinha acesso ao servidor X (Eu não tinha lido a dica dele ainda).

A primeira solução a esse problema é uma simples extensão do Firefox: DownThemAll!

Todos os seus problemas se resolvem em dois cliques. A versão atual dessa extensão está muito desenvolvida. Mas existe dois contras: deve usar o Firefox. Eu uso o firefox e a extensão e não tenho nenhum problema com esse item, mas o deve no começo da frase deve fazer muita gente torcer o nariz. E deve ter acesso ao modo gráfico, ou seja, não é possível fazer isso por linha de comando. É nesse ponto que eu torço o nariz, como disse anteriormente, eu estava sem acesso ao terminal X (para ser exato, estava por ssh, eu até poderia usar o firefox, mas digamos que isso é meio lento). Além disso, nada se compara com a leveza e a velocidade da linha de comando.

Bem, como fazer em linha de comando o que o DownThemAll! faz em modo gráfico ?

Você pode usar a dica do Davidson e modifica-lá adequadamente. Como disse, se tiver alguma prática com expressões regulares isso não deve ser problema, mas para quem está começando agora com o linux e/ou não tem tempo para (ou não quer) aprender a usar expressões regulares, essa dica fica um pouco difícil.

O que apresentarei aqui é uma forma diferente de gerar a lista de urls existentes em uma página web, ou seja, vamos gerar um arquivo .txt com todos os links que desejamos baixar e usar com wget para baixar os arquivos.

Uma vez gerada o arquivo de urls lista_de_urls.txt, vamos baixar o arquivo usando:

wget -i lista_de_urls.txt

Não é preciso usar nenhuma outra opção, porque o arquivo lista_de_urls.txt possuí a url inteira de cada arquivo.

Para essa tarefa vamos usar: lynx, cut, grep, além do wget para baixar os arquivos.
Observe que a dica do Davidson usa apenas o sed, além do wget.

Sendo o URL um endereço qualquer.
Usamos o comando:

lynx -dump URL|grep "http://"|cut -b 7-|grep "pdf$" > lista_de_urls.txt

Explicando: -dump faz o lynx converter um arquivo html em formato de texto padrão, nesse processo ele gera uma lista com todos os links existentes na página no final do arquivo, para filtrar apenas esses links redirecionamos a saída do lynx para o comando grep filtrando exatamente o que é http://. Na lista gerada pelo lynx existe alguns caracteres inicias reservados para numeração dos links, na versão do lynx que eu uso, até o 7 caracter de forma reservada a numeração. O comando cut -b 7- está cortando e "exibindo" apenas as urls, ou seja, se desfazendo da numeração.
Por fim, vamos filtar de todos os endereços existentes aqueles que tem o que nós queremos baixar. No meu caso, os arquivos "pdf", daí o grep "pdf$", poderia ser os arquivos tgz ou qualquer outra extensão. O caracter $ serve para dizer que a linha deve terminar com a expressão pdf (ou a desejada), sem essa linha filtra-se todos os arquivos que possuam a expressão pdf no link, como um arquivo html com o nome: arquivos-pdf.html. Por fim geramos um arquivo .txt com todos os links para usar com o wget.

Observe que o comando é longo mas é quase imutável. Modifica-se apenas a URL e a extensão desejada. Dessa forma é muito fácil gerar uma lista para qualquer url.
Deve ter ficado claro o porque da dica do Davidson ser muito mais rápida (eu comparei usando o exemplo que ele forneceu), além de baixar e decodificar a url, ainda temos que "varrer" o arquivo três vezes, no mínimo. No outro caso, temos apenas que baixar o arquivo e "varrer" ele apenas uma vez, ou seja, muito mais rápido. Essa diferença é perceptível até em listas pequenas e pode ser sensível em listas grandes.

Eu esqueci de dizer: como é impressionante que duas pessoas tenha trabalhado no mesmo assunto com tão pouco tempo de diferença, estava para publicar esse tópico quando vi a dica dele, aí eu reescrevi para ficar mais consistente com as informações anteriores existentes.


Technorati Tags:

2 comments:

  1. Anonymous12/4/13 11:31

    Olá, amigo.

    Essa dica é somente para quem usa o firefox pelo linux? Se usar pelo windows, dá de fazer isso?
    Também estou a procura de uma forma de fazer os downloads de pdf disponíveis em uma página de uma vez, sem ficar clicando em um por um.

    Valeu.

    ReplyDelete
    Replies
    1. Olá,
      a parte que diz respeito ao Firefox (a extensão DownThemAll) funciona onde quer que tenha Firefox.

      Porém, adianto que nem todas as páginas fazem a disposição direta de documentos pdf, mas usam 'códigos' em PHP para justamente evitar o download 'completo' de todos os arquivos por métodos automáticos.

      Se não tiver familiaridade com o que eu expliquei, ainda assim, não é difícil compreender a diferença. Se usar a extensão e der errado, é porque ele está usando um código para ocultar a URL direta do PDF. Conclusão: experimentando se descobre.

      Um abraço

      Delete