terça-feira, 19 de outubro de 2010

Baixando arquivos e sites inteiros com wget

Neste tutorial, vamos aprender alguns truques sobre o wget, um poderoso gerenciador de downloads que já vem instalado em todas as distros GNU/Linux da atualidade.



Eu me lembro de quando dei meus primeiros passos na Internet. Naquele tempo - e ainda hoje - havia una grande e crescente demanda por gerenciadores de download, programas que tinham por objetivo baixar arquivos da Internet de maneira mais eficiente do que os navegadores web. Naquela época, o meio de acesso mais popular à grande rede era a clássica Internet discada. Felizmente, eu consegui pegar o finalzinho do período, com velocidades que chegavam até a 56Kbps (embora o iBest sempre me desse 52 Kbps). Antes disso, porém, ter 28 ou 32 Kbps era considerado artigo de luxo. Trata-se de uma época que ainda não foi embora, pois muitas pessoas menos favorecidas ainda dependem desse meio para se conectar à rede.

A maioria das pessoas usa a Internet para fazer downloads, isto é, transferir um arquivo de um servidor remoto para o seu computador. Com uma conexão discada, transferir arquivos de poucos megabytes é trivial, mas e se a pessoa quiser transferir uma ISO de um CD que tem 600 MB?

Esse problema permanece até hoje, mesmo entre as pessoas que possuem acesso de alta velocidade. Logo, o usuário descobre a principal deficiência dos navegadores neste sentido: a maioria deles não permite que você interrompa um download e o continue depois (claro que, atualmente, temos o Opera, que possui um gerenciador de downloads ou a extensão DowThemAll do Firefox que serve para este fim). Logo, se a pessoa começar a baixar um arquivo grande, ela deverá ir até o fim. Problemas: 1. No caso da conexão discada, a conta telefônica ficará astronômica e 2. Em qualquer conexão, sempre há a possibilidade de a conexão cair e o usuário ser obrigado a começar tudo de novo.

Surgiu, então, a necessidade de criarem-se gerenciadores de download, programas que, além de permitir a interrupção e a retomada de um download, também aceleram sua velocidade, ao baixar várias partes do mesmo arquivo ao mesmo tempo. O primeiro gerenciador a ficar famoso foi o Download Accelerator Plus que, embora tivesse se tornado bem conhecido, abrigava vários spywares que se instalavam sem o consentimento do usuário.

Programas deste tipo existem aos montes para Linux, para Mac e para Windows. Mas se você usa o sistema do pinguim, saiba que não vai precisar baixar nenhum deles, pois o próprio sistema já dispõe de um excelente: o wget, um pequeno utilitário de linha de comando que serve justamente para baixar não só arquivos mas, também, sites inteiros.

Apesar de ser um programa de linha de comando, ele é bem simples de operar e pode ser usado também por usuários iniciantes. Além disso, por não requerer uma interface gráfica, ele pode ser usado diretamente na linha de comando, transformando aquele seu micro antigo em um respeitável servidor de downloads. Mais ainda, como o modo texto consome infinitamente menos memória do que qualquer interface gráfica popular, você pode derrubar o KDE ou o Gnome e deixar o micro fazendo aquele download no modo texto de madrugada: certamente ele será mais rápido! Isso, sem contar, que o wget pode ser utilizado em scripts para automatizar tarefas que exijam downloads na web. Muitas distribuições o utilizam para baixar suas atualizações, como o apt-get, do Debian ou do Ubuntu.

Um exemplo básico


Vamos começar baixando o arquivo teste.txt que encontra-se no servidor fictício www.exemplo.com . Abra o terminal e digite:

$ wget www.exemplo.com/teste.txt


Aperte enter e, após alguns momentos, veja que o arquivo teste.txt foi salvo em sua pasta pessoal, ou seja, a pasta de onde o wget foi executado. Sempre lembrando que você não deve digitar o $, ele faz parte da linha de comandos, ok?

