Como você usa o WGET para espelhar um site com um nível de profundidade, recuperando recursos JS, CSS, incluindo imagens CSS?

11

Finja que queria que uma cópia simples da página fosse baixada para o meu HD para manutenção permanente. Não estou procurando uma obtenção recursiva profunda, apenas uma única página, mas também quaisquer recursos carregados por essa página para serem baixados.

Exemplo: https://www.tumblr.com/

Espero:

  • O index.html
  • Qualquer imagem carregada
  • Qualquer arquivo JS carregado
  • Qualquer arquivo CSS carregado
  • Quaisquer imagens carregadas no arquivo CSS
  • links para os recursos da página localizados para trabalhar com as cópias baixadas (sem dependência da web)

Estou interessado em saber se você pode me ajudar a encontrar a melhor sintaxe wget ou outra ferramenta que faça isso. As ferramentas que eu tentei geralmente falham ao obter as imagens carregadas por CSS; portanto, a página nunca parece correta quando carregada localmente. Obrigado!

Solução Tangente

Eu encontrei uma maneira de fazer isso usando o FireFox. O salvamento padrão está interrompido e há um complemento chamado "Salvar Concluído", que aparentemente pode fazer um bom trabalho com isso. No entanto, você não pode baixá-lo porque diz que não é suportado na versão atual do FireFox. O motivo é que ele foi transferido para este complemento: "Mozilla Archive Format". Instale isso e, quando você usar Arquivo> "Salvar página como ..", haverá uma nova opção chamada "Página da Web concluída", que é essencialmente o complemento antigo, que corrige a implementação de estoque que o FireFox usa (o que é terrível). Esta não é uma solução WGET, mas fornece uma solução viável.

Edição: Outro problema ridículo para quem pode estar seguindo esta pergunta no futuro, tentando fazer isso. Faça com que o complemento funcione corretamente, você precisa de Ferramentas> Formato de arquivo Mozilla e altere a configuração padrão (terrível) de "tire uma foto fiel da página" para "preservar scripts e código-fonte usando Salvar concluído", caso contrário, o complemento esvaziará tudo seus arquivos de script e substitua-os pelo texto "/ * Script removido por snapshot save * /".

Lana Miller
fonte
Arquivo> Salvar como no Firefox ou outro navegador irá baixar todas as imagens, js e CSS
user31113
Deseja realmente os arquivos ou apenas deseja uma versão renderizada da página corretamente?
Eu quero os arquivos, eles seriam obrigados a renderizar a página corretamente de qualquer maneira. Se você não os tivesse, pareceria diferente. Arquivo> Salvar como não funciona no Firefox. Se você fizer isso, não obtém as imagens css. Experimente em tumblr.com/login . Imagem de fundo ausente, imagem de BG para campos de entrada ausentes.
Nenhuma das soluções wget funcionou para mim. Minha solução tangente é o melhor método para obter esse tipo de economia de site. No entanto, já vi falhas em páginas muito complicadas como apple.com , presumivelmente porque muitos dos caminhos de recursos são gerados dinamicamente pela execução de javascript, alguns não imediatamente, mas durante algum tipo de execução de ajax.
Lana Miller

Respostas:

12

wget -p -k http://ExampleSite.com

O -p fornece a você todos os elementos necessários para visualizar o site corretamente (css, imagens, etc.). O -k mudará todos os links (para incluir os de CSS e imagens) para permitir que você visualize a página offline como ela apareceu online.

Atualização: isso é específico para o seu site de exemplo: tumblr.com

wget -H -N -k -p --exclude-domains quantserve.com --no-check-certificate -U "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110613 Firefox/6.0a2" https://www.tumblr.com

O colapso:

-H = Permite que o wget vá estender um host estrangeiro. Obrigatório, já que o tumblr não tem suas imagens na primeira página no mesmo endereço, eles estão usando secure.assets.tumblr.com, veja nota sobre exclusão de domínios

-N = captura apenas os arquivos mais recentes do que você possui atualmente, caso esteja baixando a mesma página novamente ao longo do tempo

-k = converta seus links para visualizá-lo offline corretamente

-p = pega todos os elementos necessários para visualizá-lo corretamente (css, imagens etc.)

--exclude-domains = como a página inicial do tumblr.com tem um link para quantserve.com e acho que você não quer essas coisas, é necessário excluí-las do download do wget. Nota : Este é um item muito importante que você deve usar com -H, porque se você for a um site e eles tiverem vários links para hosts externos (pense em coisas de anunciantes e análises), você também vai pegar essas coisas!

--no-check-certificate obrigatório, já que o tumblr está usando https

-U altera o agente do usuário. Não é realmente necessário nesse caso, pois ele permite o agente do wget padrão, mas eu sei que alguns sites o bloquearão. Acabei de jogar aqui, para o caso de você encontrar problemas em outros sites. No exemplo de trecho que dei, ele aparece como Mozilla Firefox 6.02a

