Пишем граббер на PHP

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

Так что эта небольшая статья — как раз пример написания граббера на языке PHP.

Задача состоит, собственно, из 3 этапов.

1. Получение данных с нужного нам URL

Для этого в PHP существует несколько возможностей:

Стандартная функция fopen, служащая для открытия файла

Применять ее не очень удобно, так как нельзя контролировать время соединения, получать ответы ошибок сервера и т.д. Кроме того, она может быть запрещена на хостинге через http. Тем не менее, вот пример откуда-то. Здесь мы парсим выдачу популярного сайта bash.org:

Популярный вариант этого же подхода еще проще —

или же

 

(по сути, file_get_contents — это fopen, fread, fclose одной командой)

Библиотека cURL

Удобнее, но также может быть не установлена или запрещена на хостинге.

Соединение через сокеты

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

Следующая функция получает содержимое, расположенное на хосте $host по абслютному пути $path. Имя хоста не включает в себя префиксов http://www, путь начинается с символа корневого каталога /.

 

2. Извлечение содержимого из страницы

На следующем этапе мы должны извлечь из кода страницы, полученного функцией get_URL_by_socket, полезную для нас часть. Для этой цели в PHP существют регулярные выражения (ссылка на статью внизу страницы) и строковые функции. Я для простоты взял здесь случай, когда мы можем выделить в коде страницы куски текста, однозначно ограничивающие нужную нам часть снизу ($end) и сверху ($start). В принципе, при внимательном анализе исходного кода любой страницы (в браузере обратитесь к меню Вид, пункту «Исходный текст» или «Источник») легко выделить такие куски. Так как мы будем писать их внутрь строковых переменных, ограниченных двойными кавычками, то если в тексте строки встречается двойная кавычка «, ее нужно заменить на сочетание символов \», как здесь:

Всю информацию будет обрабатывать следующая функция:

 

Параметр $include должен быть равен true, если строки $start и $end надо оставить в выводе или false, если их надо исключить.

3. Дополнительная обработка и вывод

Строку, возвращенную функцией process, можно дополнительно обработать (например, исключить лишние стили или ссылки, сделать относительные пути абсолютными и т.п.), либо сразу вывести ее на экран функцией PHP print или echo. В приведенном ниже примере единственная вызываемая пользователем парсера функция parser вызывает 2 остальные функции и дополнительно один раз шлет заголовок с кодировкой документа (если модуль работает из готового движка, блок с вызовом header нужно убрать).

Вызвать наш парсер можно, например, так:

 

Здесь мы вытаскиваем краткий прогноз погоды с новосибирского городского сервера НГС. Обратите внимание, что все пробелы, которые были в полученном по адресу файле, я сохранил в строке параметра $end, а переносы строк заменил на \n

Еще пример:

 

Здесь просто берется титул (содержимое тега TITLE) моей домашней странички.

Думаю, на основе этой статьи нетрудно модифицировать граббер под свои задачи.

.

I tend now to sit on my better ideas like a broody essay helper online free hen, letting them hatch as they will in their own good time
Вы можете оставить ответ, или trackback с вашего сайта.

Leave a Reply

Надо сделать сайт? Мы выгодно сделаем сайт! ©