Как скачать и восстановить сайт из вебархива?



Наткнулся  на битую ссылку.   Ссылка была на мануал по настройке бэкапов для сайта.  Тема интересовала настолько, что полез в archive.org смотреть, что там за мануал такой.  Там обнаружил блог человека, который когда-то занимался  сайтостроительством, какими-то темами в интернете. Но видимо бросил всё это. Блог существовал до декабря 2013 года, потом еще год висела заглушка.  Я возьми да и проверь домен сайта. Он оказался свободным.  Дело в том, что меня интересовали подобные сайты давно, я время от времени захожу на telderi и присматриваю себе недорогой сайт IT-тематики для покупки. Пока ничего подходящего по цене/качеству не подобрал.

Зачем мне нужен такой сайт? Я вынашиваю план сделать что-то вроде слияния или поглощения.  Соединить такой сайт, с вот этим. Чтобы увеличить на нем трафик  и прочие ништяки.  Кто-то скажет — а как же диверсификация? Безусловно, диверсификация — дело хорошее. Но тут ещё диверсифицировать пока нечего, нужно сначала что-нибудь развить. И вот, видится мне идея слияния сайтов очень перспективной.

Итак, это всё предыстория. Задумал я найденный сайт восстановить.  Оказалось на нём около 300  страниц.  Зарегистрировал домен и принялся разыскивать инструмент для выкачивания сайта.








Чем восстановить сайт из веб архива?

Процедура-то нехитрая. Бери и качай.  Но дело осложняется тем, что страниц много, и все они будут в виде статических html-файлов.   Вручную качать замучаешься. Стал спрашивать у людей, которые таким делом занимались. Люди посоветовали r-tools.org. Он оказался платным. Стал гуглить, поскольку я-то знаю,  что это простая процедура, и платить за нее не хотелось, пусть и такую небольшую плату. Решение нашлось очень быстро в виде   приложения на ruby.  Как я и предполагал, всё очень просто, инструкция прилагается.

Устанавливаем утилиту для восстановления сайтов из archive.org

Недолго думая, устанавливаю всё на сервер и запускаю восстановление.

#устанавливаем руби:

apt-get install ruby

#Ставим сам инструмент:

gem install wayback_machine_downloader

Запускаем выкачивание сайта из веб архива

skachivanie-saita-iz-web-arhiva

wayback_machine_downloader http://www.site.ru --timestamp 20131209110704

 

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

Все скачивается и  сохраняется, получаем россыпь статических файлов в папке.  Создаем у себя папку в нужном месте, и кладем туда выкачанные файлы.  Я люблю использовать rsync:

rsync -avh ./websites/www.site.com/  /var/www/site.com/

Остается только создать конфигурацию в nginx, дождаться обновления dns.

 

Предлагаю!
Если вы не хотите вдаваться в подробности и вам просто нужно восстановить сайт с чисткой кода, заменой или установкой счётчиков или баннеров, рекламных кодов, у меня есть для вас предложение.
Восстановить сайт из вебархива всего за 500 рублей:

Ну а для тех, кто хочет много букв с непонятными командами и скриптами, разобраться и делать самостоятельно — продолжаем.

Создание конфигурации nginx для восстановленного сайта

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

А вообще, минимальная конфигурация для статического сайта будет выглядеть примерно так:

config-nginx-static-site


server {
server_name site.ru www.site.ru *.site.ru;
root /var/www/site.ru;
index index.html;

gzip on;
gzip_disable «msie6»;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
expires max;
log_not_found off;
}
}

Эта конфигурация заодно включает в себя настройки оптимизации для  Google Pagespeed — сжатие и кэширование в браузере.

Перезапускаем вебсервер:

service nginx restart

Как проверить сайт без смены DNS?

В принципе можно ждать обновления  dns после регистрации домена. Но хочется поскорее увидеть результат. Да и работу можно сразу начать.   Для этого есть нехитрый способ — записать IP сервера для нужного домена в файл hosts, запись такого вида:

10.10.1.1  site.ru

