PHP_Logo

Перед прочтением этой статьи можно ознакомиться с предыдущей частью: Парсинг сайтов – описание принципов

Большинство парсеров сайтов пишутся на PHP. Причиной тому являются некоторые особенности языка, а именно:

  1. Низкий порог вхождения. «Пэхапешников» больше чем «рубистов», «питонщиков», «сишников» и «дельфистов» вместе взятых. Увы, это не тот случай, когда количество переходит в качество.
  2. «Заточенность» под работу с Web.
  3. Наличие хорошо проработанных тематических библиотек.
  4. Именно на этом языке написано подавляющее количество сайтов, а значит парсеры на PHP проще всего встраивать в их архитектуру.

Впрочем, у «гипертекстового процессора» есть и некоторые весьма ощутимые недостатки:

  • Нет возможности писать десктопные приложения. С одной стороны это накладывает существенные ограничения на использование скриптов: чтобы запустить парсер, необходимо произвести обращение браузера к серверу или пользоваться дополнительными приспособления наподобие cron. В любом случае, это создаёт дополнительные трудности если парсер необходимо запускать по графику. И, несомненно, ограничивает (зачастую критично) время исполнения программы.
  • С другой стороны, PHP-скрипты, как и продукт любого интерпретатора, работают много медленнее, чем скомпиллированные EXE-шки. Если требуется написать робота, которому необходимо обойти десятки тысяч страниц, то в этой ситуации PHP подойдёт вряд ли.
  • Важным минусом является однопоточность PHP, не позволяющая реализовывать асинхронность. Хотя её можно имитировать, запуская параллельно один и тот же скрипт. Однако сей метод является лишь бесхитростным костылём, наглядно вскрывающий недостатки интерпретатора.

Импорт контента

Дабы разобрать по косточкам страницу сайта, необходимо получить её html-код. PHP располагает средствами для этого.

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

Чтобы более тонко работать с удалёнными файлами и поставить получение исходных кодов страниц на поток, в PHP есть прекрасный инструмент в виде библиотеки cURL.

file_get_contents

Функция file_get_contents используется для получения содержимого файла в виде одной строки.

Синтаксис:

В случае неудачи, функция возвращает false.

Параметры функции:

string filename – путь к файлу, содержимое которого требуется получить. Значением данного параметра может выступать URL. При этом следует помнить, что если в значении параметра используются спецсимволы и русские буквы, то адрес файла следует закодировать с помощью функции urlencode().

bool use_include_path – если значение этого необязательного параметра установить как true, то поиск искомого файла будет также производиться в каталогах, указанных пользователем в директиве include_path.

resource context  – Необязательный параметр, позволяющий устанавливать контекстные опции и параметры, которые могут быть использованы со всеми файловыми системами и обработчиками потоков.  Параметр введён в версии PHP 5.0.0. Контекст создается с помощью функции stream_context_create().

int offset – необязательный параметр, позволяющий считывать строку, начиная с символа с порядковым номером offset. Параметр введён в версии PHP 5.1.0.

int maxlen –  необязательный параметр, позволяющий считывать в строке только maxlen символов. Параметр введён в версии PHP 5.1.0.

Для написания парсеров в функции file_get_contents практическое значение имеет только первый обязательный параметр filename.

Дополнительно:

Функции file_get_contents по своему действию похожа на функцию file(). Отличие состоит в том, что file() помещает содержимое удалённого файла не в строку, а в массив. Ключи этого массива – номера строк (начиная с нуля), элементы – содержимое каждой строки. Для написания парсеров функция file() малопригодна.

cURL

cURL (сокр. от client URL) – разработанная в 1998 году Дэниэлом Стейнбергом кроссплатформенная утилита для автоматизации передачи удалённых файлов по различным протоколам (http, https, ftp, gopher, telnet, dict, file и ldap).

Для встраивания cURL в различные языки программирования разработана библиотека libcurl. Начиная с версии 4.0.2 библиотека по умолчанию включена в конфигурацию PHP.

Помимо поддержки основных сетевых протоколов и сертификатов, cURL обеспечивает туннелирование через http-прокси, работает с http-куками, успешно взаимодействует с разнообразными системами аутентификации, возобновляет докачку в случае обрыва. В общем, большая умница и красавица 🙂

Функции cURL

resource curl_init ([string url])

Инициализация cURL-сессии. При этом функция возвратит cURL-дескриптор, который затем используется при вызовах функции curl_setopt(), curl_exec() и curl_close(). Необязательный параметр url устанавливает опцию CURLOPT_URL, обозначающий адрес, с которым будут производиться дальнейшие операции. Если это параметр не будет установлен, то его в дальнейшем можно определить с помощью функции curl_setopt().

bool curl_setopt (resource ch, string option, mixed value)

Предварительная установка опции для cURL-сессии. Обычно функция вызывается несколько раз, устанавливая различные параметры для сеанса. Параметр ch является идентификатором сессии (cURL-дескриптор), установленным с помощью функции curl_init() . Параметр option является названием опции которую требуется установить, а value – её значением.

bool curl_exec (resource ch)

Запуск cURL-сессии на выполнение. При этом будут использованы параметры, установленные с помощью вызовов функции curl_setopt(). ch — cURL-дескриптор текущей сессии, полученный в результате вызова функции curl_init(). В случае неудачи, функция возвращает false.

void curl_close(resource ch)

Закрытие cURL-сессии. Дескриптор ch при этом уничтожается, ресурсы выделенные на сессию освобождаются.

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

Пример:

Библиотеки для парсинга

Библиотек для парсинга на PHP существует немало, и среди их множества стоит выделить «великолепную четвёрку»:

  1. PHP Simple HTML DOM Parser. Подробная документация, множество функций, простота использования. Начать изучение парсинга на PHP новичкам рекомендуется именно с неё.
  2. PHPQuery. Эффективный парсинг, использующий jQuery-подобный синтаксис.
  3. Zend_DOM_Query. Поскольку библиотека разработана как модуль к Zend Framework, то она идеально подойдёт прежде всего разработчикам проектов на данной CMF.
  4. Nokogiri. Компактная библиотека в полторы сотни строк, не уступающая по мощности вышеперечисленным аналогам.