Скрипт php-бота

Web/сайты Прочее

Был(а) онлайн: 26.04.20 14:45
Umen 26 лет

1.0 Был(а) онлайн: 26.04.20 14:45

Недавно
Задача:
Написать скрипт бота/парсера для обхода заданных сайтов с целью извлечения, парсинга и сохранения в текстовом файле очищенного от html-кода контента с этих сайтов

Всеобщие требования:
1. Язык PHP
2. Файл конфигурации и код скрипта обязаны быть поделены (оба в одном каталоге)
3. Скрипт предполагается запускать по крону
4. Скрипту НЕ обязаны передаваться параметры в строке запуска
5. Код должен написан по «правилам классного тона», в том числе иметь внятные имена переменных, не требующих дешифровки, и должен быть ясно откомментирован на русском
6. Итог в логи желанно на инглише
7. Скрипт должен старательно относиться к источникам, не подвисать при глубоком обходе/парсинге огромного портала. Если это обоснованно, то допускается ввести какие-нибудь параметры (обязаны задаваться в конфиге) для неестественного замедления работы, дабы не перегружать процессор хостера

Приблизительный список параметров в файле конфига:
1. Массив сайтов для обхода:
array ({"http://mysite1.ru";, depth1, domainflag1, maxsize1},
{"http://mysite2.ru/dir/";, depth2, domainflag2, maxsize2}, ...)
где depthN – глубина обхода соответствующего урла: 0 – урл пропускается, 1 – обход корня урла, 2 – обход на один ярус по линкам в глубину, и т.д.;
maxsizeN – сберегать чистого контента с этого урла не больше чем maxsize Кб;
domainflagN – обход всех линков подряд либо только в пределах нынешнего домена.
2. Путь к файлу, куда кладется контент: path/data.txt (касательно каталога скрипта)
3. Таймаут освобождения файла path/data.txt, секунд
4. Флаг вывода/невывода короткого лога в браузер
5. Минимальная длина строки в файле итога для парсера
6. Массив стоп-слов: array ("слово1", "слово2", ... )
7. Путь и имя до файла лога (касательно каталога скрипта)
8. Наивысший размер файла лога, Кб

Приблизительный алгорифм:
Бот обходит заданные в массиве конфига сайты/директории в том порядке, в котором они перечислены, и на заданную глубину, с учетом параметра domainflag. Извлекает с пройденных линков каждый html-код и передает его парсеру. Обход должен выполняться от указанного каталога/корня сайта.
После этого парсер примерно в указанном порядке:
1. Удаляет из кода все html-теги. Оставляет только обстоятельный текст из блоков <p>, <h>, <li> и т.п., включая «легко текст» не заключенный в теги, а также оставляет тексты якорей ссылок из тега <a>
2. Удаляет всякие подобия имен сайтов, даже если они не являются html-линками
3. Режет текст на абзацы (ASCII CRLF) подобно тому, как он был разбит в начальном html-коде тегами <p>, <br>, <h>, <li> и т.п. Из всего текста, находящегося в якоре ссылки также делается обособленный абзац
4. Удаляет из текста все слова, перечисленные в массиве стоп-слов в конфиге
5. Заменяет все html-коды типа &quote и т.п. на схожие символы ASCII
6. Удаляет абзацы, состоящие из одной строки, которая короче, чем задано параметром «минимальная длина строки» в конфиге (толк операции – выкинуть все довольно короткие строки, которые с огромный вероятностью были пунктами меню сайта в начальном коде)
7. Если контента набралось теснее огромнее чем maxsize Кб (именно контента, а не html-кода), то прекращаем обработку этого сайта/директории.
8. Делает отбивку в тексте (только пара CRLF) в конце контента очередного сайта из списка обхода (для визуальной идентификации в тексте)
Результат работы парсера: не должно остаться никакого html-кода, только чистый текст. В тексте не должно быть разрезанных посередине слов либо фраз. Скрипт должен идентично трудиться с контентом на любом языке (помимо иероглифических). Желанно минимизировать число проходов парсера по тексту с целью уменьшения нагрузки на процессор.
Дальше скрипт – это ЗНАЧИМО:
1. Пишет итог в файл path/data.NEW (имя файла и относительный путь обязаны быть вытянуты из конфига, после этого к нему добавлено другое растяжение)
2. Проверяет, не занят ли файл path/data.txt иным процессом
3. Если он свободен, то data.txt переименовывается в data.bak, а data.new – в data.txt
4. Если data.txt занят, то он безостановочно проверяется до тех пор, пока не истечет «таймаут освобождения файла», данный в конфиге. Если файл так и не был освобожден, генерится оплошность, сохраняется файл data.new. Если data.new сохранился, то при дальнейшем запуске скрипта он должен удаляться.
Если скрипт будет писать какие-нибудь временные файлы, то он должен позаботиться об уникальности их имен для своей сессии. Теоретически допустима обстановка запуска нескольких таких скриптов единовременно (под различными именами), соответственно, они не обязаны конфликтовать.

Ведение лога:
1. Итог короткого лога в браузер (если установлен флаг в конфиге) по итогам работы в виде:
• пропарсен урл mysite1.ru на глубину depth1, извлечено контента N Кб
либо: пропарсить урл mysite2.ru не удалось, повод такая-то
• каждого извлечено контента NN Кб, благополучно записано в файл data.txt
либо: записать в файл data.txt не удалось, повод такая-то
2. Единовременно в файл пишется подробнейший лог в виде:
• отбивка, дабы сеанс запуска скрипта идентифицироть в логе визуально
• заголовок: парсим урл mysite1.ru, дата, время начала обработки;
• для всякого пройденного линка рекурсивно:
• пропарсен (суб)урл mysite1.ru/link/, извлечено контента N Кб, или
• пропарсить (суб)урл mysite1.ru/link/ не удалось, повод такая-то
• пропарсен урл mysite1.ru, извлечено контента N Кб, затрачено времени NN:NN
• и т.д. по циклу для дальнейшего сайта в массиве
3. Размер файла лога не должен превышать указанный в конфиге, ветхие записи вытесняются по тезису FIFO.

Обработка ошибок:
Скрипт должен:
1. Проверять наличие/возможность записи нужных для работы файлов
2. Проверять вменяемость всех параметров в файле конфига
3. Проверять доступность сайтов/линков, которые собирается обходить бот
4. Правильно браниться на юзера, если им заданы невменяемые параметры. Притом обрабатывать все, что дозволено обработать, а на то, что нереально - указать юзеру с объяснением причин отчего нельзя
5. Отрабатывать другие ошибки, происхождение которых может предположить кодер

Чтобы добавить заявку к этому заказу, нужно войти или зарегистрироваться

Мой блок

26.04.20 14:45
Umen 26