Glutanimate отправил сценарий, который извлекает все ссылки PDF из единственной страницы.
Какая-либо идея о том, как изменить это так сценарий, может захватить все ссылки PDF из списка URL?
Мне не нравятся имена файлов жесткого кодирования в сценарии. Я предпочитаю давать им как аргументы. Это может быть сделано через очень незначительную модификацию сценария 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.
Я создал бы отдельное (текст), файл со всем 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
для большего количества опций.
Ответ зависит от того, что Вы определяете как "список 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"
Улучшите мой ответ, как Вы желаете. Я не ведущее устройство удара :)