finalmente você tem o site: https://www.tumblr.com


fonte
11
Eu tentei isso, não obtive nenhum arquivo JS, CSS ou imagem. Você fez?
Se você o estiver usando no Tumblr (seu exemplo acima), talvez seja necessário especificar --no-check-certificate.
Acho que você está certo, provavelmente precisa dessa opção. Ainda nada, exceto index.html, no entanto. Algo está faltando ...
@LanaMiller Atualizei minha resposta. Deixe-me saber se há algum problema.
Você não poderia fazer algo como -exclude-domains! = Tumblr.com?
Alpha1 de
3

Para o site específico que você mencionou e muitos outros codificados como wget (e curl), simplesmente não funcionará. O problema é que alguns dos links de ativos necessários para renderizar a página em um navegador são criados por javascript. O Wget tem uma solicitação de recurso pendente para executar o javascript:

http://wget.addictivecode.org/FeatureSpecifications/JavaScript

No entanto, até que isso seja concluído, os sites que constroem links de ativos usando javascript não serão clonáveis ​​usando o wget. A solução mais fácil é encontrar uma ferramenta que esteja criando um DOM e analisando o javascript como um mecanismo de navegador (ou seja, o método do Firefox que você mencionou).

polinomial
fonte
1

Você também pode fazer isso automaticamente (ou programaticamente se codificar) emitindo um comando via shell usando o wget:

wget --convert-links -r http://www.yourdomain.com

Ele fará o download da página e dos arquivos internos e torna os links locais.

Jhourlad Estrella
fonte
11
Isso vai conseguir tudo . Leia a pergunta.
Evgeny #
-1
wget -r http://www.example.com

Eu acho que isso vai pegar tudo, mas tente e descubra.


fonte
11
Recebe tudo o que é demais. Até agora, a solução FireFox que encontrei é a melhor solução de trabalho. Consegue o que você precisa e nada mais.
-1

$ ( man wget ):

-p

--página-requisitos

Essa opção faz com que o Wget faça o download de todos os arquivos necessários para exibir corretamente uma determinada página HTML. Isso inclui coisas como imagens embutidas, sons e folhas de estilo referenciadas.

Normalmente, ao baixar uma única página HTML, todos os documentos necessários que possam ser necessários para exibi-la corretamente não são baixados. Usar -r junto com -l pode ajudar, mas como o Wget geralmente não faz distinção entre documentos externos e embutidos, geralmente fica com "documentos em folha" que estão em falta.

Por exemplo, digamos que o documento 1.html contenha uma marca "<IMG>" que faça referência à 1.gif e uma marca "<A>" apontando para o documento externo 2.html. Digamos que 2.html seja semelhante, mas que sua imagem seja 2.gif e esteja vinculada a 3.html. Digamos que isso continue até um número arbitrariamente alto.

Se alguém executar o comando:

wget -r -l 2 http: // <site> /1.html

então 1.html, 1.gif, 2.html, 2.gif e 3.html serão baixados. Como você pode ver, 3.html está sem seu requisito 3.gif, porque o Wget está simplesmente contando o número de saltos (até 2) longe de 1.html para determinar onde parar a recursão. No entanto, com este comando:

wget -r -l 2 -p http: // <site> /1.html

todos os arquivos acima e o 3.gif necessário da 3.html serão baixados. Similarmente,

wget -r -l 1 -p http: // <site> /1.html

fará com que 1.html, 1.gif, 2.html e 2.gif sejam baixados. Pode-se pensar que:

wget -r -l 0 -p http: // <site> /1.html

baixaria apenas 1.html e 1.gif, mas infelizmente esse não é o caso, porque -l 0 é equivalente a -l inf --- ou seja, recursão infinita. Para baixar uma única página HTML (ou várias delas, todas especificadas na linha de comando ou em um arquivo de entrada -i-URL) e seus (ou seus) requisitos, basta desativar -r e -l:

wget -p http: // <site> /1.html

Observe que o Wget se comportará como se -r tivesse sido especificado, mas apenas essa página e seus requisitos serão baixados. Os links dessa página para documentos externos não serão seguidos. Na verdade, para baixar uma única página e todos os seus requisitos (mesmo que existam em sites separados) e garantir que o lote seja exibido corretamente localmente, esse autor gosta de usar algumas opções além de -p:

wget -E -H -k -K -p http: // <site> / <documento & gt ;

Para finalizar este tópico, vale a pena saber que a idéia do Wget de um link de documento externo é qualquer URL especificado em uma tag "<A>", em uma tag "<AREA>" ou em uma tag "<LINK>" diferente de "< LINK REL = "folha de estilo"> ".

James Sumners
fonte
2
Qual parte disso você acha que se parece com a solução? Porque tentei ler o conteúdo da página de manual e não vejo a solução correta aqui. Você tentou algo disso sozinho? O que você acha que o comando é que aborda a questão especificamente.