PHP парсер PHP Simple HTML DOM Parser

Недавно мне понадобился парсер. Гугл по запросу “PHP парсер” ничего подходящего не выдавал, было уже поздно и на ночь глядя заморачиваться с регулярками и изобретать колесо не хотелось. Поэтому выбор пал на буржуйскую разработку PHP Simple HTML DOM Parser.

PHP Simple HTML DOM Parser – простой универсальный PHP парсер, с помощью которого можно быстро сграбить нужную инфу.

Как работать с парсером?

Для начала работы создаем пустой php файл и подключаем в нём php класс simple_html_dom.php:

<?php
include_once('simple_html_dom.php');
?>

На примере redtube’а рассмотрим возможности данного php парсера:

Получить все заголовки видео на странице:

// Функция file_get_html засасывает страницу в массив $html
$html = file_get_html('http://www.redtube.com/redtube/lesbian/');
// Обходим массив и ищем в нем соответствие тэгу H2
foreach($html->find('h2[class="videoTitle"]') as $e) {
echo ''.(++$count).'. <strong>Title:</strong> '.$e->plaintext. '<br/>';
}

Получить все превью:

foreach($html->find('img[class="t"]') as $element) {
echo ''.(++$count).'. <strong>Img:</strong> '.$element->src . '<br/>';

}

Получить все ссылки на видео:

foreach($html->find('a[class="s"]') as $element) {

$elid = str_replace("/", "", $element->href);
echo ''.(++$count).'. <strong>Link:</strong> '.$elid.'<br/>';

}

На скриншоте результат выполнения скрипта:

PHP парсер

Теперь проделаем то же самое, только не просто выведем данные паровозиком  на экран, а загрузим их в какой-нибудь массив:

<?php
// Подключаем  класс парсерса
include_once('simple_html_dom.php');
// Задаем URL страницы
$html = file_get_html('http://redtube.com/redtube/lesbian');

// Цикл разбора массива
foreach($html->find('div[class="video]') as $container) {
$item['title']     = $container->find('h2[class="videoTitle"]', 0)->plaintext;
$item['img']    = $container->find('img[class="t"]', 0)->src;
$item['href'] = str_replace("/", "", $container->find('a[class="s"]', 0)->href);
$containers[] = $item;
}
// Печать содержимого массива
print_r($containers);
?>

Результат выполнения скрипта:

PHP парсер грабер

Далее берем эти данные и делаем с ними, что нам надо. Принцип работы, что приспособить php парсер под свои нужны, я думаю, понятен.


Постовой: Блог про арбитраж трафика. 5000 рублей в день на арбитраже сможет каждый.
www.skitt.ru - широкий ассортимент шин по низким ценам

Популярность: 96%

... и самое главное не забудь подписаться на RSS !

Метки: Кодинг
Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong


