сURL и PHP парсеры

Применение cURL в PHP парсерах сайтов

В этой статье разберём одну из ключевых деталей любого парсера сайтов. Это составление запросов к серверу источнику информации и получение от него ответа.

Один из самых простых вариантов воспользоваться PHP функцией file_get_contents(), но часто этого бывает мало, так как многие сайты для того, чтобы отдать нужный контент требуют отправить запрос с определёнными заголовками или куками. Также нам бывает нужна информация о заголовках в ответе сервера.

Для более сложных случаев удобнее составлять запросы с помощью функции из модуля cURL. cURL — это модуль для PHP, обеспечивающий поддержку библиотеки функций libcurl. Эта библиотека позволяет формировать POST или PUT запросы к веб-серверам, скачивать файлы. Набор функций поддерживает различные протоколы обмена http, https, ftp и пр. Расширение cURL  позволяет работать с поддержкой прокси-серверов, cookies и проводить аутентификацию пользователей. Получается хороший  инструмент для имитации действий пользователя в браузере.

Для разработки парсеров я написал аналог функции file_get_contents() с помощью cURL.

/* --- 1.2 --- Загрузка страницы при помощи cURL */
function curl_get_contents($page_url, $base_url, $pause_time, $retry) {
	/*
	$page_url - адрес страницы-источника
	$base_url - адрес страницы для поля REFERER
	$pause_time - пауза между попытками парсинга
	$retry - 0 - не повторять запрос, 1 - повторить запрос при неудаче
	*/
	$error_page = array();
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0");   
	curl_setopt($ch, CURLOPT_COOKIEJAR, str_replace("\\", "/", getcwd()).'/gearbest.txt'); 
	curl_setopt($ch, CURLOPT_COOKIEFILE, str_replace("\\", "/", getcwd()).'/gearbest.txt'); 
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // Автоматом идём по редиректам
	curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); // Не проверять SSL сертификат
	curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); // Не проверять Host SSL сертификата
	curl_setopt($ch, CURLOPT_URL, $page_url); // Куда отправляем
	curl_setopt($ch, CURLOPT_REFERER, $base_url); // Откуда пришли
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Возвращаем, но не выводим на экран результат
    $response['html'] = curl_exec($ch);
	$info = curl_getinfo($ch);
	if($info['http_code'] != 200 && $info['http_code'] != 404) {
		$error_page[] = array(1, $page_url, $info['http_code']);
		if($retry) {
			sleep($pause_time);
			$response['html'] = curl_exec($ch);
			$info = curl_getinfo($ch);
			if($info['http_code'] != 200 && $info['http_code'] != 404)
				$error_page[] = array(2, $page_url, $info['http_code']);
		}
	}
	$response['code'] = $info['http_code'];
	$response['errors'] = $error_page;
	curl_close($ch);
	return $response;

}

Разберём детали работы функции curl_get_contents($page_url, $base_url, $pause_time, $retry). Основная её задача отвравить запрос по заданному URL ($page_url) и получить ответ от сервера.

С помощью функции curl_setopt() мы задаём нужные нам заголовки запроса. Например, через CURLOPT_USERAGENT настраивается User-Agent, можно менять тип браузера, из-под которого якобы делается запрос.

Панель разработчика в браузере FireFoxПодробно изучить параметры и заголовки запросов можно с помощью панели для веб-разрабочиков прямо в браузере по вкладке «Сеть». Очень полезный инструмент для начинающих и опытных разработчиков парсеров.

Параметры заголовков cURL для парсера

Кроме User-Agent для имитации действий реального пользователя полезно задать CURLOPT_REFERER — это заголовок Referer, на некоторых сайтах веб-мастера проверяют его наличие, чтобы отфильтровать совсем тупых ботов.

CURLOPT_FOLLOWLOCATION — позволяет переходить по редиректам в автоматическом режиме, то же полезная настройка, чтобы не обрабатывать по отдельности разные 301-редиректы.

CURLOPT_URL — задаёт URL целевой страницы — источника данных.

Настройки curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); — не проверять SSL сертификата и curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); — не проверять Host SSL сертификата, удобно использовать при работе по протоколу HTTPS, когда вам не нужно проверять валидность SSL сертификат у сервера.

CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE — задают пути к файлам для записи и считывания параметров COOKIE, нужны, например, для авторизации на сайте или когда интернет-ресурс хранит какие-либо настройки в файлах куков.

Самые интересные на мой субъективный взгляд настройки для cURL я описал. Детальное описание всех применяемых настроек лучше почитать в более официальных справочниках PHP.

Дальше в функции curl_get_contents() идёт отправка запроса и получение ответа в переменную. По заголовкам ответа проверяем удалось ли достучаться до заданной страницы. Если код ответа 200 или 400, то возвращаем HTML ответ от сервера. При другом коде ответа сервера после некоторой паузы делаем повторный запрос. Это бывает полезно, когда хостинг сайта работает нестабильно и при частых запросах выдаёт 500-ю ошибку.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *