Preciso baixar um grande número de arquivos PDF (seria entediante, senão impossível, coletar e agrupar todos os links) do site da minha universidade usando o wget, com links como este:
http://example.edu/path_to_directory/directory/foobar.pdf
Estou usando o seguinte comando:
wget -mk --no-check-certificate --load-cookies cookies.txt http://example.edu/arbitrary_link_to_directory/directory/
Infelizmente, os diretórios reais que contêm os PDFs redirecionam para uma página de erro, e tudo que recebo são um monte de arquivos HTML e CSS.
http://example.edu/path_to_directory/directory/
em um navegador redirecionaria alguém para
http://example.edu/path_to_directory/error/error.html
Seria possível baixar todos os arquivos em questão usando o wget?
Responder1
Quando quero baixar vários arquivos de um site que não facilita (ou dificulta ativamente), eu gero uma lista de URLs dos arquivos com algo assim:
lynx -dump -listonly $URL | awk '/\.pdf/ {print $2}' > /tmp/pdflist.txt
Normalmente, edito o arquivo para vi
excluir entradas que não quero baixar e, finalmente, busco todas elas com o wget:
wget --input-file=/tmp/pdflist.txt
Isso funciona bem para tarefas simples e geralmente funciona bem o suficiente para tarefas moderadamente difíceis... mas para tarefas difíceis que envolvem análise de HTML complicado e links a seguir (e talvez usando cookies), escreverei um perl
web-bot usando o libwww-perl
módulo ( também conhecido comoLWP).
Responder2
No site da sua universidade há uma página com links para todos os PDFs? Ou como você conhece a lista de nomes de arquivos PDF?
Nesse caso, você precisará escrever um script chamado scraper para obter links dessa página de maneira programática e, em seguida, percorrer automaticamente essa lista e baixá-los com o wget ou outra ferramenta. Eu sugeriria PHP ou Python para escrever o raspador. Você gerenciará facilmente a eventual paginação no site de origem. Se estiver usando PHP, você pode simplesmente baixar arquivos com
file_put_contents('destination_filename', file_get_contents('source_url');