Continuando um download


O exemplo acima permite-nos baixar um arquivo, mas se por qualquer motivo o wget for interrompido - falta de energia elétrica, sistema reiniciado ou desligado ou você ter apertado ctrl +c acidentalmente, você terá que recomeçar o download do princípio. Para resolver isso, adicione o parâmetro -c à linha de comando:

$ wget -c www.exemplo.com/teste.txt


Desta forma, se você abortar a execução do wget por quaisquer motivos, bastará retornar à pasta na qual você estava baixando o arquivo e repetir o comando que o download continuará do mesmo ponto em que parou (sorte que você pode acessar os últimos comandos digitados pressionando seta para cima ou digitando history).

Use a opção -c sempre que for fazer qualquer download que tenha mais do que alguns quilobytes.

Baixando sites inteiros


Mas o wget não seria tão respeitado se não tivesse a capacidade de baixar um site inteiro - ou partes de um site inteiro - em um único comando. Vamos voltar ao nosso site fictício. Digamos que o proprietário tenha feito uma galeria de fotos organizada por pastas. Suponhamos que você queira baixar todas as fotos que estejam em www.exemplo.com/fotos/2010/janeiro/ . Evidentemente, você poderia dar um comando wget para cada arquivo, mas e se forem centenas de fotos? Além de você ter que descobrir o nome de todos os arquivos, deverá dar muitos comandos, o que não vale a pena. Felizmente, o wget possui a opção -r , que o instrui a fazer downloads recursivos, ou seja, baixar todos os arquivos de uma pasta. Assim, combinado com o item anterior, podemos baixar todas as fotos de Janeiro de 2010 neste site através do comando:

$ wget -c -r www.exemplo.com/fotos/2010/janeiro/


Esta simples instrução cumpre o prometido, mas você logo notará dois pequenos inconvenientes, os quais vamos ensinar a corrigir a seguir.

Evitando a criação de pastas


Vamos supor que, para o exemplo anterior, você criou uma pasta chamada fotos em sua pasta pessoal, entrou nesta pasta pelo terminal (comando cd) e deu o comando wget -c -r www.exemplo.com/fotos/2010/janeiro. Aí, quando o wget termina seu serviço, você diz: "Agora, vou abrir a pasta fotos e todas as fotos estarão nesta pasta". No entanto, não é isso que acontece.

Dentro da pasta fotos, existe uma pasta www.exemplo.com; Dentro desta pasta, existe outra pasta chamada fotos; Dentro de fotos, há uma pasta chamada 2010 e, dentro de 2010, há uma pasta chamada janeiro, onde estão as famigeradas fotos. Por que isso aconteceu?

Porque é isso que o wget faz! Ele é uma ferramenta muito útil para a criação de mirrors, ou seja, sites que possuem a mesma estrutura e o mesmo conteúdo de outro. Se você precisar, por exemplo, criar um mirror do repositório de pacotes de uma distrbuição em um servidor local, você pode fazer isso com o wget: ele vai criar todas as pastas igual como elas estão no servidor e o seu espelho já estará pronto para ir para a web! No entanto, considerando-se que você apenas queira baixar os arquivos para uma pasta específica, existem duas formas de fazê-lo:

A primeira é: você apenas quer baixar todas as fotos diretamente para a pasta fotos criada por você. Neste caso, basta utilizar a opção -nd, que ignorará a árvore de diretórios existente. O comando, então, ficará assim:

$ wget -c -r -nd www.exemplo.com/fotos/2010/janeiro/