Посты по теме:

  
  • Часть 2. Куда можно добавить RSS блога или сайта, база из 50 RSS-каталогов
  • Дух времени 1 и 2
  • Куда можно добавить RSS-каналы блога
  • Партнерский сайт на базе блога
  • Работаем с партнерскими программами Интернет-магазинов. Часть 2

  • 19 комментариев:

    1. mihalich, 8. Февраль 2010, 17:46

      спасибо. отличный парсер редтюба в 10 строчек =) много трафа получается собирать на таких тюб-сайтах?

       
    2. mihalich, 8. Февраль 2010, 18:18

      вроде они код поменяли. в div - twoRowsTitle нету картинки. попробовал сделать так.

      foreach($html->find(’div[class=”video”]’) as $container) {
      $item[’title’] = $container->find(’img’,0)->title;
      $item[’img’] = $container->find(’img’,0)->src;
      $item[’href’] = $container->find(’img’,0)->id;
      $containers[] = $item;
      }

       
    3. admin, 8. Февраль 2010, 19:02

      Да я не собираю трафик на них, просто часто спрашивают про парсеры тьюбов, поэтому выбрал как пример.

       
    4. доброжелатель, 9. Февраль 2010, 10:31

      Проект классный, но не обновлялся уже очень давно. Также имеет очень серьезную неисправность, которая до сих пор не вылечена и не позволяет, по крайней мере мне, положиться на скрипт 100% (а так хотелось) - http://sourceforge.net/tracker/?func=detail&aid=2848763&group_id=218559&atid=1044037

       
    5. iFox, 11. Февраль 2010, 14:26

      Привет! Ответил тебе в статье http://ifox.com.ua/topic/280
      А за статью спс. Никогда с парсером не работал раньше, но все думал попробовать тему.

       
    6. vredin, 23. Февраль 2010, 0:06

      сегодня с утра баловался, а вечером нашел вашу статью :)

      проблема ээтого скрипта в том, что он очень медленный и кушает много памяти - сегодня пытался вытащить пути к картинкам с одного блога на 300-страницах, так больше 30 страницы за раз не кушалось :(

       
    7. vredin, 23. Февраль 2010, 0:08

      да, забыл сказать что для php выделено 40 метров.. сервер - дедик

       
    8. admin, 23. Февраль 2010, 0:14

      Не стоить пытаться спарсить весь сайт за раз, парсите частями.

       
    9. AxElXXX, 6. Март 2010, 0:15

      Работает все просто заебись. Спасибо. Доволен

       
    10. AxElXXX, 6. Март 2010, 0:16

      :1st: :1st: :1st: :1st: :1st: :1st: :1st: :1st: :pilot: :pilot: :pilot: :pilot: :pilot: :pilot: :pilot: :pilot: :bebe: :bebe: :bebe: :bebe: :bebe: :bebe: :azaza: :azaza: :azaza: :azaza: :chmok: :chmok: :chmok: :chmok: :chmok:

       
    11. uniparser, 24. Май 2010, 16:26

      Полезный скрипт, я делал свой на подобие этого, но чуть по “другому рецепту”

       
    12. Arthur, 29. Май 2010, 2:13

      Для тех, у кого проблемы с пожиранием памяти, юзайте clear();

      foreach($html->find(’div[class=”video]’) as $container) {
      $item[’title’] = $container->find(’h2[class=”videoTitle”]’, 0)->plaintext;
      $item[’img’] = $container->find(’img[class=”t”]’, 0)->src;
      $item[’href’] = str_replace(”/”, “”, $container->find(’a[class=”s”]’, 0)->href);
      $containers[] = $item;

      //И сама очистка
      $container->clear();
      }
      //и ещё раз
      $html->clear();

       
    13. Павел, 15. Сентябрь 2010, 18:10

      Здравствуйте. Прошу подсказать. Два дня голову ломаю. Написал небольшой парсер, но что-то он не совсем правильно работает. Я его привожу в немного урезанном виде, так как обработчик напарсенного текста работает нормально.

      <?php
      ob_implicit_flush();
      $keywords = file(\"keys.txt\");
      $zapisi = fopen(\"base.txt\", \"a\");
      foreach ($keywords as $keyword)
      {
      $num = mt_rand(10,20);
      $url = (\"http://www.google.com/search?hl=en&num=$num&q=keyword\");
      $content = file_get_contents($url);
      $pos = strpos($content, \"<span><</span>div id=ires<span>>\"</span>);
      $content = substr($content, $pos);
      $pos = strpos($content, \"<span><</span>div id=leftnav</span>>\"</span>);
      $content = substr($content, 0, $pos);
      fwrite($zapisi, $content. \"\\n\");
      echo $content, $url;
      sleep (10);
      }
      fclose($zapisi);
      ?>

      (На кавычки внимания не обращайте,- пришлось изменить, чтобы отобразился код на этой странице)
      Файл keys.txt - список кейвордов, где для гугла пробелы заменены на \"+\".
      Когда я заменяю адрес с переменной $keyword
      http://www.google.com/search?hl=en&num=$num&q=$keyword
      на простой запрос, например слово keyword
      http://www.google.com/search?hl=en&num=$num&q=keyword ,
      то при парсинге в файл base.txt вписывается всё как надо. Цикл тоже запускается, но естественно запрос каждый раз повторяется один и тот же.
      Когда же я в урле ставлю обратно переменную $keyword , парсится какая-то ерунда, совсем не по теме, хотя и с файла keys.txt при каждом новом цикле берется новый по порядку запрос. Может кто знает, что в коде не так. Не программер я, к сожелению.

       
    14. Дмитрий, 7. Ноябрь 2010, 2:43

      Ребят, такой вопрос.
      Парсю html-код

      $text = file_get_html(’http://googe.com’);

      Теперь ведь код мне надо записать в базу данных, представим, что есть бд, с таблицей одной, у нее одно поле, например sample.

      Как это сделать?

       
    15. Иван, 21. Декабрь 2010, 0:54

      Павел попробуй так там уже допиши все как надо.
      $url = (’http://www.google.com/search?hl=en&q=’.$keyword);

       
    16. Megaultraseo, 13. Январь 2011, 23:55

      Павел, может надо использовать urlencode?

       
    17. Павел, 15. Январь 2011, 14:01

      Да нет же, разобрался уже давно. Всё дело в файле base.txt. Вместе со строчкой из этого файла в переменную $keyword подхватываются символы перевода строки \\n и \\r. Помогло это:
      $keyword_old = array (
      \"\’\\r\’ si\",
      \"\’\\n\’ si\",
      );
      $keyword_new = array (
      \"\",
      \"\",
      );
      $keyword = preg_replace($keyword_old, $keyword_new, $keyword);

       
    18. Павел, 15. Январь 2011, 14:10

      Упс… Только ж не забудьте убрать экранирующие слэши, а вместо двойных - одинарные.
      P.S. Админ, сделай что-нибудь с кодом подтверждения. Я ввожу правильно. Трезв. :azaza:

       
    19. Yurii, 7. Июль 2011, 18:22

      echo “Peak memory usage: “.(memory_get_peak_usage(true)/1024/1024).” MB\r\n”;
      Посмотрите СКОКО ОН ЖРЕТ!!!

       

    Напишите комментарий:

    :be: :haha: :kach: :fight: :flowers: :fing: :sucks: :hlop: :cens: :aggr: :1st: :ded: :pilot: :bebe: :azaza: :chmok: