Я столкнулся с проблемой во время работы над проектом. Я хочу «сканировать» определенные интересующие сайты и сохранять их как «полную веб-страницу», включая стили и изображения, чтобы создать для них зеркало. Мне приходилось несколько раз добавлять закладки на сайт, чтобы прочитать его позже, и через несколько дней сайт был недоступен, потому что он был взломан, и у владельца не было резервной копии базы данных.
Конечно, я могу читать файлы с php очень легко с помощью fopen("http://website.com", "r")
или fsockopen()
но главная цель – сохранить полные веб-страницы, чтобы в случае их снижения , он все равно может быть доступен другим, например, «машиной времени программирования» 🙂
Есть ли способ сделать это без чтения и сохранения каждой ссылки на странице?
Решения Objective-C также приветствуются, так как я также пытаюсь выяснить его.
Благодаря!
Вам действительно нужно разобрать 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 в вашей системе вы можете использовать функцию system()
php для управления программным способом wget .
ПРИМЕЧАНИЕ. Для правильного сохранения изображений, которые являются ссылками через файлы css, вам нужно как минимум wget 1.12.
Есть ли способ сделать это без чтения и сохранения каждой ссылки на странице?
Краткий ответ: Нет.
Более длинный ответ: если вы хотите сохранить каждую страницу на веб-сайте, вам придется читать каждую страницу на веб-сайте с чем-то на каком-то уровне.
Вероятно, стоит посмотреть на приложение wget
Linux, которое может сделать что-то вроде того, что вы хотите.
Одно слово предупреждения – сайты часто имеют ссылки на другие сайты, которые имеют ссылки на другие сайты и так далее. Убедитесь, что вы положили какую-то stop if different domain
в вашем пауке находится stop if different domain
состояние stop if different domain
!
Если вы предпочитаете решение Objective-C, вы можете использовать класс WebArchive из Webkit .
Он предоставляет публичный API, который позволяет хранить целые веб-страницы в виде файла .webarchive. (Как Safari, когда вы сохраняете веб-страницу).
Некоторые интересные особенности формата webarchive :
Независимо от того, какое приложение будет выполнять работу (ваш код или код, который вы найдете), нужно будет сделать именно это: загрузите страницу, проанализируйте ее для ссылок на внешние ресурсы и ссылки на другие страницы, а затем загрузите все это вещи. Так работает Интернет.
Но вместо того, чтобы делать тяжелый подъем, почему бы не проверить локон и wget ? Они являются стандартными для большинства Unix-подобных ОС, и делают практически то, что вы хотите. В этом случае ваш браузер, вероятно, тоже работает, по крайней мере, на одной странице (хотя было бы труднее запланировать это).
Я не уверен, что вам нужно программное решение для «обхода веб-сайтов» или лично для сохранения веб-сайтов для автономного просмотра, но если это последнее, есть отличное приложение для Windows – Teleport Pro и SiteCrawler для Mac.