cURL - ключ от всех дверей

версия для печати

Речь пойдет о библиотеке cURL (aka Client URL, libcurl) и ее использовании в PHP. Об этом уже много всего написано, поэтому я не буду проводить ликбез. Я расскажу о тех возможностях библиотеки, которые мне особенно доставляют. Не знаю, с какими благими намерениями создавал это чудо Daniel Stenberg, я использую ее в корыстных целях :)

Главная задача, в которой я использую cURL - парсинг. Тяну с разных сайтов нужные мне страницы и с помощью регулярных выражений нахожу в них инфу. Простой способ получить страницу сайта в переменную скрипта - использовать file_get_contents() или сочетание fopen()/fread(). Но проблема в том, что на многих хостингах установлен безопасный режим PHP и отключена директива "allow_url_fopen", позволяющая работать указанным функциям с объектами URL, как с обычными файлами. Еще можно использовать сокеты, но тут тоже не всегда открыто.

Применение 1. Элементарное :)
$url='http://example.com/testpage.htm';
$headers = array(
    'GET '.$url.' HTTP/1.1',
    'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',
  'Accept: text/html',
  'Accept-Language: ru,en-us;',
 'Accept-Charset: windows-1251,utf-8;',
    'Connection: close');
 
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);//Массив с HTTP заголовками для передачи на сервер
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   //Не выводить ответ в браузер. Пусть функция пишет все в переменную. 
$site=curl_exec($ch);                          //В случае успеха - html тест запрошенной страницы. Иначе - false                         
curl_close($ch);

Собссна, пояснять практически нечего :) Прикидываемся браузером, получаем страницу в переменную. Теперь с полученной информацией можно творить всякое, от сохранения на винт до выдачи пользователю в браузер, как своей. На практике такой вариант я использовал для парсинга рейтинга фильмов с imdb.com и kinopoisk.ru

Применение 2. Обход таймаут-защиты

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

Как обычно работает защита от авто-серфинга? Она палит ваш ip-ник и считает таймаут обращения к странице. Обмануть ее можно, обращаясь к сайту через прокси-серверы. Итак, готовим список проксей, возможно анонимных (в зависимости от сложности защиты). Его можно собрать, например, через www.hidemyass.com. Год назад все приходилось делать вручную, т.к. на указанном сайте тоже была защита от парсинга и ботов. Сейчас, похоже, админы расслабились, так что список активных проксей можно выловить автоматически :)

Теперь читаем страницы через cURL и при каждом обращении используем новый адрес прокси из списка. Код обращения изменится не сильно (см. выше), в настройках cURL добавится:

curl_setopt($ch, CURLOPT_PROXY, $proxy); //В переменной $proxy - "адрес:порт" очередного сервера

Заметки: На данный момент cURL поддерживает два метода авторизации HTTP, используемые при соединении с прокси-сервером - обычный (basic) и защищенный (NTLM).
Информацию о доступных прокси-серверах можно найти не только на указанном мной сайте, просто мне с ним удобно работать.

Применение 3. Авторизация на сайте
n

Еще одна жертва моих парсеров - сайт, раздающий сериалы. Мне лень каждый день на него ходить и проверять новости. До недавних пор парсер успешно справлялся с задачей. Политика сайта измениласть, теперь там требуется авторизация. Мое решение сводится к следующему: POST-запросом отправить логин/пароль, имитируя вход обычного пользователя. Получить заголовки ответа и найти в них назначенную cookie сессии. Все остальные запросы отправлять, добавляя эту печеньку.

//Авторизация. Получение сессионной печеньки
$url='http://example.com/login.php';//Туда отправляется POST при нажатии кнопки "Вход" на сайте
$post='login=user&password=anykey'; //Логин/пароль доступа
$headers = array(                   //Йа - бродилко :)
  'GET '.$url.' HTTP/1.1',
    'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3',
  'Accept: text/html',
  'Accept-Language: ru,en-us;',
 'Accept-Charset: windows-1251,utf-8;',
    'Connection: close');

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   
curl_setopt($ch, CURLOPT_HEADER, 1);           //Включить в результат заголовки ответа
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);   //POST-параметры
curl_setopt($ch, CURLOPT_POST, 1);             //Отправить POST-запрос
$site=curl_exec($ch);
curl_close($ch);

if ($site) preg_match('#Set-Cookie: ([0-9a-z=]*); path=/#U', $site, $match);
if(isset($match[1])) $authCookie=$match[1];    //Все, cookiе сессии получена.

После успешной авторизации обращение к страницам сайта выполняется через код, приведенный в начале статьи. В параметры cURL добавится только это:

curl_setopt($ch, CURLOPT_COOKIE, $authCookie);

Вот такие маленькие радости доставляет эта мощная библиотека :). Примеры кода в статье максимально упрощены. Какие именно заголовки отправлять, я подсмотрел в Firefox. Возможно в них что-лишнее или не хватает. Но у меня все работает :)

[1oo%, EoF]


Похожие материалы: "Правильный" multi_curl в PHP
Понравилась статья? Расскажите о ней друзьям:

Метки: PHP, кодинг

Комментарии
Для работы модуля комментариев включите javaScript


Показать/скрыть правила
Имя
[i] [b] [u] [s] [url]
:-) ;-) :D *lol* 8-) :-* :-| :-( *cry* :o :-? *unsure* *oops* :-x *shocked* *zzz* :P *evil*

Осталось 1000 символов.
Код защиты от спама Обновить код
Каждый комментарий проходит ручную модерацию. 100% фильтрация спама.
Продвижение
Время
Метки