четверг, 3 декабря 2015 г.

Поиск неправильных ссылок на сайтах

   Посещая различные сайты я постоянно сталкиваюсь с тем, что на них встречаются устаревшие ссылки, ведущие на уже несуществующие страницы, либо на страницы, возвращающие различные ошибки, например, "ошибку № 500" (она же Internal Server Error, внутренняя ошибка сервера) - я как раз описывал пример недавно.

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

   Иногда даже приходится сталкиваться с просьбой "проверить быстренько новую версию сайта" - когда заходишь на новую демо версию сайта и через 10 секунд уже идёшь заводить баги.

   После очередного такого запроса я решил написать скрипт, который будет такое "тестирование" делать автоматически и для любого сайта. Посидев пол часа над ним месяца два назад я понял что работать будет, но публиковать код ещё рано. Так и оставил его лежать у себя на рабочей машинке до сегодняшнего дня. Сегодня доработал этот скрипт, и пусть он ещё и не во всём хорош и есть что туда добавить (например, авторизацию) - в остальном он уже работает и может быть применён для "тестирования" сайтов.

   Вот ссылка на скрипт (осторожно, Python): ссылка на github.



Запускается просто:

1. Редактируем server.conf - вписываем сюда данные для конкретного сайта, который надо проверить
2. Запускаем:
 python get404.py

Алгоритм работы тоже простой:
1. Открыть начальную страницу сайта (указанную в конфигурационном файле)
2. Собрать все видимые на странице ссылки, выбрать из них те ссылки, которые содержат ключевое слово (например, имя домена, т.е. проверяем только внутренние ссылки, чтобы скрипт не ушёл парсить весь Интернет)
3. Проверить статус всех дочерних ссылок. Если дочерняя ссылка работает (возвращает код 200 при открытии) то выполнить для неё шаги № 2-3.

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

Скрипт записывает информацию о всех проверенных ссылках и всех ссылках, с которыми обнаружены проблемы (если статус-код отличается от 200 или если страница слишком долго загружается).

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

Что можно улучшить (реквесты принимаются):
1. Проверять страницы в параллельных тредах, сейчас это работает в один поток и занимает достаточно много времени для большого сайта. (уже сделано, но если кто-то знает как ещё ускорить скрипт - пишите)
2. Добавить возможность авторизации, т.к. некоторые веб приложения требуют авторизацию для доступа к страницам.
3. Добавить W3C валидатор для страниц.