Листинг 9.1.Сценарий checklinks
#!/bin/bash
# checklinks — проверяет все внутренние ссылки на веб-сайте, сообщает
#·· о любых ошибках в файле "traverse.errors".
# Удалить по завершении все служебные файлы, созданные программой lynx.
trap "$(which rm) −f traverse.dat traverse2.dat" 0
if [-z "$1"]; then
··echo "Usage: checklinks URL" >&2
··exit 1
fi
baseurl="$(echo $1 | cut −d/ −f3 | sed 's/http: \/\///')"
lynx
−traversal −accept_all_cookies
−realm "$1" > /dev/null
if [-s "traverse.errors"]; then
··/bin/echo −n $(wc −l < traverse.errors) errors encountered.
··echo Checked $(grep '^http' traverse.dat | wc −l) pages at ${1}:
··sed "s|$1 ||g" < traverse.errors
··mv traverse.errors ${baseurl}.errors
··echo "A copy of this output has been saved in ${baseurl}.errors"
else
··/bin/echo −n "No errors encountered.";
··echo Checked $(grep '^http' traverse.dat | wc −l) pages at ${1}
fi
if [-s "reject.dat"]; then
··mv reject.dat ${baseurl}.rejects
fi
exit 0
Основная работа в этом сценарии выполняется программой lynx
; сам сценарий просто играет с файлами, которые создает lynx, извлекая из них информацию и отображая ее в удобочитаемом виде. В выходной файл reject.dat программа lynx записывает ссылки с внешними адресами URL (см. ниже сценарий № 70, который использует этот файл), в файл traverse.errors — недействительные ссылки (цель данного сценария), в файл traverse.dat — список всех проверенных страниц, и в файл traverse2.dat — тот же список страниц, что и в файл traverse.dat , но с дополнительно включенными заголовками всех исследованных страниц.
Команда lynx поддерживает большое количество разных аргументов, и в данном случае нам потребовалось использовать −accept_all_cookies
, чтобы программа не замучила нас вопросами — принимать или нет cookie от страницы. Мы также использовали аргумент −realm, чтобы проверке подвергались только страницы указанного уровня на сайте и «ниже», а не все ссылки, которые будут встречены на пути. Без аргумента −realm программа lynx могла бы отыскать тысячи и тысячи страниц. Мы попробовали выполнить функцию −traversal для адреса http://www.intuitive.com/wicked/без −realm, и она обнаружила более 6500 страниц после более чем двухчасовой работы. С фла −r— realm было найдено 146 страниц, на исследование которых ушло несколько минут.
Чтобы запустить сценарий, просто передайте ему адрес URL в командной строке. Сценарий способен выполнить анализ любого веб-сайта, но имейте в виду: проверка таких гигантов, как Google или Yahoo! может затянуться навечно и закончиться исчерпанием места на вашем диске.
Давайте проверим маленький веб-сайт на наличие ошибок (листинг 9.2).
Листинг 9.2.Проверка веб-сайта, не имеющего ошибок, с помощью checklinks
$ checklinks http://www.404-error-page.com/
No errors encountered. Checked 1 pages at http://www.404-error-page.com/
Как видите, все в порядке. А если проверить сайт немного большего размера? В листинге 9.3 показано, что мог бы вывести сценарий checklinks в результате проверки сайта, содержащего недействительные ссылки.
Листинг 9.3.Проверка недействительных ссылок с помощью checklinks на более крупном веб-сайте
$ checklinks http://www.intuitive.com/library/
5 errors encountered. Checked 62 pages at http://intuitive.com/library/:
·· index/·· in BeingEarnest.shtml
·· Archive/f8·· in Archive/ArtofWriting.html
·· Archive/f11··in Archive/ArtofWriting.html
·· Archive/f16··in Archive/ArtofWriting.html
·· Archive/f18··in Archive/ArtofWriting.html
A copy of this output has been saved in intuitive.com.errors
Как показывают результаты, файл BeingEarnest.shtml содержит недействительную ссылку на /index/ , потому что нет такого файла /index/ . Также в файле ArtofWriting.html найдено четыре недействительные ссылки, имеющие странный вид.
Наконец, в листинге 9.4 показаны результаты проверки блога Дейва с обзорами фильмов, которая выявила в нем скрытые ошибки.
Листинг 9.4.Запуск сценария checklinks под управлением утилиты time, чтобы узнать продолжительность его работы
$ time checklinks http://www.daveonfilm.com/
No errors encountered. Checked 982 pages at http://www.daveonfilm.com/
real 50m15.069s
user 0m42.324s
sys 0m6.801s
Обратите внимание: добавив команду time перед другой командой, выполняющейся длительное время, можно узнать, как долго она выполнялась. В данном случае видно, что проверка всех 982 страниц в блоге http://www.daveonfilm.com/потребовала 50 минут реального времени, из которых фактическая обработка заняла 42 секунды. Это очень много!
Читать дальше