Для начала определимся, что подобные операции лучше делать если не с согласия владельца сайта, то хотя бы так, чтобы все не повалить. Таймауты и лимиты на скорость обхода и скачивания крайне желательны.
У меня возникла задача скопировать файловый архив форума на Simple machines. Я знал приблизительный конечный индекс и надо было обязательно залогиниться для доступа.
Для того, чтобы консольные утилиты понимали, что они залогинены на сайте, необходимо отдать им cookies.txt, я для хрома использую это расширение для его генерации
И вот скрипт для скачивания файлового архива:
Код:
#!/bin/bash
for i in {1..5000}
do
wget --timeout=30 --tries=1000 -U 'Mozilla/5.0 (X11; Russian Windows; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36' --content-disposition --load-cookies=cookies.txt "https://имя_сайта/index.php?action=downloads;sa=downfile&id=$i"
sleep 1
done
find . -size 0 -delete
Как вы видите, между закачками пауза в секунду, что достаточно хорошо разгружает сервер. Отсутствующие аттачи приезжают нулевыми файлами, которые я потом удаляю. Обратите внимание, что есть --content-disposition, позволяющий скачивать файл с теми именами, которые должны быть, а не автогенерируемыми из ссылок.
Вот пример скачивания целиком всего сайта
Код:
wget --mirror -p --convert-links --content-disposition --trust-server-names --adjust-extension --page-requisites --timeout=30 --tries=1000 -U 'Mozilla/5.0 (X11; Russian Windows; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36' https://имя_сайта/
обратите внимание, что пауз и лимитов тут нет, посмотрите сами в мануале. Да, JS wget не обрабатывает.
Примитивный JS умеет обрабатывать httrack, вот пример его запуска для копирования сайта
Код:
httrack https://имя_сайта/ -s0 --sockets=2 --connection-per-second=1 --max-rate=100000 --timeout=60 --retries=1000 -n --keep-alive --urlhack --single-log -%v -N4 --disable-security-limits -b1 --user-agent "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.17) Gecko/2009122116 Firefox/3.0.17 GTB6 (.NET CLR 3.5.30729)"
умеет несколько потоков и прочие плюшки, в том числе подгружает cookies.txt из текущего каталога, но не умеет content-disposition. Если кто знает, как его заставить сохранять нормально файлы, вылезающие из php, прошу сказать...