Como posso extrair todos os links em PDF em um site?

10

Este é um pouco fora de tópico, mas espero que vocês me ajudem. Encontrei um site cheio de artigos de que preciso, mas eles são misturados a muitos arquivos inúteis (principalmente jpgs).

Gostaria de saber se existe uma maneira de encontrar ( não baixar ) todos os PDFs no servidor para fazer uma lista de links. Basicamente, eu gostaria de filtrar tudo o que não é um PDF, a fim de ter uma visão melhor do que fazer o download e do que não.

Sebastiano Seno
fonte
3
Você pode usar o DownThemAll para a tarefa. É uma extensão do Firefox que permite baixar arquivos por filtros e muito mais. Eu nunca o usei, então não poderei postar um tutorial completo, mas outra pessoa pode. Se você está mais familiarizado com esta extensão, sinta-se à vontade para postar uma resposta adequada.
Glutanimate
Ah, acabei de ver que você deseja filtrar os links, não baixá-los. Não sei se isso é possível com a extensão que publiquei. Mas vale a pena tentar!
Glutanimate

Respostas:

15

Visão geral

Ok, aqui está você. Esta é uma solução programática na forma de um script:

#!/bin/bash

# NAME:         pdflinkextractor
# AUTHOR:       Glutanimate (http://askubuntu.com/users/81372/), 2013
# LICENSE:      GNU GPL v2
# DEPENDENCIES: wget lynx
# DESCRIPTION:  extracts PDF links from websites and dumps them to the stdout and as a textfile
#               only works for links pointing to files with the ".pdf" extension
#
# USAGE:        pdflinkextractor "www.website.com"

WEBSITE="$1"

echo "Getting link list..."

lynx -cache=0 -dump -listonly "$WEBSITE" | grep ".*\.pdf$" | awk '{print $2}' | tee pdflinks.txt

# OPTIONAL
#
# DOWNLOAD PDF FILES
#
#echo "Downloading..."    
#wget -P pdflinkextractor_files/ -i pdflinks.txt

Instalação

Você precisará ter wgete lynxinstalado:

sudo apt-get install wget lynx

Uso

O script obterá uma lista de todos os .pdfarquivos no site e o despejará na saída da linha de comando e em um arquivo de texto no diretório de trabalho. Se você comentar o wgetcomando "opcional", o script continuará fazendo o download de todos os arquivos para um novo diretório.

Exemplo

$ ./pdflinkextractor http://www.pdfscripting.com/public/Free-Sample-PDF-Files-with-scripts.cfm
Getting link list...
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/JSPopupCalendar.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/ModifySubmit_Example.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/DynamicEmail_XFAForm_V2.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/AcquireMenuItemNames.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/BouncingButton.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/JavaScriptClock.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/Matrix2DOperations.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/RobotArm_3Ddemo2.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/SimpleFormCalculations.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/TheFlyv3_EN4Rdr.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/ImExportAttachSample.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/AcroForm_BasicToggle.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/AcroForm_ToggleButton_Sample.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/AcorXFA_BasicToggle.pdf
http://www.pdfscripting.com/public/FreeStuff/PDFSamples/ConditionalCalcScripts.pdf
Downloading...
--2013-12-24 13:31:25--  http://www.pdfscripting.com/public/FreeStuff/PDFSamples/JSPopupCalendar.pdf
Resolving www.pdfscripting.com (www.pdfscripting.com)... 74.200.211.194
Connecting to www.pdfscripting.com (www.pdfscripting.com)|74.200.211.194|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 176008 (172K) [application/pdf]
Saving to: `/Downloads/pdflinkextractor_files/JSPopupCalendar.pdf'

100%[===========================================================================================================================================================================>] 176.008      120K/s   in 1,4s    

2013-12-24 13:31:29 (120 KB/s) - `/Downloads/pdflinkextractor_files/JSPopupCalendar.pdf' saved [176008/176008]

...
Glutanimado
fonte
por que você usa em "$(pwd)/pdflinks.txt"vez de pdflinks.txt?
JFS
@JFSebastian Você está certo, é redundante. Eu modifiquei o script. Obrigado!
Glutanimate
Works perfecto!
21814 Chris Smith
6

um simples trecho de javascript pode resolver isso: (NOTA: Presumo que todos os arquivos pdf sejam finalizados com .pdf no link.)

abra o console javascript do navegador, copie o código a seguir e cole-o no js console, pronto!

//get all link elements
var link_elements = document.querySelectorAll(":link");

//extract out all uris.
var link_uris = [];
for (var i=0; i < link_elements.length; i++)
{
    //remove duplicated links
    if (link_elements[i].href in link_uris)
        continue;

    link_uris.push (link_elements[i].href);
}

//filter out all links containing ".pdf" string
var link_pdfs = link_uris.filter (function (lu) { return lu.indexOf (".pdf") != -1});

//print all pdf links
for (var i=0; i < link_pdfs.length; i++)
    console.log (link_pdfs[i]);
sgx1
fonte
1
Para mim, isso retorna demais. A lufunção precisava ser:, lu.endsWith (".pdf") == 1então isso me deu apenas os links em PDF, nem todos os links com "* .pdf *" neles, que é o que recebi com o código publicado. FWIW.
Dɑvïd