A segunda é se você desejar preservar a pasta janeiro, ou melhor, se você quiser baixar todas as fotos deste site que estejam em pastas dentro de 2010, preservando as pastas no disco local. Para isso, existem as opções -nH, que não cria a pasta com o nome do host - em nosso caso, ele não criaria a pasta www.exemplo.com - e a opção --cut-dirs=N, onde N é o número de pastas que ele irá "cortar". Assim, por exemplo, considerando-se que você queira baixar todas as fotos de Janeiro:

  • wget -c -r -nH www.exemplo.com/fotos/2010/janeiro/ criará as pastas fotos/2010/janeiro;

  • wget -c -r -nH --cut-dirs=1 www.exemplo.com/fotos/2010/janeiro/ criará as pastas 2010/janeiro;

  • wget -c -r -nH --cut-dirs=2 www.exemplo.com/fotos/2010/janeiro/ criará a pasta janeiro;


Baixando apenas arquivos com determinada extensão


Vamos dizer que, em cada pasta de fotos, haja um arquivo index.html e alguns gifs animados que dão alguns "(d)efeitos especiais" na página e que você queira baixar apenas as fotos, que possuem a extensão .jpg. Para isso, você pode usar a opção -A, que baixará apenas os arquivos com as extensões informadas. É possível especificar mais de uma extensão separando-as por vírgulas. Assim, nosso comando ficaria:

$ wget -c -r -nd -A jpg www.exemplo.com/fotos/2010/janeiro/


Outra forma de fazer isso seria utilizar a opção -R, que evita o download dos arquivos com determinadas extensões, desta forma:

$ wget -c -r -nd -R html,gif www.exemplo.com/fotos/2010/janeiro/


Perceba que as opções -A e -R, além de poderem ser usadas em conjunto, aceitam padrões. Por exemplo, -A praia* apenas baixaria os arquivos que comecem com praia, como praia01.jpg, praia02.jpg...

Outras opções


Sites FTP


A utilização do wget com sites FTP não difere em nada da utilização do mesmo com sites normais em http: basta informar o endereço da pasta a qual deseja-se baixar. A única observação é se a pasta estiver protegida por senha. Neste caso, utilize as opções --ftp-user=usuario e --ftp-password=senha para especificar, respectivamente, o usuário e a senha do servidor FTP.

O mesmo esquema pode ser utilizado para diretórios de páginas HTTP que estiverem protegidas por senha através do Apache, bastando utilizar --http-user e --http-password para este caso.

A mágica opção -k


Imagine que você tenha baixado uma página HTML. Usando a opção -k, todos os links da página serão convertidos para endereços de arquivos locais, para possibilitar sua visualização.

Resolução de problemas


O wget consegue baixar a maioria dos arquivos que estão na web, mas muitos administradores ativam políticas em seus servidores que dificultam sua utilização. Estas políticas, geralmente, tem o intuito de evitar o consumo excessivo de banda ou evitar que algum arquivo "secreto" seja obtido por meios distintos dos daqueles tidos como oficiais. Embora, na maioria dos casos, não haja o que fazer, o wget tem algumas opções que podem ser úteis:

  • A opção --referer=url permite informar ao servidor o parâmetro referer, que nada mais é do que a página que você estava visitando antes de chegar àquela página. Muitos servidores verificam esta informação para evitar a ação de downloaders como o wget Assim, por exemplo, você pode colocar o endereço da página de downloads no lugar de url e o servidor pensará que você baixou o arquivo diretamente daquela página.

  • Já com -U agent-string ou --user-agent=agent-string você pode fazer o wget se passar por qualquer navegador existente, ideal, também, para as páginas que tentam detectar downloaders automáticos. Por exemplo, a opção -U "Mozilla/5.0 (X11; U; Linux i686; pt-BR; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10" fará o servidor pensar que está lidando com o Firefox do Ubuntu 10.04.

  • A opção -w segundos faz com que o wget aguarde os segundos especificados entre um download e outro. Muitos servidores bloqueiam downloads consecutivos de um mesmo IP. Em último caso, pode-se utilizar --random-wait para forçar uma espera aleatória entre os downloads recursivos.

  • Se você incluir a opção -b, o wget será executado em background, o que liberará o terminal para outros comandos.

  • Já se você não consegue navegar na Web enquanto usa o wget, inclua --limit-rate=amount em sua linha de comando: isto vai limitar o consumo de banda pelo gerenciador. amount é expresso em bytes por segundo, mas você pode incluir um k ou m ao final para especificar quilobytes ou megabyttes, respectivamente. Por exemplo: --limit-rate=10k fará com que a velocidade de download do wget não ultrapasse 10kbps.


