Извлечение всех Ссылок PDF с Нескольких Веб-сайтов

Glutanimate отправил сценарий, который извлекает все ссылки PDF из единственной страницы.

Какая-либо идея о том, как изменить это так сценарий, может захватить все ссылки PDF из списка URL?

2
задан 13 April 2017 в 15:23

3 ответа

Мне не нравятся имена файлов жесткого кодирования в сценарии. Я предпочитаю давать им как аргументы. Это может быть сделано через очень незначительную модификацию сценария Glutanimate:

#!/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 $2}'
done

можно сохранить это как downloadpdfs, сделать его исполняемым файлом (chmod +x downloadpdfs) и затем выполнить его, дав ему несколько адресов как аргументы:

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

Вышеупомянутое создаст файл, названный pdflinks.txt содержащий все ссылки, извлеченные из каждого из входных URL.

1
ответ дан 2 December 2019 в 02:02

Я создал бы отдельное (текст), файл со всем URL перечислил в одних строках:

www.url1
www.url2

Затем измените строку в сценарии для добавления найденных ссылок PDF на произведенный pdflinks.txt (tee -a pdflinks.txt | more вместо tee pdflinks.txt):

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

Затем сделайте исполняемый файл сценария и выполните его другим (Python в этом случае) сценарий:

#!/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", "")])

Вставьте текст выше в пустом документе, добавьте соответствующие пути и сохраните его как run_pdflinkextractor.py и выполните его командой

python3 /path/to/run_pdflinkextractor.py

Больше опций

Вы на самом деле не попросили его, но в случае, если требуется загрузить найденные ссылки PDF, жаль для остановки половины пути. Сценарий ниже мог бы быть удобным, чтобы сделать это. Процедура является тем же: вставьте текст ниже в пустом файле, сохраните его как download_pdffiles.py, добавьте путь к pdflinks.txt это было создано в первом шаге, пути к папке, требуется загрузить файлы на и выполнить его командой:

 python3 /path/to/download_pdffiles.py

Сценарий для фактической загрузки файлов:

#!/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", "")])

Можно, конечно, добавить больше опций к сценарию, что сделать в случае ошибок, например (ошибки проигнорированы в сценарии, как это). Посмотрите man wget для большего количества опций.

3
ответ дан 2 December 2019 в 02:02

Ответ зависит от того, что Вы определяете как "список URL".

Если Вы хотите сделать это как сценарий командной строки мультиаргумента, используйте код как это:

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

Существует также способ прочитать список URL из файла, линию за линией:

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

Улучшите мой ответ, как Вы желаете. Я не ведущее устройство удара :)

1
ответ дан 2 December 2019 в 02:02

Другие вопросы по тегам:

Похожие вопросы: