Как скачать и восстановить сайт из вебархива?
Наткнулся на битую ссылку. Ссылка была на мануал по настройке бэкапов для сайта. Тема интересовала настолько, что полез в archive.org смотреть, что там за мануал такой. Там обнаружил блог человека, который когда-то занимался сайтостроительством, какими-то темами в интернете. Но видимо бросил всё это. Блог существовал до декабря 2013 года, потом еще год висела заглушка. Я возьми да и проверь домен сайта. Он оказался свободным. Дело в том, что меня интересовали подобные сайты давно, я время от времени захожу на telderi и присматриваю себе недорогой сайт IT-тематики для покупки. Пока ничего подходящего по цене/качеству не подобрал.
Зачем мне нужен такой сайт? Я вынашиваю план сделать что-то вроде слияния или поглощения. Соединить такой сайт, с вот этим. Чтобы увеличить на нем трафик и прочие ништяки. Кто-то скажет — а как же диверсификация? Безусловно, диверсификация — дело хорошее. Но тут ещё диверсифицировать пока нечего, нужно сначала что-нибудь развить. И вот, видится мне идея слияния сайтов очень перспективной.
Итак, это всё предыстория. Задумал я найденный сайт восстановить. Оказалось на нём около 300 страниц. Зарегистрировал домен и принялся разыскивать инструмент для выкачивания сайта.
Чем восстановить сайт из веб архива?
Процедура-то нехитрая. Бери и качай. Но дело осложняется тем, что страниц много, и все они будут в виде статических html-файлов. Вручную качать замучаешься. Стал спрашивать у людей, которые таким делом занимались. Люди посоветовали r-tools.org. Он оказался платным. Стал гуглить, поскольку я-то знаю, что это простая процедура, и платить за нее не хотелось, пусть и такую небольшую плату. Решение нашлось очень быстро в виде приложения на ruby. Как я и предполагал, всё очень просто, инструкция прилагается.
Устанавливаем утилиту для восстановления сайтов из archive.orgНедолго думая, устанавливаю всё на сервер и запускаю восстановление.
apt-get install ruby
#Ставим сам инструмент:
gem install wayback_machine_downloader
Запускаем выкачивание сайта из веб архиваwayback_machine_downloader http://www.site.ru --timestamp 20131209110704
Здесь в опции timestamp можно указывать отметку снапшота. Поскольку сайт может иметь десятки или сотни снимков в веб-архиве. Я указываю последний, когда сайт был еще жив, логично. Утилита сразу же определяет количество страниц и выводит на консоль выкачиваемые страницы.
Все скачивается и сохраняется, получаем россыпь статических файлов в папке. Создаем у себя папку в нужном месте, и кладем туда выкачанные файлы. Я люблю использовать rsync:
rsync -avh ./websites/www.site.com/ /var/www/site.com/
Остается только создать конфигурацию в nginx, дождаться обновления dns.
Я принимаю заявки по контактам на vpsadm.ru и наживаюсь на решении ваших проблем с сайтами и серверами :) . А ещё предлагаю воспользоваться новой интересной фриланс-платформой Kwork.
Если вы с ней ещё не знакомы — рекомендую. Это биржа от компании Мирафокс, которую вы возможно уже знаете по другим проектам для вебмастеров (Telderi, Miralinks, Gogetlinks). На Kwork не фрилансеры побираются по размещенным потенциальным заказчиком предложениям, а сами выставляют предложения, которые заказчик может выбрать. «Фишка» сервиса — базовая стоимость любого кворка (так называют предложения фрилансеров) всегда 500 рублей.
Мой кворк, всего за 500 рублей я восстановлю вам сайт :)
Ну а для тех, кто хочет много букв с непонятными командами и скриптами, разобраться и делать самостоятельно — продолжаем.
Создание конфигурации nginx для восстановленного сайтаЯ делаю универсальный конфиг, с прицелом на будущее — обработку php. Возможно понадобится, если захочется оживить сайт и доработать фунционал, например формы отправки сообщений, подписки.
А вообще, минимальная конфигурация для статического сайта будет выглядеть примерно так:
server
Эта конфигурация заодно включает в себя настройки оптимизации для Google Pagespeed — сжатие и кэширование в браузере.
service nginx restart
Как проверить сайт без смены DNS?
В принципе можно ждать обновления dns после регистрации домена. Но хочется поскорее увидеть результат. Да и работу можно сразу начать. Для этого есть нехитрый способ — записать IP сервера для нужного домена в файл hosts, запись такого вида:
После этого нужный сайт станет открываться исключительно у вас на компьютере.
Вот так. Чувствую себя некромантом :)
Сайт будет показываться ровно так, как видели его пользователи. Все ссылки будут работать, поскольку у вас есть все нужные файлы. Возможно какие-то из них будут битыми, где-то будет не хватать изображений, стилей или чего-нибудь ещё. Но это не суть важно — ведь самое главное для любого сайта — контент. А он, скорее всего, сохранится.
Очистка кода восстановленного сайта
Но это ещё не всё. Хотя можно и оставить в таком виде. Но чтобы добиться лучшего эффекта, есть смысл немного причесать восстановленный сайт. Это вообще самая сложная часть во всей этой затее. Дело в том, что раз сайт будет показываться так, как видели его пользователи, в коде страниц будет куча всевозможного мусора. Это в первую очередь реклама, баннеры и счётчики. Также какие-то элементы, которые на статическом сайте ни к чему. К примеру, ссылка для входа в админку сайта. Формы для отправки комментариев, подписки, какие-нибудь кнопки и другие элементы, доставшиеся в наследство от динамической CMS, на которой сайт работал раньше. В моём случае это был WordPress.
Как удалить фрагменты html кода на множестве статических страниц?Как же это всё можно убрать? Очень просто. Смотреть в коде — и просто удалять ненужное. Легко сказать. Но страниц у нас несколько сотен. Поэтому тут нужна магия.
Удаляем сквозные элементы в коде статического сайта
Вот так я убираю ссылку «Вход» на всех html-файлах в указанной папке:
find ./site.ru/ -type f -name '*.html' -exec sed -i 's|<p > <a href="http://www.site.ru/wp-login.php">Вход</a></p>||g' \;
Вот такой конструкцией можно убрать ВСЕ html-теги из файла. Самое простое. У вас тогда получатся текстовые файлы
Нормальный подход, если вы просто качаете контент и потом будете использовать только полезное содержимое для чего-либо другого — для написания новых статей, для дорвеев, или чего-то ещё.
Но мне это не подходит, я хочу сначала воссоздать сайт полностью и посмотреть как он будет оживать и будет ли вообще. Поэтому работа по очистке кода занимает у меня пару часов кропотливой работы. Я открываю страницы сайта, отладчиком смотрю исходный код страниц, нахожу ненужные мне javascript, баннеры, счетчики, формы.
Вот так я убираю счетчик Liveinternet cо всех страниц моего статического сайта:
find site.ru/ -type f -name '*.html' -exec sed -i '/<!--LiveInternet counter-->/,/<!--\/LiveInternet-->/d' \;
Вот так убираю подключение рекламного баннера:
find site.ru/ -type f -name '*.html' -exec sed -i 's|<link type="text/css" rel="stylesheet" href="http://mixmarket.biz/uni/partner.css">||g' \;
Несмотря на конструкции, которые несведущему человеку могут показаться страшными — это довольно простые вещи, поскольку в этом счетчике есть уникальные теги-комментарии, по которым мы определяем часть кода для удаления, указав их в качестве паттернов.
В некоторых случаях приходится поломать голову, чтобы вырезать лишнее и не задеть нужное, ведь некоторые элементы могут повторяться на страницах. Например, для удаления счетчика Google Analytics пришлось сочинять вот такое:
Сначала удаляю строку <script type=»text/javascript»> с которой начинается счетчик. Эта команда удаляет строку над паттерном var gaJsHost, поскольку мне нужно удалить её только в этом месте и не трогать нигде больше:
find site.ru/ -type f -name '*.html' -exec sed -i -n '/var gaJsHost/;1h;1!;$' \;
Теперь вырезаем остальную часть, которую становится легко идентифицировать по уникальным паттернам в первой и последней строках:
find site.ru/ -type f -name '*.html' -exec sed -i '/var gaJsHost/,/catch(err)/d' \;
Аналогичным образом я убираю форму добавления комментариев:
Зачищаю 4 строки с неуникальными закрывающими тегами после строки с уникальным паттерном:
find theredhaired.ru/ -type f -iname '*.html' -exec sed -i '/block_links/' \;
А теперь вырезаю довольно большой блок строк на 30, указав уникальные паттерны его первой строки и последней:
find theredhaired.ru/ -type f -iname '*.html' -exec sed -i '/<h2> Подписка/,/block_links/d' \;
Вот эти последние пару случаев можно конечно попытаться выпилить с помощью мультистрочных паттернов, но я их так и не осилил, сколько не гуглил. Примеров с multi-line находил много, но они все простые, где нету спецсимоволов, escape-символов (табы, переводы строки).
Удаляем счётчики, баннеры и формы с восстановленного сайта
Возможно всю эту очистку будет проще сделать на php или даже perl, для которого обработка текста это предназначение. Но я, к сожалению, оными не владею, поэтому использую bash и sed.
Всё это я проделывал на отдельной копии сайта с кучей итераций, тестов, чтобы всегда была возможность откатить изменения я сохранял копии после каждого значительного изменения, опять же с помощью rsync.
Как массово редактировать тайтлы и другие элементы на статическом сайте?
Поскольку моя задача не просто воскресить сайт, а добиться его индексации, ранжирования в поиске и даже получения трафика из поиска — мне нужно подумать о каком-никаком SEO. Оригинальные тайтлы мне однозначно не подходят, поэтому я хочу их изменить. В наследие от WordPress досталась схема %sitename% » %postname%. Тем более sitename у нас невнятный — сам домен сайта. Самый простой вариант выпилить первую часть тайтла. Но это мне тоже не годится. Поэтому я поменяю эту часть тайтла на хитрый запрос. Вот так я это делаю:
Как видите, множество проверок и итераций. Но в итоге, тайтлы становятся такими, какими нужно. Можно догадаться, что я затеял попытку собирать на этот сайт трафик по запросам о восстановлении сайтов из веб архива. Зачем мне это нужно — я собираюсь оказывать платную услугу по восстановлению таких сайтов. Как видите, в данном случае довольно просто сделать замену. Можно было не заморачиваться несколькими вариантами, а подвести всё под один. Но мне захотелось убрать или поменять лишние символы, а раз уж вариантов оказалось несколько, то я и поменял их на несколько своих. Такое вот SEO.
Теперь я собираюсь добавить Яндекс Метрику во все html-файлы моего сайта. А заодно перевести его со старой схемы www на без www.
Как перевести статический сайт с www на без www?
Это делается простой заменой:
find ./ -type f -iname ‘*.html’ -exec sed -i ‘s/http:\/\/www.site.ru/http:\/\/site.ru/g’ \;
После чего на всякий случай в конфигурации nginx вынесем вариант с www в редирект:
server
Как создать карту сайта sitemap.xml для статического сайта?
Это понадобится, когда мы будем добавлять сайт в поисковые системы. Это очень важно, учитывая что наш сайт восстановленный, на нем возможно отстутствует какая-нибудь навигация, и на какие-то страницы вообще не будет ссылок. Карта сайта этот момент сглаживает — даже если переходом по самому сайту на страницу попасть нельзя — мы указав ее в sitemap.xml позволим её проиндексировать, что потенциально может привести трафик из поиска прямо на страницу.
Генерирую карту с помощью сервиса, который создаёт её из списка страниц. Как получить такой список? Всё оттуда же, из консоли:
find site.ru/ -type f -iname ‘*.html’|grep -v ‘site.ru/go\|wp-login\|wp-admin’|less
На выходе получаю чистенький список страниц и сразу же скармливаю его в сервис. Я тут при генерации списка исключил кое-какой мусор. go — это бывшие внешние ссылки ну и страницы админки, которые у нас всё равно закрыты в robots.txt.
Как установить счётчик на все страницы статического сайта?
Последний штрих. Я ведь собираюсь отслеживать свои успехи. Поэтому мне нужно обязательно добавить какой-нибудь счётчик. Я ставлю на свои сайты обычно и Google аналитику и метрику яндекса. Но работаю больше с метрикой, analytics пользуюсь изредка для специфичных вещей. Здесь же мне счетчик гугла вообще не понадобится, по крайней мере первое время.
Итак, чтобы добавить во все страницы счётчик метрики, я воспользовался способом с выносом кода счётчика в отдельный js-файл. Просто потому, что так будет проще добавить потом код его вызова на все страницы. Создал счётчик, и записал его код в metrika.js
Теперь добавляю строку с его вызовом на все страницы перед закрывающим тегом body:
Теперь проверяю, везде ли установилось:
find site.ru/ -type f -iname ‘*.html’|xargs grep ‘metrika.js’|wc -l 173
И получаю неприятный сюрприз — установлено не везде. Около сотни страниц упущено. Это могло произойти только в том случае, если в каких то файлах нету тега </body>. Смотрим:
find site.ru/ -type f -iname ‘*.html’|xargs grep -L ‘</body>’|wc -l 119
Как раз в 119 файлах этого тега нету. Это совсем плохо, видимо на каком то из этапов по очистке что-то пошло не так, и был срублен этот тег. Можно конечно выяснить когда это случилось и откатиться до того момента, но это куча работы. Поэтому я просто добавлю в эти файлы недостающие теги, и потом таки добавлю счётчик.
find site.ru/ -type f -iname '*.html'|xargs grep -L '</body>'|xargs sed -i '$ i\ > <\/body><\/html>'
Я делаю это одной строкой, чтобы указать паттерном именно теги в паре. Иначе, если я воспользуюсь для добавления счётчика той же командой, что я уже сделал — то я продублирую вызов счётчика там, где он уже есть. Чтобы этого избежать можно конечно удалить строку там где она есть и потом добавить её снова, но я просто укажу спаренный тег в виде паттерна и добавлю только в те файлы. Вот так:
find site.ru/ -type f -iname '*.html' -exec sed -i '/<\/body><\/html>/i \ > <script type="text\/javascript" src="https://metrika.js/"><\/script>' \;
find theredhaired.ru/ -type f -iname '*.html'|xargs grep 'metrika.js'|wc -l 266
Ну вот, 266 из 290 это уже лучше :) Там оказалось еще что 30 страниц не попали под какой-то из скриптов из-за кривых имен с вопросительными знаками. Я думаю мне достаточно и тех что есть :)
Дальше мне пришла в голову мысль заточить имеющуюся на сайте страницу об услугах под предложение восстановления сайтов из веб архива.
Вот что получилось после очистки и правки страницы под свои нужды
Кроме того, через некоторое время я проведу анализ результатов, которых я достиг с этим сайтом. Трафик, лиды или что-то ещё. Так что, следите за обновлениями на сайте, через 2-6 месяцев вы увидите продолжение истории. Покажу стату, если таковая будет и т. д. Если вы читаете эту статью спустя полгода, а ссылки на продолжение до сих пор нет — напомните мне об этом в комментариях, пожалуйста :)
Если вы прониклись, во всём разобрались и собираетесь делать самостоятельно — низкий вам поклон и уважуха. Мне нравятся люди, которые хотят во всём разобраться и постичь.
Если же вы кроме хаоса в мыслях ничего не испытываете после прочтения, а решить задачу надо, я отношусь со столь же большим уважением к тем, кто умеет находить профессионалов и просто делегировать свои задачи :)