Сохранить полную веб-страницу - PullRequest
3 голосов
/ 12 ноября 2009

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

Конечно, я могу очень легко читать файлы с помощью php с помощью fopen("http://website.com", "r") или fsockopen(), но основная цель - сохранить полные веб-страницы, поэтому в случае их отключения они все еще могут быть доступны другим, например "машина времени программирования":)

Есть ли способ сделать это без чтения и сохранения каждой ссылки на странице?

Решения Objective-C также приветствуются, так как я пытаюсь выяснить и другие.

Спасибо!

Ответы [ 5 ]

16 голосов
/ 12 ноября 2009

Вам действительно нужно проанализировать HTML и все CSS-файлы, на которые есть ссылки, что НЕ легко. Однако быстрый способ сделать это - использовать внешний инструмент, такой как wget. После установки wget вы можете запустить из командной строки wget --no-parent --timestamping --convert-links --page-requisites --no-directories --no-host-directories -erobots=off http://example.com/mypage.html

Это загрузит mypage.html и все связанные CSS-файлы, изображения и изображения, связанные внутри CSS. После установки wget в вашей системе вы можете использовать функцию php system() для программного управления wget .

.

ПРИМЕЧАНИЕ: Вам нужно как минимум wget 1.12 для правильного сохранения изображений, которые являются ссылками через файлы CSS.

3 голосов
/ 12 ноября 2009

Есть ли способ сделать это без чтения и сохранения каждой ссылки на странице?

Краткий ответ: Нет.

Более длинный ответ: если вы хотите сохранить каждую страницу на веб-сайте, вам нужно будет прочитать каждую страницу на веб-сайте с что-то на каком-то уровне.

Вероятно, стоит заглянуть в приложение для Linux wget, которое может делать что-то вроде того, что вы хотите.

Одно слово предупреждения - сайты часто имеют ссылки на другие сайты, которые имеют ссылки на другие сайты и так далее. Убедитесь, что вы поставили в своего паука какое-то условие stop if different domain!

1 голос
/ 12 ноября 2009

Если вы предпочитаете решение Objective-C, вы можете использовать класс WebArchive из Webkit .
Он предоставляет общедоступный API, который позволяет хранить целые веб-страницы в виде файла .webarchive. (Как Safari делает, когда вы сохраняете веб-страницу).

Некоторые приятные особенности формата веб-архива :

  • полностью автономный (включая css, сценарии, изображения)
  • Поддержка QuickLook
  • Легко разложить
0 голосов
/ 12 ноября 2009

Я не уверен, нужно ли вам программное решение для «сканирования веб-сайтов» или лично нужно сохранять веб-сайты для просмотра в автономном режиме, но если это последнее, есть отличное приложение для Windows - Teleport Pro и SiteCrawler для Mac.

0 голосов
/ 12 ноября 2009

Независимо от того, какое приложение выполнит работу (ваш код или код, который вы найдете), он должен будет выполнить именно это: загрузить страницу, проанализировать ее на предмет ссылок на внешние ресурсы и ссылки на другие страницы, а затем загрузить все эти вещи. Вот как работает интернет.

Но вместо того, чтобы выполнять тяжелую работу самостоятельно, почему бы не проверить curl и wget ? Они стандартны для большинства Unix-подобных ОС и делают в точности то, что вы хотите. В этом отношении ваш браузер, вероятно, тоже делает это, по крайней мере, на одной странице (хотя это также будет сложнее запланировать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...