После этого нужный сайт станет открываться исключительно у вас на компьютере.

vosstanovlenniy-sait-iz-archiva

Вот так. Чувствую себя некромантом :)

site-necromancy

 

Сайт будет показываться ровно так, как видели его пользователи.  Все ссылки будут работать, поскольку у вас есть все нужные файлы.  Возможно какие-то из них будут битыми, где-то будет не хватать изображений, стилей или чего-нибудь ещё.  Но это не суть важно — ведь самое главное для любого сайта — контент.   А он, скорее всего,  сохранится.

Очистка кода восстановленного сайта

Но это ещё не всё.  Хотя можно и оставить в таком виде.   Но чтобы добиться лучшего эффекта, есть смысл немного причесать восстановленный сайт.   Это вообще самая сложная часть во всей этой затее.   Дело в том, что раз сайт будет показываться так, как видели его пользователи, в коде страниц будет куча всевозможного мусора.  Это в первую очередь  реклама, баннеры  и счётчики.  Также какие-то элементы, которые на статическом сайте ни к чему. К примеру, ссылка для входа в админку сайта. Формы для отправки комментариев, подписки, какие-нибудь  кнопки и другие элементы, доставшиеся в наследство от динамической CMS, на которой сайт работал раньше.  В моём случае это был WordPress.

Как удалить фрагменты html кода на множестве статических страниц?

Как же это всё можно убрать?  Очень просто.  Смотреть в коде — и просто удалять ненужное.  Легко сказать.  Но страниц у нас несколько сотен.  Поэтому тут нужна магия.

Удаляем сквозные элементы в коде статического сайта

Удаляем сквозные элементы в коде статического сайта

Вот так я убираю ссылку «Вход» на всех html-файлах в указанной папке:

find ./site.ru/ -type f -name '*.html' -exec sed -i 's|<p id="top_info"> <a href="http://www.site.ru/wp-login.php">Вход</a></p>||g'
{} \;

Вот такой конструкцией можно убрать ВСЕ html-теги из файла. Самое простое.  У вас тогда получатся текстовые файлы

sed -e 's/<[^>]*>//g'  test.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/{x;d;};1h;1!{x;p;};${x;p;}' {} \;

Теперь вырезаем остальную часть, которую становится легко идентифицировать по уникальным  паттернам в первой и последней строках:

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/{N;N;N;N;s/\n.*//;}' {} \;

А теперь вырезаю довольно большой блок строк на 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 у нас невнятный — сам домен сайта.   Самый простой вариант  выпилить первую часть тайтла.  Но это мне тоже не  годится.  Поэтому я поменяю эту часть тайтла на хитрый запрос. Вот так я это делаю:

zamena-taitlov-na-statichescom-saite

Как видите, множество проверок и итераций.  Но в итоге, тайтлы становятся такими, какими нужно.  Можно догадаться, что я затеял попытку собирать на этот сайт трафик по запросам о восстановлении сайтов из веб архива. Зачем мне это нужно — я собираюсь оказывать платную услугу по восстановлению таких сайтов.    Как видите, в данном случае довольно просто сделать замену. Можно было не заморачиваться несколькими вариантами, а подвести всё под один. Но мне захотелось убрать или поменять лишние символы, а раз уж вариантов оказалось несколько, то я и поменял их на несколько своих.  Такое вот  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 {
server_name www.site.ru;
return 301 $scheme://site.ru$request_uri;
}

Как создать карту сайта 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’ -exec sed -i ‘/<\/body>/i \
<script type=»text\/javascript» src=»\/metrika.js»><\/script>’ {} \;

Теперь проверяю, везде ли установилось:

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="\/metrika.js"><\/script>' {} \;

Проверяю снова:

find theredhaired.ru/ -type f -iname '*.html'|xargs grep 'metrika.js'|wc -l
266

Ну вот, 266 из 290 это уже лучше :)  Там оказалось еще что 30 страниц не попали под какой-то из скриптов из-за кривых имен с вопросительными знаками.    Я думаю мне достаточно и тех что есть :)

Что дальше?

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

