Необходимо организовать парсинг новостей с сайтов:
- profile.ru
- ria.ru/lenta
- novorosinform.org
- korrespondent.net
- russtrat.ru
и возможно, в последствии, других.
Скрипт должен быть написан на PHP и работать на виртуальном хостинге
–
timeweb.com/ru/services/h... (принимаются аргументированные возражения),
– на произвольном домене,
– и экспортировать результат свой работы в CSV файл,
– который будет содержать последние 100 распарсенных новостей (статическая цифра, будет зависеть от количества и интенсивности источников, должна быть возможность ее изменить, в коде например),
– файл, имеющий постоянный URL (типа domain.ru/export.csv).
(Далее файл будет импортироваться и обрабатываться средствами некой CMS.)
Требования к CSV-файлу:
– разделитель – | (вертикальная линия),
– заголовки полей с следующем порядке: date, title, text, description, image, tags, source,
– файл должен регулярно обновляться,
– каждая новость в файле должна быть уникальной, не допускается повторения ранее попадавших в файл новостей.
Что должна содержать каждая полученная с сайта-источника новость:
– дату/время публикации в UNIX формате (поле date),
– заголовок новости (поле title),
– полный типографированный текст новости с HTML-разметкой (поле text),* (
www.artlebedev.ru/typogra... – краткое описание новости – подойдёт первое предложение из основного текста (поле description)*,
– URL иллюстрации, которая относится к новости на странице источника, если таковая существует (поле image),
– теги новости через запятую, если таковые существуют (поле tags),
– URL распарсенной новости – ссылка на источник (поле source).
Образец:
89.223.69.131/ * К тексту и к описанию новости в некоторых случаях придется предъявлять дополнительные требования, в зависимости от источника. Так, например, на ria.ru, первым предложением идет "МОСКВА, 16 авг — РИА Новости.", что нужно обязательно исключить из текста и не использовать как первое предложение для краткого описания.
* * *
Весь поток новостей в файле должен быть отсортирован по дате (date) – от старых к последним. Если добавляется пять новых, из файла убираются пять старых новостей. По такому же принципу работает экспорт в любую RSS-ленту – из базы данных выгружаются определенное количество последних новостей, при появлении новых, вытесняются старые.
Примерный алгоритм такой: парсинг происходит каждые полчаса (например). Если парсинг производится в два этапа (сначала проводится парсинг страницы со списком новостей, потом парсинг каждой конечной страницы из полученного списка), логичнее сравнить новые данные, полученные из списка новостей с сохраненным списком предыдущего парсинга, на предмет появления новых статей, чтобы не делать парсинг всех конечных страниц без надобности. Либо проводится сравнение – если такие URL уже есть в базе данных, их парсить не нужно. (Таким образом реализуется проверка, не допускающая повторную загрузку уже загруженных новостей.)
Потом происходит парсинг конечных страниц, по собранному в предыдущем абзаце списку URL. Все собранные данные приводятся к структуре "date, title, text, description, image, tags, source" и помещаются в базу данных. Независимо от того, из какого источника (сайта) были получены данные, они приводятся к единому виду, чтобы потом сформировать единый список новостей в CSV-файле.
В конце каждого (получасового) обновления происходит выгрузка в файл (по условию "если были добавлены новые данные") – из базы данных в файл выгружаются 100 последних новостей отсортированных по дате. Все новости старше 24 часов из базы данных удаляются (данные хранятся сутки, чтобы иметь возможность проанализировать, какие новости уже были загружены).
Это примерная архитектура, для объяснения принципа. Каким образом хранить данные и сравнивать, что уже было загружено с тем что загружено в последний раз – дело исполнителя, будет это база данных MySQL или база данных на основе простых файлов, это кому как нравится, лишь бы правильно работало.