Como otimizar o script de download do wget

2

Conteúdo do site

<html>
  <body>
   <a href="http://www.sagar.com/" title="sagar">Sagar</a>
   <a href="http://www.sagarcom/1/" title="sagar1">Sagar Link1</a>
   <a href="http://www.sagar.com/2/song.mp3">Download this</a>
  </body>
</html>

link_source_file.txt contém o URL do conteúdo acima

## Below wget command
wget -r -l1 -H -t1 -nd -N -np -A.mp3 -erobots=off -i link_source_file.txt

Eu quero baixar um tipo específico de arquivo, como mencionado por -A. Aqui está mp3 . O comando wget acima irá até uma profundidade do link como por -t1 .

Ele segue o primeiro link http://www.sagar.com/ e faz o download do arquivo index.html . Em seguida, descobre que não tem nenhum tipo de arquivo como .mp3 , em seguida, remove index.html

Eu quero que o wget siga apenas os links que têm uma extensão de *.mp3 e nenhum outro link. Como posso ajustar o comando para esse requisito?

    
por Samar Panda 06.04.2013 / 11:04

2 respostas

1

Eu não acho que você pode. Afinal de contas, usar a opção de download recursivo -r basicamente pede ao wget para procurar por links (em -l levels), e links são encontrados somente em arquivos html. Portanto, o wget precisa fazer o download e analisar os arquivos html, procurando links para mais arquivos html e arquivos mp3.

Se você já criou uma lista de links, por que você não usa apenas fgrep ".mp3" para criar uma nova lista com apenas arquivos mp3, e usa isso como link_source_file para wget? Como o wget não baixará nenhum arquivo html, ele não encontrará mais links, então você pode soltar o -r -l e provavelmente algumas outras opções também - apenas mantenha -i (e -A , embora a lista já seja apenas contém apenas arquivos mp3). Use a opção -x para forçar a criação de uma hierarquia de arquivos, mesmo sem -r .

Em suma, se você quiser percorrer um site recursivamente, você deve permitir que o wget baixe e analise arquivos html, mesmo que não os mantenha.

Uma alternativa seria usar o wget para baixar apenas alguns níveis de arquivos html. Em seguida, colha os links desses arquivos manualmente e crie uma lista com todos os arquivos mp3 que você encontrou (lynx, sed e fgrep seriam de grande ajuda para isso). Ou se você souber algo sobre a organização do site, gere uma lista dos arquivos desejados de alguma outra forma (por exemplo, usando um shellscript para criar uma lista com linhas como:

http://www.sagar.com/1/song.mp3
http://www.sagar.com/2/song.mp3
http://www.sagar.com/3/song.mp3
http://www.sagar.com/100/song.mp3
    
por 06.04.2013 / 13:36
0

A abordagem manual com o grep.

Comece em um diretório vazio e baixe todos os arquivos HTML da sua lista de forma não recursiva. Adicione as opções --convert-links para que os links relativos aos arquivos MP3 sejam convertidos em arquivos completos. Então você tem apenas arquivos como o que você postou acima com um ou mais links para arquivos MP3.

Então você pode fazer:

(for f in *
 do
     grep -P --only-matching '(?<=href=")[^ "]*\.mp3' foo.html "$f"
     # rm "$f"
 done) | xargs wget

Deixe de fora o # antes do rm se você quiser excluir os arquivos não-mp3 baixados.

Isso ainda pode falhar se, por exemplo, um host se recusa a fazer o download quando o referenciador está ausente ou errado.

    
por 06.04.2013 / 19:34

Tags