Вот что получилось после очистки и правки страницы под свои нужды

Вот что получилось после очистки и правки страницы под свои нужды

Кроме того, через некоторое время я проведу анализ результатов, которых я достиг с этим сайтом.  Трафик,  лиды или что-то ещё.   Так что, следите за обновлениями на сайте, через 2-6 месяцев вы увидите продолжение истории. Покажу стату, если таковая будет и т. д. Если вы читаете эту статью спустя полгода, а ссылки на продолжение до сих пор нет — напомните мне об этом в комментариях, пожалуйста :)

Разобрались, не?

Если вы прониклись, во всём разобрались и собираетесь делать самостоятельно — низкий вам поклон и уважуха. Мне нравятся люди, которые хотят во всём разобраться и постичь.

Если же вы кроме хаоса в мыслях ничего не испытываете после прочтения, а решить задачу надо,  я отношусь со столь же большим уважением к тем, кто умеет находить профессионалов и просто делегировать свои задачи  :)

Позвольте мне стать богаче на 500 рублей от решения вашей задачи :)

 

 

Комментариев

  1. артем :

    Ответить

    • drmotor :

  2. артем :

    Ответить

    • drmotor :

  3. артем :

    Ответить

    • drmotor :

  4. артем :

    Ответить

  5. света :

    Ответить

    • drmotor :

  6. Иван :

    Ответить

  7. Иван :

    Ответить

    • drmotor :

  8. артем :

    Ответить

    • drmotor :

  9. Виктор :

    Ответить

  10. drmotor :

    Ответить

  11. seoonly.ru :

    Ответить

  12. Ответить

    • drmotor :

  13. Ответить

    • drmotor :

  14. Ответить

    • drmotor :

  15. Олег :

    Ответить

    • drmotor :

  16. артем :

    Ответить

    • drmotor :

  17. Джагер :

    Ответить

    • drmotor :

  18. Джагер :

    Ответить

  19. Джагер :

    Ответить

    • drmotor :

  20. Джагер :

    Ответить

    • drmotor :

  21. Джагер :

    Ответить

  22. Джагер :

    Ответить

  23. Александр :

    Ответить

  24. Михаил :

    Ответить

  25. feuer81 :

    Ответить

    • drmotor :

  26. Джагер :

    Ответить

    • drmotor :

  27. Джагер :

    Ответить

  28. Джагер :

    Ответить

    • drmotor :

  29. Джагер :

    Ответить

  30. Джагер :

    Ответить

  31. Джагер :

    Ответить

    • drmotor :

  32. Джагер :

    Ответить

  33. Джагер :

    Ответить

    • drmotor :

  34. Джагер :

    Ответить

  35. Артур :

    Ответить

  36. артем :

    Ответить

    • drmotor :

  37. замир :

    Ответить

    • drmotor :

  38. Александр :

    Ответить

    • drmotor :

  39. Надежда :

    Ответить

    • drmotor :

    • Надежда :

    • drmotor :

  40. Пётр :

    Ответить

    • drmotor :

  41. Надежда :

    Ответить

  42. Джагер :

    Ответить

    • drmotor :

  43. Влад :

    Ответить

  44. Влад :

    Ответить

  45. Yuriy :

    Ответить

    • drmotor :

  46. Сергей :

    Ответить

    • drmotor :

  47. Ответить

  48. Ответить

    • drmotor :

  49. Роман :

    Ответить

    • drmotor :

  50. Дмитрий :

    Ответить

    • drmotor :

  51. Дмитрий :

    Ответить

    • drmotor :

  52. bbl-com-ua :

    Ответить

  53. Ответить

  54. Ответить

  55. Caramelcev :

    Ответить

  56. Ирина :

    Ответить

  57. Николай :

    Ответить

  58. Олег :

    Ответить

  59. Илья :

    Ответить

    • drmotor :

  60. Ответить

  61. Андрей :

    Ответить

    • drmotor :

  62. Ответить

  63. Юрий :

    Ответить

  64. Ответить

Сохраните для друзей или чтобы прочесть в другой раз:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *