Найдите исполнителя для вашего проекта прямо сейчас!
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.

Задача:

Написать скрипт бота/парсера для обхода заданных сайтов с целью извлечения, парсинга и сохранения в текстовом файле очищенного от 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-теги. Оставляет только содержательный текст из блоков

, ,

  • и т.п., включая «просто текст» не заключенный в теги, а также оставляет тексты якорей ссылок из тега
  • 2. Удаляет любые подобия имен сайтов, даже если они не являются html-линками

    3. Режет текст на абзацы (ASCII CRLF) аналогично тому, как он был разбит в исходном html-коде тегами

    ,
    , ,

  • и т.п. Из каждого текста, находящегося в якоре ссылки также делается отдельный абзац
  • 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. Отрабатывать другие ошибки, появление которых может предположить кодер

    17 лет назад
    Nearbourner
    Гость 
    55 летРоссия
    17 лет в сервисе
    Был
    12 лет назад
    3 отзыва
    • Похожие заказы
    • $5

      Надо подобрать хороший бесплатный движек для сайта с разделами 1. Новости 2. Статьи 3. Каталог фирм с полным описанием Возможность гибкого изменения. В предложениях прошу указывать сколько вариантов можете предложить

      Закрыт
      17 лет назад
    • $50

      Надо доработать галерею www.ma-jes-ty.ru Сделать, чтобы можно было бы прикреплять к каждой статье свои фотографии и они выводились на главную стр, т.е. к каждой статье своя галерея. Отдельно при этом сохранив галерею как отдельный независимый раздел, связанный ...

      Закрыт
      17 лет назад
    • Для сокращения сроков разработки приобрету для переработки скрипты ( исходные тексты и библиотеки) программ сбора бонусов, wmz, wmr, egold, а также базы адресов сайтов спонсоров, оплачивающих бонусы. Особо приветствуются и будут оплачиваться предложения по соответствующим ...

      Закрыт
      17 лет назад
    • Приглашаем к сотрудничеству программиста имеющего наработки и опыт создания движка для для фотостока: онлайновая продажа фотографий с оплатой через платежные системы и по безналу. Ждем предложения по срокам и стоимости выполнения работ по установке ...

      Закрыт
      17 лет назад
    • $1000

      Нужен PHP/SQL и, возможно, VB/.net программист Строится сайт обучения игры в покер. В двух словах концепция такая: игрок подписывается через наш сайт в различные покеррумы, напрямую или через сайт-посредник, мы получаем информацию об определенной активности юзеров ...

      Закрыт
      17 лет назад
    • $50

      Данная система включает в себя: - легкая интеграция под любой дизайн сайта (это строго!), - реализация механизма мгновенной покупки (т.е. клиент получает товар моментально после оплаты), - меню разделов (тематика), - сортировка изображений по тематике, - интеграция "водяного" знака в ...

      Закрыт
      17 лет назад
    • Данная система включает в себя: - легкая интеграция под любой дизайн сайта (это строго!), - регистрация пользователей, - абонентский (7 дней, 14 дней и 30 дней с момента оплаты) платный доступ к файлам организованной системы, - прием абонентской платы ...

      Закрыт
      17 лет назад
    • $100

      1) Необходимо отграбать базу портала с эротическими картинками, например erophoto.ru, eroz.ru очень желательно отграбать именно eroz.ru и встроить все это в мой дизайн (и сделать возможность дограбывание новых фоток, если это возможно!) 2) Сделать стучалку на ...

      Закрыт
      17 лет назад
    • $50

      Есть большой файл с фразами, каждая фраза в одной строке. Необходимо написать скрипт который делает выборки, например ввожу слово “дом” и скрипт собирает все слова по слову дом. База в формате CSV. Так же есть ...

      Закрыт
      17 лет назад