PHP

Грабберы контента с других сайтов

Грабберы контента - это специальные скрипты или программы, которые получают некоторую информацию напрямую из текста 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";
}
?>

Регулярные выражения для извлечения данных придется писать самостоятельно, для каждого сайта свои. Отлаживать регулярные выражения можно как в онлайне здесь или здесь, так и с использованием стационарных программ. Для браузера Firefox есть хорошее расширение Regular Expressions Tester.

Еще один простой граббер курса доллара с Яндекса. Там хранятся данные о курсе аж с 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. Вот пример граббера с авторизацией и работой по защищенному протоколу, который получает список файлов на вашем премиум-аккаунте файлообменника 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-адреса, с которых слишком часто вызываются одни и те же страницы.
Теги:
file_get_contents, регулярные выражения, curl, граббер
Добавлено: 14 Сентября 2013 09:52:47 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...