Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Грабберы контента - это специальные скрипты или программы, которые получают некоторую информацию напрямую из текста html-страниц других сайтов, чаще всего без их ведома или разрешения. Название произошло от транскрипции английского глагола "to grab" - "захватывать", "использовать", хотя и русский вариант корня "грабить" тоже иногда подходит. Вообще, тырить чужой контент и использовать его на своих сайтах нехорошо. Но в некоторых случаях считаю это допустимым, например, когда для мобильных устройств требуется получить облегченные версии страниц сайтов, которые не имеют такой штатной функции. Или же надо удалить со страницы всякую рекламу, а то некоторые ублюдочные сайты умудряются заталкивать баннеры даже в RSS-ленты. Или, например, если требуется получать информацию с сайтов, у которых нет собственных API для выгрузки контента.

Самый простой способ получить текст нужной html-страницы сайта - при помощи функции PHP file_get_contents. Текст загруженной страницы разбирается регулярными выражениями. Вот пример граббера для Цитатника Рунета. После извлечения цитат с главной страницы можно вывести их все списком, как сделано в этом примере, или показать случайным образом одну из них.
  1. <?
  2. //-----------------------------------------------------------
  3. // Граббер цитат с Цитатника Рунета bash.org.ru
  4. // Загружает и парсит главную страницу, цитаты помещает в массив
  5. //-----------------------------------------------------------
  6. // Получить html-страницу
  7. $grab=@file_get_contents("http://bash.org.ru");
  8. if ($grab) {
  9.   // Заменить теги переноса строки на простые переносы строки
  10.   $grab=str_replace("<br>","\n",$grab);
  11.   // Получить регулярным выражением тексты цитат
  12.   preg_match_all("/<div class=\"vote\">([^>]*>){12}([^<]*)/",$grab,$matches);
  13.   // В массиве содержатся все найденные строки
  14.   for ($i=0$i<count($matches[2]); $i++) {
  15.     echo nl2br($matches[2][$i]);
  16.     echo '<hr>';
  17.   }
  18. }
  19. else {
  20.   echo "Connection Error";
  21. }
  22. ?>
Регулярные выражения для извлечения данных придется писать самостоятельно, для каждого сайта свои. Отлаживать регулярные выражения можно как в онлайне здесь или здесь, так и с использованием стационарных программ. Для браузера Firefox есть хорошее расширение Regular Expressions Tester.

Еще один простой граббер курса доллара с Яндекса. Там хранятся данные о курсе аж с 1998 года и по сегодняшнюю дату включительно. Но в этом случае список упорядочен в CSV-файле. Такой список удобнее всего загрузить функцией file и обработать полученный массив.
  1. <?
  2. //-----------------------------------------------------------
  3. // Граббер курса доллара с Яндекса
  4. // Загружает в массив курс доллара за период с 01.01.1998 по
  5. // сегодняшнее число
  6. //-----------------------------------------------------------
  7. // Получить csv-файл и занести его в массив
  8. $grab=@file("http://www.yandex.ru/s/1.csv");
  9. if (count($grab)) {
  10.   for ($i=0$i<count($grab); $i++) {
  11.     // Разобрать строку массива на дату и курс
  12.     list($v_date$v_kurs)=explode(";",$grab[$i]);
  13.     echo "Дата: ".$v_date." - Курс: ".$v_kurs;
  14.     echo '<hr>';
  15.   }
  16. }
  17. else {
  18.   echo "Connection Error";
  19. }
  20. ?>
Более сложный способ получения страниц использует библиотеку CURL. Но зато этот способ позволяет получать контент страниц по защищенному протоколу https и ftp, использовать сессии, Basic-авторизацию, эмулировать ввод логина и пароля для доступа к закрытым разделам сайтов, и вообще полностью повторять работу обычного браузера. Естественно, что PHP на вашем сервере должен быть собран с модулем CURL. Все нужные заголовки для эмуляции браузера и ответы сервера удобнее всего отслеживать при помощи расширения Live HTTP Headers для Firefox. Вот пример граббера с авторизацией и работой по защищенному протоколу, который получает список файлов на вашем премиум-аккаунте файлообменника RapidShare.com.
  1. <?
  2. //-----------------------------------------------------------
  3. // Граббер ссылок с премиум-аккаунта RapidShare.com
  4. // Загружает в массив список файлов, хранящихся на аккаунте
  5. //-----------------------------------------------------------
  6. // Логин и пароль от вашего премиум-аккаунта
  7. $login="тут_ваш_логин";
  8. $password="тут_ваш_пароль";
  9.  
  10. // Установить URL для загрузки
  11. $url="https://ssl.rapidshare.com/cgi-bin/premiumzone.cgi?export=1";
  12. // Установить Cookies для авторизации
  13. $cookie="user=".$login."-".urlencode($password);
  14.  
  15. // Инициализация CURL
  16. $ch=curl_init();
  17.  
  18. // Установка URL и всех необходимых значений
  19. curl_setopt($ch,CURLOPT_URL$url);
  20. curl_setopt($ch,CURLOPT_RETURNTRANSFERtrue);
  21. curl_setopt($ch,CURLOPT_HEADER,0);
  22. curl_setopt($ch,CURLOPT_COOKIE,$cookie);
  23. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
  24.  
  25. // Выполнить запрос и получить результат
  26. $output=curl_exec($ch);
  27. $info=curl_getinfo($ch);
  28.  
  29. if ($output!==false) {
  30.   // В массиве $links список ссылок
  31.   $links=explode("\n",$output);
  32. }
  33. else {
  34.   echo "Connection Error: ".curl_error($ch);
  35. }
  36. ?>
В некоторых случаях придется обрабатывать несколько страниц, например, сперва выполняется эмуляция ввода логина и пароля, получение идентификатора сессии, а только потом загружается нужная страница с указанием этого идентификатора в заголовках запроса. Все необходимые функции и параметры библиотеки CURL подробно описаны в официальной документации.

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

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 45252 | Комментариев: 17

Метки: PHP, SEO
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (02.07.2013 в 15:31):
Разве мой предыдущий комментарий непонятен?
Александр (02.07.2013 в 15:25):
Помогите пожалуйста сделать так что бы получать только варианты
[del]
а то парсится всё что есть
ManHunter (13.01.2013 в 23:07):
Я НИКОМУ не пишу ни на скайп, ни на почту, никуда. Кому чо надо - отправляете письмо на обратную связь с подробнейшим описанием задачи и ТОЧНОЙ СУММОЙ, которую вы заплатите. А дальше посмотрим.
Максим (12.12.2012 в 11:49):
ManHunter, Привет! Напиши мне в скайп договоримся.
Арутр (08.11.2011 в 19:52):
а как еще можно вывести дату
Максим (04.01.2011 в 15:04):
А я вот для парсинга использую DOM модель.
Deregan (01.12.2010 в 20:35):
Спасибо Вам!!! Очень полезная информация!
ManHunter (30.06.2010 в 12:36):
Руками. Если не умеешь руками, то платишь деньги тому, кто умеет.
Алексей (30.06.2010 в 12:32):
Как можно сделать граббер для прокси? Например, с сайта http://fineproxy.ru/.
ManHunter (14.03.2010 в 17:44):
Заплатить денег, например.
Oleg (14.03.2010 в 17:28):
А как сделать так чтобы первый парсер сам создавал xml файл и записывал туда награбленное.
effrit (11.03.2010 в 13:18):
спасибо, добрый человек, очень полезная статья и сопутствующие ссылки.
Гошка (22.11.2009 в 18:36):
А можно ли по подробней (или линку на эту тему) про случай, когда надо обработать несколько страниц. Я пробую на mail.ru, отсылаю данные авторизации на соответствующую страницу, приходит заголовок с редиректом, кукисами и разной другой инфой. Вторым шагом перехожу с указанными кукисами и редиректу - возвращается тоже самое, что отправил. А если при переходе кукисы не указывать, то возвращается пустая стандартная форма для авторизации.
В общем, как я понял, для корректной работы граббера нужно грамотно сымулировать работу кукисов, но я кокрентно пока не знаю как это сделать.
ManHunter (22.09.2009 в 19:35):
за 20$ сделаю
alex (22.09.2009 в 19:33):
сделаешь мне граббер текста с одно сайта?
Vitalij (13.08.2009 в 02:30):
Заибок статья! Помогла сграббить 10 000 новостей. Осталось разобраться с 3 вариантом.
Жека (08.08.2009 в 20:31):
Ну, я пользуюсь прогой поудобней да и ссылки берет не только с рапиды но и с других обменников всё в одном окне вот скрин http://s42.radikal.ru/i097/090...6195d5e3.jpg
а вот сама прога http://rapidshare.com/files/26...etriever.rar

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

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0032 сек.) / Память: 4.5 Mb
Наверх