Как вы используете WGET для зеркалирования сайта на 1 уровень, восстанавливая JS, CSS ресурсы, включая CSS изображения?

11

Притворись, что я хотел, чтобы простая копия страницы была загружена на мой HD для постоянного хранения. Я не ищу глубокую рекурсивную загрузку, просто одну страницу, но также и любые ресурсы, загружаемые этой страницей, для загрузки.

Пример: https://www.tumblr.com/

Ожидать:

  • Index.html
  • Любые загруженные изображения
  • Любые загруженные файлы JS
  • Любые загруженные файлы CSS
  • Любые изображения, загруженные в файл CSS
  • ссылки на ресурсы страницы, локализованные для работы с загруженными копиями (без веб-зависимости)

Мне интересно знать, можете ли вы помочь мне найти лучший синтаксис wget или другой инструмент, который сделает это. Инструменты, которые я пробовал, обычно не загружают изображения с помощью CSS, поэтому страница никогда не выглядит правильно при локальной загрузке. Спасибо!

Касательное решение

Я нашел способ сделать это с помощью FireFox. Сохранение по умолчанию не работает, и есть дополнение, которое называется «Сохранить завершено», которое, очевидно, может с этим справиться. Тем не менее, вы не можете скачать его, потому что он говорит, что он не поддерживается в текущей версии Firefox. Причина в том, что он был свернут в это дополнение: «Формат архива Mozilla». Установите это, затем, когда вы используете File> «Save Page As ..», появляется новая опция, называемая «Web Page, complete», которая по сути является старым аддоном, который исправляет стандартную реализацию, используемую FireFox (что ужасно). Это не решение WGET, но оно обеспечивает работоспособное решение.

РЕДАКТИРОВАТЬ: Еще одна нелепая проблема для тех, кто может последовать за этим вопросом в будущем, пытаясь сделать это. Чтобы заставить аддон работать должным образом, вам нужно Инструменты> Формат архива Mozilla и изменить (ужасный) параметр по умолчанию «сделать точный снимок страницы» на «сохранить сценарии и исходный код с помощью команды« Сохранить завершено »», в противном случае аддон опустошит все ваши файлы скриптов и замените их текстом "/ * Скрипт удален с помощью сохранения снимка * /".

Лана Миллер
источник
file> сохранить как на firefox или другой браузер загрузит все изображения, js и css файлы
user31113
Вы действительно хотите файлы, или вы просто хотите правильно оформленную версию страницы?
Я хочу, чтобы файлы, они были бы необходимы для правильной визуализации страницы в любом случае. Если бы у вас их не было, это выглядело бы иначе. Файл> Сохранить как не работает в Firefox. Если вы сделаете это, вы не получите изображения CSS. Попробуйте это на tumblr.com/login . Отсутствует фоновое изображение, отсутствует изображение для полей ввода.
Ни одно из решений wget не сработало для меня. My Tangent Solution - лучший способ сохранить этот вид сохранения сайта. Тем не менее, я видел сбой на очень сложных страницах, таких как apple.com , возможно потому, что многие пути к ресурсам динамически генерируются при выполнении javascript, некоторые не сразу, а во время выполнения ajax.
Лана Миллер

Ответы:

12

wget -p -k http://ExampleSite.com

-P даст вам все необходимые элементы для правильного просмотра сайта (CSS, изображения и т. Д.). -K изменит все ссылки (включая ссылки для CSS и изображений), чтобы вы могли просматривать страницу в автономном режиме, как она появилась в Интернете.

Обновление: это характерно для вашего примера сайта: tumblr.com

wget -H -N -k -p --exclude-domains quantserve.com --no-check-certificate -U "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110613 Firefox/6.0a2" https://www.tumblr.com

Разбивка:

-H = позволяет wget охватить чужой хост. Требуется, поскольку у tumblr нет изображений на главной странице по тому же адресу, они используют secure.assets.tumblr.com, см. Примечание об исключении доменов.

-N = будет захватывать только те файлы, которые новее, чем у вас сейчас, в случае, если вы снова загружаете ту же страницу через какое-то время

-k = конвертировать ваши ссылки для правильного просмотра в автономном режиме

-p = захватывает все необходимые элементы для правильного просмотра (CSS, изображения и т. д.)

--exclude-domains =, поскольку на домашней странице tumblr.com есть ссылка на quantserve.com, и я предполагаю, что вы не хотите этого материала, вам нужно исключить его из загрузки wget. Примечание : это очень важный момент, который вы должны использовать с -H, потому что если вы заходите на сайт и у него есть несколько ссылок на внешние хосты (например, рекламодатели и аналитики), то вы тоже получите этот материал!

--no-check-Certificate требуется, так как Tumblr использует https

-U меняет пользовательский агент. В данном случае это не обязательно, так как он позволяет использовать пользовательский агент wget по умолчанию, но я знаю, что некоторые сайты его блокируют. Я просто добавил это здесь, на случай, если у вас возникнут проблемы на других сайтах. В приведенном мной фрагменте кода он выглядит как Mozilla Firefox 6.02a.

