Download em massa de PDFs

3

Isso pode ou não ser possível usando o bash feliz por uma sugestão em Python, se houver uma.

Mas eu gostaria de baixar todos os PDFs / ePubs do link a seguir

link

Você pode selecionar os PDFs disponíveis, fazendo o seguinte selecionando PDF e, em seguida, TODOS. Você verá uma lista dos documentos que eles têm em PDF estão listados.

O problema é que o URL não parece mudar à medida que você sobe pela lista, e também o mesmo link se você escolher o EPUB e depois escolher ALL.

Então, se eu fosse usar o wget curl, não parece haver uma maneira de distinguir o PDF do EPUB.

Vou então convertê-los para PDF / EPubs usando Calibre e carregar para minha conta Kindle para que eu possa ter uma pilha deles para ler enquanto estiver no tubo.

Obrigado antecipadamente ..

    
por user1380599 20.01.2016 / 15:43

1 resposta

3

(Começou como algumas dicas, acabou sendo uma resposta bastante grande. (novamente:]))

Eu não posso responder se há alguma política no site contra o download em lote, mas como um começo.

Embora isso seja muito específico do site, o mesmo procedimento deve ser aplicável a sites semelhantes, portanto, a resposta pode ser útil para outras pessoas. Mais como um exemplo.

Em esse tipo de página, eu teria olhado mais de perto o site e não tentado rastreá-lo como um todo. Por um lado, existem conteúdos gratuitos e pagos. Em segundo lugar; simplesmente baixar tudo em uma pilha enorme pode se tornar um pouco confuso, especialmente considerando quantos documentos existem.

Isolando as páginas de índice

  1. A página mostra o mesmo URL, não importa em que seção você esteja. Mas, olhando para a fonte ou simplesmente aspirando uma das seções, você verá que ela tem pelo menos dois possíveis destinos interessantes:

    PDF : https://mises.org/library/books?book_type=539
    EPUB: https://mises.org/library/books?book_type=537
    
  2. O resultado é dividido por 10 e 10 ocorrências. Por exemplo: PDF show Exibindo 1 - 10 de 535 . Hoovering os números na parte inferior localizamos a próxima informação interessante: &page=1 , &page=2 etc.

Como existem 535 ocorrências, temos que fazer o download de 535 / 10 = 54 páginas. Como page=0 , a última página atual seria page=53 .

Isso nos dá uma dica sobre o que fazer o download para começar. PDF:

https://mises.org/library/books?book_type=539&page=0
https://mises.org/library/books?book_type=539&page=1
...
https://mises.org/library/books?book_type=539&page=53

Como os PDFs free parecem incluir EPUBs gratuitos, provavelmente não há necessidade de fazer o mesmo para a guia EPUB .

Nesse caso, pode-se acabar fazendo algo como:

mkdir mises.org
cd mises.org

Execute no terminal ou adicione a um arquivo de script:

for i in {0..53}
do
    curl -o ./"$(printf "pdfl-%03d.html" $i)" "https://mises.org/library/books?book_type=539&page=$i"
done

Já temos uma boa estrutura ordenada para trabalhar.

Extraindo dados relevantes

Depois disso, o próximo passo é olhar mais de perto uma das subpáginas. Por exemplo, pdfl-000.html .

Após um rápido exame, descobrimos que cada livro está contido em:

  <div class="panel-body">
     ... book data ...
  </div>

Agora, tudo dependendo do que você gostaria de extrair o caminho daqui em diante é ir para file-name + arquivo-url , ou também incluir meta dados e outros sugar como autor, tópico, imagens, etc. Para o último, você usaria um analisador de HTML em algo como Python, Perl ou algo parecido. Para o primeiro, isso também pode ser usado - mas também é possível usar ferramentas de processamento de texto mais simples, como sed , grep etc.

Neste caso, (por simplicidade), eu vou para o primeiro.

Agora, é comum afirmar que nunca devemos analisar HTML com regexp etc., mas, neste caso, não estamos analisando o documento , mas apenas extraindo dados relevantes . Assim, especialmente porque não é um site aleatoriamente possivelmente malicioso, nem um hack-splash de marcação maluca - mas conciso e bem formatado - o uso de sed etc. é OK (IMHO).

Olhando mais para o pdfl-000.html , descobrimos que o título está entre <h2 class="element-invisible"> e .pdf . O link para o documento <a tem type="application/pdf .

Com isso como base, podemos extrair rapidamente todos os títulos e destinos com, por exemplo, sed . Como o resultado de sed nos dá title e URI em linhas alternadas, podemos canalizar o resultado para paste - - .

Como a numeração dos itens seria boa, nós canalizamos mais para awk para adicionar algum nome de documento alterado. Isso também provavelmente nos salvará se dois documentos tiverem o mesmo título.

Nesse exemplo bruto, supomos que nenhum nome tenha tab , newline ou " como parte dele.

sed -n -e 's#.*<h2 class="element-invisible"><a [^>]*>\([^<]*\.pdf\)</a>.*</h2>##p' \
    -e 's#.*<a[^>]* href="\([^"]*\)"[^<]*type="application/pdf;.*#"https://mises.org"#p' \
    pdfl-* | \
    paste - - | \
    awk -F'\t' '{ printf "curl -o \"%03d-%s\" %s\n",NR,$1,$2 }' > curl.txt

Download

Então é simplesmente fazer:

mkdir pdf
cd pdf
. ../curl.txt

e aguarde o download. Terminando com algo como:

001-A Spontaneous Order.pdf
002-Science Technology and Government.pdf
003-Science Technology and Government—Chinese.pdf
004-The Next Generation of Austrian Economics Essays in Honor of Joseph T. Salerno.pdf
005-A Short History of Man — Progress and Decline.pdf
...

Nota lateral

  • Guarde os arquivos pdfl-NNN.html se você quiser extrair mais informações dos arquivos.

  • Uma rápida soma de todos os PDFs usando o valor lenghth=NNN da URL mostra um total de 7401933553 bytes ou 6,89 GiB para download: P

por 20.01.2016 / 20:19

Tags