Com certeza alguém já viu um site legal e teve vontade de baixá-lo para o computador para espelhá-lo, roubar seu template ou coisa assim.
Ou então deu de cara com um "Index of" e quer/precisa baixar todos os arquivos dali.
Para Windows temos softwares como o WebReaper (eu o usava quando tinha Windows), mas como nosso querido Linux já vem com tudo o que precisamos, temos o famoso wget.
O wget é geralmente utilizado para baixar um único arquivo por vez. Ele tem a simples finalidade de fazer downloads de HTTP ou FTP.
Antes de mais nada, veja a ajuda nativa do WGet, obtida após digitar o comando wget -h no bash:
[code]loremipsum@debian:~$ wget -h
GNU Wget 1.12, um programa não interativo para baixar arquivos da rede.
Uso: wget [OPÇÃO]... Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... por completo. Basicamente, nosso comando ficaria assim:
Mas o que aconteceria? Ele baixaria apenas a índex, não é? Então, antes de usar o comando, precisamos implementá-lo.
Primeiramente vamos ver opções básicas.
Como queremos que ele baixe todos os arquivos de um site, dizemos que ele deverá ser recursivo, ou seja, dispor recursos no download para que siga os links e os baixe. Além disso, também queremos que ele baixe todas as imagens, folhas de estilo (e outros arquivos) necessários para o funcionamento da página. Então, nosso comando já se modificou um pouco:
Mas veja, se apenas baixarmos os arquivos, os links vão continuar apontando para a web, não é? Isso é facilmente resolvido com o parâmetro "k", que converte os links, includes, src's, hrefs etc.
O que este código fará? Simplesmente irá baixar o site por completo, apenas arquivos hospedados naquele site. E se quisermos baixar arquivos de outros sites que possuem links naquela página também? Simples, usamos a opçao "H". Veja:
1. Vamos dizer que no site que queremos baixar há links para arquivos em outros três sites: "www.site2.com.br", "www.site3.com.br" e "www.site4.com.br". Queremos arquivos de todos eles, menos o do site3 e site4. Como faremos isso? É simples: dizemos ao wget para não baixar arquivos deste site:
(Leia a ajuda do comando copiada acima (ítem "Aceitação/Recusa de recursão".
Outra coisa: quando vamos baixar arquivos de um determinado diretório "como em um 'Index of'", geralmente não queremos que ele suba para o diretório acima, baixando apenas os arquivos que queremos. Para dizer isto ao wget, usamos o parâmetro "-np".
E se eu preciso de um cookie ou enviar algum dado via POST ou GET antes de baixar um arquivo?
O wget também tem essas funções. Veja no ítem "Opções HTTP" na ajuda do mesmo que você consegue modificar os HTTP Headers (--user-agent="Seu agente"), carregar cookies (--load-cookies=arquivo.txt) e enviar dados via POST (--post-data=campo=texto&outrocampo=outrotexto). Para os cookies, você deverá criar um arquivo de texto e dispor os dados na seguinte posição:
Lembrando que isto serve tanto pra HTTP, quando pra HTTPS (SSL) e FTP.
Mas e se o servidor requer login e senha (HTTP[s] ou FTP)?
Primeiramente, você deve saber a senha. O wget não consegue descobrir senhas. Disso, vamos usar:
Para HTTP/HTTPS:
Para FTP:
Vou parar por aqui. Agora, vou deixar para vocês continuarem. Leia a ajuda oficial do wget que copiei no início e tirem suas próprias conclusões. O programa funciona rapidamente, mostra o progresso e é totalmente configurável.
Até mais.
Ou então deu de cara com um "Index of" e quer/precisa baixar todos os arquivos dali.
Para Windows temos softwares como o WebReaper (eu o usava quando tinha Windows), mas como nosso querido Linux já vem com tudo o que precisamos, temos o famoso wget.
O wget é geralmente utilizado para baixar um único arquivo por vez. Ele tem a simples finalidade de fazer downloads de HTTP ou FTP.
Antes de mais nada, veja a ajuda nativa do WGet, obtida após digitar o comando wget -h no bash:
[code]loremipsum@debian:~$ wget -h
GNU Wget 1.12, um programa não interativo para baixar arquivos da rede.
Uso: wget [OPÇÃO]... Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... por completo. Basicamente, nosso comando ficaria assim:
Código:
wget http://www.site.com.br
Primeiramente vamos ver opções básicas.
Como queremos que ele baixe todos os arquivos de um site, dizemos que ele deverá ser recursivo, ou seja, dispor recursos no download para que siga os links e os baixe. Além disso, também queremos que ele baixe todas as imagens, folhas de estilo (e outros arquivos) necessários para o funcionamento da página. Então, nosso comando já se modificou um pouco:
Código:
wget -r -p http://www.site.com.br
Código:
wget -r -p -k http://www.site.com.br
Código:
wget -r -p -k -H http://www.site.com.br
Faz bem lembrar que Unix é case-sensitive (sensível ao caso), ou seja, diferencia maiúsculas de minúsculas.
Agora, vamos ver como podemos limitar o wget.1. Vamos dizer que no site que queremos baixar há links para arquivos em outros três sites: "www.site2.com.br", "www.site3.com.br" e "www.site4.com.br". Queremos arquivos de todos eles, menos o do site3 e site4. Como faremos isso? É simples: dizemos ao wget para não baixar arquivos deste site:
Código:
wget -r -p -k -H --exclude-domains=site3.com.br,site4.com.br
Outra coisa: quando vamos baixar arquivos de um determinado diretório "como em um 'Index of'", geralmente não queremos que ele suba para o diretório acima, baixando apenas os arquivos que queremos. Para dizer isto ao wget, usamos o parâmetro "-np".
E se eu preciso de um cookie ou enviar algum dado via POST ou GET antes de baixar um arquivo?
O wget também tem essas funções. Veja no ítem "Opções HTTP" na ajuda do mesmo que você consegue modificar os HTTP Headers (--user-agent="Seu agente"), carregar cookies (--load-cookies=arquivo.txt) e enviar dados via POST (--post-data=campo=texto&outrocampo=outrotexto). Para os cookies, você deverá criar um arquivo de texto e dispor os dados na seguinte posição:
nome_do_cookie: conteúdo
outro_cookie: conteúdo
outro_cookie: conteúdo
Lembrando que isto serve tanto pra HTTP, quando pra HTTPS (SSL) e FTP.
Mas e se o servidor requer login e senha (HTTP[s] ou FTP)?
Primeiramente, você deve saber a senha. O wget não consegue descobrir senhas. Disso, vamos usar:
Para HTTP/HTTPS:
Código:
--http-user=usuário --http-password=senha
Código:
--ftp-user=usuário --ftp-password=senha
Até mais.
Comment