наконец у вас есть сайт: https://www.tumblr.com


источник
1
Я попробовал это, не получил ни JS, ни CSS, ни файлы изображений. А вы?
Если вы используете его в tumblr (ваш пример выше), вам может потребоваться указать --no-check-certificate.
Я думаю, что вы правы, возможно, эта опция нужна. Тем не менее, ничего кроме index.html однако. Чего-то не хватает ...
@LanaMiller Я обновил свой ответ. Дайте мне знать, если есть какие-либо проблемы.
Не могли бы вы сделать что-то вроде -exclude-domains! = Tumblr.com?
alpha1
3

Для конкретного сайта, который вы упомянули, и многих других, закодированных как это, wget (и curl) просто не будет работать. Проблема заключается в том, что некоторые ссылки на ресурсы, необходимые для отображения страницы в браузере, сами создаются с помощью javascript. Wget имеет запрос на функцию в ожидании запуска JavaScript:

http://wget.addictivecode.org/FeatureSpecifications/JavaScript

Однако до тех пор, пока это не будет завершено, сайты, которые создают ссылки на ресурсы с использованием javascript, не будут клонироваться с помощью wget. Самое простое решение - найти инструмент, который на самом деле создает DOM и анализирует javascript как движок браузера (то есть метод firefox, который вы упомянули).

многочлен
источник
1

Вы также можете сделать это автоматически (или программно, если вы делаете кодирование), введя команду через оболочку с помощью wget:

wget --convert-links -r http://www.yourdomain.com

Он загрузит страницу и внутренние файлы и сделает ссылки локальными.

Джурлад Эстрелла
источник
1
Это позволит получить все . Прочитайте вопрос.
Евгений
-1
wget -r http://www.example.com

Я думаю, что хватит всего, но попробую и узнаю.


источник
1
Он получает все, что слишком много. Пока что решение FireFox, которое я нашел, является лучшим рабочим решением. Он получает то, что вам нужно, и ничего больше.
-1

$ ( man wget ):

-п

--page-реквизиты

Эта опция заставляет Wget загружать все файлы, необходимые для правильного отображения заданной HTML-страницы. Это включает в себя такие вещи, как встроенные изображения, звуки и ссылочные таблицы стилей.

Обычно при загрузке одной HTML-страницы любые необходимые документы, которые могут потребоваться для ее правильного отображения, не загружаются. Использование -r вместе с -l может помочь, но поскольку Wget обычно не различает внешние и встроенные документы, обычно оставляют «листовые документы», в которых отсутствуют их реквизиты.

Например, скажем, документ 1.html содержит тег «<IMG>», ссылающийся на 1.gif, и тег «<A>», указывающий на внешний документ 2.html. Скажем, что 2.html похож, но его изображение - 2.gif, и оно ссылается на 3.html. Скажите, что это продолжается до некоторого произвольно большого числа.

Если кто-то выполняет команду:

wget -r -l 2 http: // <site> /1.html

затем будут загружены 1.html, 1.gif, 2.html, 2.gif и 3.html. Как видите, 3.html не имеет необходимого 3.gif, потому что Wget просто считает количество прыжков (до 2) от 1.html, чтобы определить, где остановить рекурсию. Однако с помощью этой команды:

wget -r -l 2 -p http: // <site> /1.html

все вышеуказанные файлы и 3.html 3.gif будут загружены. По аналогии,

wget -r -l 1 -p http: // <site> /1.html

приведет к загрузке 1.html, 1.gif, 2.html и 2.gif. Можно подумать, что:

wget -r -l 0 -p http: // <site> /1.html

скачал бы только 1.html и 1.gif, но, к сожалению, это не так, потому что -l 0 эквивалентно -l inf --- то есть бесконечной рекурсии. Чтобы загрузить одну HTML-страницу (или несколько из них, все указанные в командной строке или во входном файле -i URL-адреса) и ее (или их) реквизиты, просто оставьте off -r и -l:

wget -p http: // <site> /1.html

Обратите внимание, что Wget будет вести себя так, как если бы был указан ключ -r, но будет загружена только эта страница и ее реквизиты. Ссылки с этой страницы на внешние документы переходить не будут. На самом деле, чтобы загрузить одну страницу и все ее реквизиты (даже если они существуют на отдельных веб-сайтах) и убедиться, что партия отображается правильно локально, этот автор любит использовать несколько опций в дополнение к -p:

wget -E -H -k -K -p http: // <site> / <document & gt ;

Чтобы закончить эту тему, стоит знать, что идея Wget о ссылке на внешний документ заключается в любом URL, указанном в теге <A>, теге <AREA> или теге <LINK>, отличном от «< LINK REL = "таблица стилей"> ".

Джеймс Самнерс
источник
2
Какая часть этого, как вы думаете, напоминает решение? Потому что я попытался прочитать содержание справочной страницы, и я не вижу правильного решения здесь. Вы сами пробовали что-нибудь из этого? Как вы думаете, команда, которая решает вопрос конкретно.