Eu tenho uma solução embora não seja perfeita e exija que você tenha curl
e perl
instalado, ambos já devem estar no Linux Mint, embora minha solução inclua um módulo Perl que escrevi e que está disponível no CPAN. Novamente cpan
deve estar disponível e instalado no Linux Mint, você pode ter que configurá-lo se ainda não o fez.
Para o módulo App :: ExtractLinks , você pode instalá-lo assim:
$ cpan App::ExtractLinks
Contanto que sua configuração do Perl esteja correta e todos os módulos do CPAN estejam visíveis em seu caminho, agora você poderá executar extract-links
no seu terminal. Se você fizer isso sem precisar nada, você não verá nada, pois espera apenas um fluxo de HTML, e ele gera um resultado padrão (imprime no seu terminal) qualquer URL que apareça nos atributos href=""
ou src=""
, então é muito simples, mas combinando-o com algumas coisas no terminal, podemos quase alcançar o que você pediu.
Se você salvar o seguinte script bash em um arquivo e conceder a ele as permissões executáveis chmod 755
ou executá-lo desta forma bash filename
:
#!/usr/bin/env bash
while read url
do
while read id
do
curl -s -I "http://files.all-free-download.com/free_download_graphic_$id.html" | perl -n -e '/^Location: (.*)$/ && print "$1\n"'
done < <(curl -s "$url" | extract-links | grep "_download" | grep -Eo '[0-9]*')
done < <(curl -s http://all-free-download.com/free-photos/ | extract-links | grep "\/download\/")
Agora, vamos tentar explicá-lo, linha por linha.
Primeiramente, enviamos a saída do seguinte comando para um loop while read
.
curl -s http://all-free-download.com/free-photos/ | extract-links | grep "\/download\/")
Isso obtém o HTML do URL que você forneceu, canaliza o fluxo de saída para extract-links
, (o argumento -s
para curl
significa apenas curl
silenciosamente faz isso) que exibe todos os links encontrados na página . Em seguida, pegamos essa lista de links e procuramos apenas os que possuem /download/
, o que o comando grep
está fazendo. Esta não é uma solução geral, é claro, eu tive que dar uma olhada no código HTML do site que você forneceu e descobri a lógica de URL deles.
Depois de obtermos apenas links com /download/
, passamos apenas eles para o loop while read
, que pega cada um de cada vez e atribui o link a uma variável $url
. Em seguida, fazemos uma operação semelhante novamente:
curl -s "$url" | extract-links | grep "_download" | grep -Eo '[0-9]*'
Isso executa a mesma coisa que já fizemos, mas sobre esse link em particular, desta vez filtrando qualquer link que tenha _download
, e só pegue os números do link. Novamente, estou descobrindo o esquema que eles devem usar para organizar links e downloads.
Deixe-me dizer neste ponto que o motivo disso é que não há links diretos para .zip
arquivos em nenhum lugar do site, os .zip
downloads começam depois de um redirecionamento HTTP quando você navega para certas páginas. O que me leva à última seção:
curl -s -I "http://files.all-free-download.com/free_download_graphic_$id.html" | perl -n -e '/^Location: (.*)$/ && print "$1\n"'
Isso está pegando apenas os números dos links que recuperamos na etapa anterior, os canaliza novamente em um loop while read
, atribui cada um como variável $id
e novamente usamos curl
desta vez com o -I
option, que apenas recupera os cabeçalhos (em vez de baixar o arquivo), cada página nesse ponto faz um redirecionamento que aponta para o próprio arquivo zip. Nós executamos a saída de curl
por meio de um script perl
embutido, que é apenas um regex para obter o cabeçalho Location
HTTP, que é aquele que especifica para qual arquivo redirecionar.
Então, tudo que você precisa fazer é:
bash my_script.sh > links.txt
Editar
Uma ressalva é que links repetidos podem aparecer, apenas com base em meus testes com esse site que você mencionou, então tenha isso em mente.
E, obviamente, essa não é uma operação muito eficiente, mas, novamente, ela é automatizada e não há necessariamente nenhuma outra maneira de acessar os dados desejados sem ter algum acesso de administrador ao site.