007.jpg

Грабберы контента — это специальные скрипты или программы, которые получают некоторую информацию напрямую из текста html-страниц других сайтов, чаще всего без их ведома или разрешения. Название произошло от транскрипции английского глагола «to grab» — «захватывать», «использовать», хотя и русский вариант корня «грабить» тоже иногда подходит. Вообще, тырить чужой контент и использовать его на своих сайтах нехорошо. Но в некоторых случаях считаю это допустимым, например, когда для мобильных устройств требуется получить облегченные версии страниц сайтов, которые не имеют такой штатной функции. Или же надо удалить со страницы всякую рекламу, а то некоторые ублюдочные сайты умудряются заталкивать баннеры даже в RSS-ленты. Или, например, если требуется получать информацию с сайтов, у которых нет собственных API для выгрузки контента.

Самый простой способ получить текст нужной html-страницы сайта — при помощи функции PHP file_get_contents. Текст загруженной страницы разбирается регулярными выражениями. Вот пример граббера для Цитатника Рунета. После извлечения цитат с главной страницы можно вывести их все списком, как сделано в этом примере, или показать случайным образом одну из них.

<?
//-----------------------------------------------------------
// Граббер цитат с Цитатника Рунета bash.org.ru
// Загружает и парсит главную страницу, цитаты помещает в массив
//-----------------------------------------------------------
// Получить html-страницу
$grab=@file_get_contents("http://bash.org.ru");
if ($grab) {
// Заменить теги переноса строки на простые переносы строки
$grab=str_replace("<br>","\n",$grab);
// Получить регулярным выражением тексты цитат
preg_match_all("/<div class=\"vote\">([^>]*>){12}([^<]*)/",$grab,$matches);
// В массиве содержатся все найденные строки
for ($i=0; $i<count($matches[2]); $i++) {
echo nl2br($matches[2][$i]);
echo '<hr>';
}
}
else {
echo "Connection Error";
}
?>

Регулярные выражения для извлечения данных придется писать самостоятельно, для каждого сайта свои. Отлаживать регулярные выражения можно как в онлайне здесь: http://erik.eae.net/playground/regexp/regexp.html или здесь: http://www.regexpal.com/, так и с использованием стационарных программ. Для браузера Firefox есть хорошее расширение Regular Expressions Tester (http://addons.mozilla.org/ru/firefox/addon/2077).

Еще один простой граббер курса доллара с Яндекса. Там хранятся данные о курсе аж с 1998 года и по сегодняшнюю дату включительно. Но в этом случае список упорядочен в CSV-файле. Такой список удобнее всего загрузить функцией file и обработать полученный массив.

<?
//-----------------------------------------------------------
// Граббер курса доллара с Яндекса
// Загружает в массив курс доллара за период с 01.01.1998 по
// сегодняшнее число
//-----------------------------------------------------------
// Получить csv-файл и занести его в массив
$grab=@file("http://www.yandex.ru/s/1.csv");
if (count($grab)) {
for ($i=0; $i<count($grab); $i++) {
// Разобрать строку массива на дату и курс
list($v_date, $v_kurs)=explode(";",$grab[$i]);
echo "Дата: ".$v_date." - Курс: ".$v_kurs;
echo '<hr>';
}
}
else {
echo "Connection Error";
}
?>

Более сложный способ получения страниц использует библиотеку CURL. Но зато этот способ позволяет получать контент страниц по защищенному протоколу https и ftp, использовать сессии, Basic-авторизацию, эмулировать ввод логина и пароля для доступа к закрытым разделам сайтов, и вообще полностью повторять работу обычного браузера. Естественно, что PHP на вашем сервере должен быть собран с модулем CURL. Все нужные заголовки для эмуляции браузера и ответы сервера удобнее всего отслеживать при помощи расширения Live HTTP Headers для Firefox (http://addons.mozilla.org/ru/firefox/addon/3829). Вот пример граббера с авторизацией и работой по защищенному протоколу, который получает список файлов на вашем премиум-аккаунте файлообменника RapidShare.com.

<?
//-----------------------------------------------------------
// Граббер ссылок с премиум-аккаунта RapidShare.com
// Загружает в массив список файлов, хранящихся на аккаунте
//-----------------------------------------------------------
// Логин и пароль от вашего премиум-аккаунта
$login="тут_ваш_логин";
$password="тут_ваш_пароль";

// Установить URL для загрузки
$url="https://ssl.rapidshare.com/cgi-bin/premiumzone.cgi?export=1";
// Установить Cookies для авторизации
$cookie="user=".$login."-".urlencode($password);

// Инициализация CURL
$ch=curl_init();

// Установка URL и всех необходимых значений
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_COOKIE,$cookie);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);

// Выполнить запрос и получить результат
$output=curl_exec($ch);
$info=curl_getinfo($ch);

if ($output!==false) {
// В массиве $links список ссылок
$links=explode("\n",$output);
}
else {
echo "Connection Error: ".curl_error($ch);
}
?>

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

Как защититься от автоматического извлечения контента? Если используются только функция file_get_contents или file, то достаточно проверять поле USER_AGENT и блокировать доступ на сайт, если это поле пустое. К сожалению (или к счастью?) этот способ не будет работать при использовании граббером библиотеки CURL или сокетов с эмуляцией всех заголовков браузера, тут поможет только бан по ip сервера, с которого выполняется граббинг. Это, кстати, практикует Яндекс, блокируя ip-адреса, с которых слишком часто вызываются одни и те же страницы.

h++p://www.manhunter.ru/webmaster/137_grabberi_kontenta_s_drugih_saytov.html

Категория: PHP, HTML, CSS...

Оставьте свой комментарий