Extraindo todos os links PDF de vários sites

2

Glutanimate postou um script que extrai todos os links em PDF de uma única página .

Alguma ideia de como mudar isso para que o script possa pegar todos os links PDF de uma lista de URLs?

    
por Daniel Oliveira 19.05.2014 / 22:50

3 respostas

3

Eu criaria um arquivo separado (texto) com todos os URLs listados em linhas simples:

www.url1
www.url2

Em seguida, altere a linha no script para anexar os links encontrados em pdf ao pdflinks.txt ( tee -a pdflinks.txt | more em vez de tee pdflinks.txt ):

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

Em seguida, torne o script executável e execute-o por outro script (python neste caso):

#!/usr/bin/python3
import subprocess

url_list = "/path/to/url_list.txt"
script = "/path/to/script.sh"

with open(url_list) as sourcefile:
    sourcefile = sourcefile.readlines()
for item in sourcefile:
    subprocess.call([script, item.replace("\n", "")])

Cole o texto acima em um documento vazio, adicione os caminhos apropriados e salve-o como run_pdflinkextractor.py e execute-o pelo comando

python3 /path/to/run_pdflinkextractor.py

Mais opções

Você realmente não pediu, mas caso queira baixar os links pdf encontrados, é uma pena parar no meio do caminho. O script abaixo pode ser útil para fazer isso. O procedimento é o mesmo: cole o texto abaixo em um arquivo vazio, salve-o como download_pdffiles.py , adicione o caminho para o pdflinks.txt que foi criado no primeiro passo, o caminho para a pasta que você gostaria de baixar os arquivos para e execute-o pelo comando:

 python3 /path/to/download_pdffiles.py

O script para baixar os arquivos:

#!/usr/bin/python3

import subprocess

pdf_list = "/path/to/pdflinks.txt"
download_directory = "/path/to/downloadfolder"

with open(pdf_list) as sourcefile:
    sourcefile = sourcefile.readlines()
for item in sourcefile:
    subprocess.call(["wget", "-P", download_directory, item.replace("\n", "")])

É claro que você pode adicionar mais opções ao script, o que fazer no caso de erros, por exemplo (os erros são ignorados no script como estão). Veja man wget para mais opções.

    
por Jacob Vlijm 19.05.2014 / 23:43
1

A resposta depende do que você define como "lista de URLs".

Se você quiser fazer isso como um script de linha de comando multi-arg, use um código como este:

#!/bin/bash
for WEBSITE in "$*"
do
    <scriptname> "$WEBSITE"
done

Há também uma maneira de ler uma lista de URLs de arquivos, linha por linha:

#!/bin/bash
_file=""
while IFS= read -r line
do
    <scriptname> "$line"
done < "$_file"

Melhore minha resposta como desejar. Eu não sou um mestre de bash:)

    
por Roomy 19.05.2014 / 23:21
1

Eu não gosto de codificar nomes de arquivos em scripts. Eu prefiro dar a eles como argumentos. Isso pode ser feito através de uma pequena modificação do roteiro de Glutanimato:

#!/usr/bin/env 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" > output_file


echo "Getting link list..."

## Go through each URL given and find the PDFs it links to
for website in "$@"; do
    lynx -cache=0 -dump -listonly "$website" | awk '/.pdf$/{print }'
done

Você pode salvá-lo como downloadpdfs , torná-lo executável ( chmod +x downloadpdfs ) e depois executá-lo, fornecendo vários endereços como argumentos:

downloadpdfs "http://example.com" "http://example2.com" "http://example3.com" > pdflinks.txt

O texto acima criará um arquivo chamado pdflinks.txt contendo todos os links extraídos de cada um dos URLs de entrada.

    
por terdon 20.05.2014 / 01:58