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
// Подключаем класс парсерса
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 парсер под свои нужны, я думаю, понятен.
Постовой: Блог про арбитраж трафика. 5000 рублей в день на арбитраже сможет каждый.
www.skitt.ru - широкий ассортимент шин по низким ценам
Популярность: 96%
... и самое главное не забудь подписаться на RSS ! 



спасибо. отличный парсер редтюба в 10 строчек =) много трафа получается собирать на таких тюб-сайтах?
вроде они код поменяли. в 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;
}
Да я не собираю трафик на них, просто часто спрашивают про парсеры тьюбов, поэтому выбрал как пример.
Проект классный, но не обновлялся уже очень давно. Также имеет очень серьезную неисправность, которая до сих пор не вылечена и не позволяет, по крайней мере мне, положиться на скрипт 100% (а так хотелось) - http://sourceforge.net/tracker/?func=detail&aid=2848763&group_id=218559&atid=1044037
Привет! Ответил тебе в статье http://ifox.com.ua/topic/280
А за статью спс. Никогда с парсером не работал раньше, но все думал попробовать тему.
сегодня с утра баловался, а вечером нашел вашу статью :)
проблема ээтого скрипта в том, что он очень медленный и кушает много памяти - сегодня пытался вытащить пути к картинкам с одного блога на 300-страницах, так больше 30 страницы за раз не кушалось :(
да, забыл сказать что для php выделено 40 метров.. сервер - дедик
Не стоить пытаться спарсить весь сайт за раз, парсите частями.
Работает все просто заебись. Спасибо. Доволен
Полезный скрипт, я делал свой на подобие этого, но чуть по “другому рецепту”
Для тех, у кого проблемы с пожиранием памяти, юзайте 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();
Здравствуйте. Прошу подсказать. Два дня голову ломаю. Написал небольшой парсер, но что-то он не совсем правильно работает. Я его привожу в немного урезанном виде, так как обработчик напарсенного текста работает нормально.
<?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 при каждом новом цикле берется новый по порядку запрос. Может кто знает, что в коде не так. Не программер я, к сожелению.
Ребят, такой вопрос.
Парсю html-код
$text = file_get_html(’http://googe.com’);
Теперь ведь код мне надо записать в базу данных, представим, что есть бд, с таблицей одной, у нее одно поле, например sample.
Как это сделать?
Павел попробуй так там уже допиши все как надо.
$url = (’http://www.google.com/search?hl=en&q=’.$keyword);
Павел, может надо использовать urlencode?
Да нет же, разобрался уже давно. Всё дело в файле base.txt. Вместе со строчкой из этого файла в переменную $keyword подхватываются символы перевода строки \\n и \\r. Помогло это:
$keyword_old = array (
\"\’\\r\’ si\",
\"\’\\n\’ si\",
);
$keyword_new = array (
\"\",
\"\",
);
$keyword = preg_replace($keyword_old, $keyword_new, $keyword);
Упс… Только ж не забудьте убрать экранирующие слэши, а вместо двойных - одинарные.
P.S. Админ, сделай что-нибудь с кодом подтверждения. Я ввожу правильно. Трезв.
echo “Peak memory usage: “.(memory_get_peak_usage(true)/1024/1024).” MB\r\n”;
Посмотрите СКОКО ОН ЖРЕТ!!!