Conclusão


O wget é um gerenciador de downloads simples que não deve nada para seus companheiros com interface gráfica. Você pode obter mais informações sobre ele digitando man wget no terminal. A informação, no entanto, provavelmente estará em Inglês.

Exercícios ;)


1. Escreva um comando que baixe a árvore do Slackware-current, preservando a estrutura de pastas, usando o wget.

2. Escreva um comando que baixe os pacotes .txz do KDE no Slackware-current diretamente para a pasta atual usando o wget.

8 comentários:

  1. Cara, muito boas dicas !
    Eu utilizo bastante o wget, mas da maneira mais simples !
    E utilizo também, para downloads mais aprimorados o aria2c, que baixa qq tipo de midia ( até torrents ) e posso informar vários mirrors para downloads simultâneos !

    Muito bom artigo ! parabéns!

    ResponderExcluir
  2. Samuel Shiguemoto14 junho, 2012 11:51

    Gostei! Vou tentar agora!

    Continue assim!

    abraço!

    ResponderExcluir
  3. Ola, tudo bem, eu estou a tentar baixar as fotos deste site mas na estou a conseguir fazer
    get -c -r -nd wget -c -r -nd www.vivacena.pt/uploads/vila-mou/2012.07.07/

    as fotos estao ai wget -c -r -nd www.vivacena.pt/uploads/vila-mou/2012.07.07/1.jpg

    como faço para baixar ele esta a dar este erro

    rafael@INSYS-PC:~$ wget -c -r -nd www.vivacena.pt/uploads/vila-mou/2012.07.07/
    --2012-07-11 15:50:02-- http://www.vivacena.pt/uploads/vila-mou/2012.07.07/
    A resolver www.vivacena.pt... 94.46.250.16
    A conectar www.vivacena.pt|94.46.250.16|:80... conectado.
    Pedido HTTP enviado, a aguardar resposta... 500 Internal Server Error
    2012-07-11 15:50:02 ERRO 500: Internal Server Error

    ResponderExcluir
  4. Olá!

    Pela mensagem de erro, parece ser um problema com o servidor que hospeda as fotos e não com o wget. Tente utilizar as opções para mudar o user agent e veja se o problema continua.

    []s

    ResponderExcluir
  5. obrigado, desculpe, mas cmo nao percebo muito de linux poderia me dizer como eu posso colocar?

    ResponderExcluir
  6. Tenho usado algum temo wget e acho uma ferramente incrível. Contudo em alguns sites, após baixar suas páginas via http ele começa a baixá-las novamente via https. Não sei se por problema de configuração do site. De qualquer forma ele fica o dobro do tempo para baixar e por conseguinte para alterar os links locais (opão -k). Alguém conhece alguma maneira de restrigir o protocolo de download?

    ResponderExcluir
  7. POr favor, quando baixa pra minha máquina , mantém o nome do arquivo físico. MAs se eu quiser que ele mantenha o nome da página HTML que contém as imagens atribuindo aos novos nomes delas?
    Imagine um site www.dominio.com , na página cadastro.html ,p. ex. , se tiver 2 imagens foto1.jpg e foto2.jpg. Eu gostaria que ele baixasse e renomeasse elas ,para dominio.com/cadastro1.jpg e dominio.com/cadastro2.jpg , assim o nome delas sempre seria a pista onde no site elas se localizam.

    ResponderExcluir
  8. também pode se baixar uma página da web com o Httrack

    ResponderExcluir