Готовый парсинг php simple валюты скачать. PHP HTML DOM парсер с jQuery подобными селекторами. Последние темы блога

Парсер можно написать самому:

или использовать уже готовые библиотеки.

Библиотеки для парсинга.
  • PHP Simple HTML DOM Parser . Подробная документация, множество функций, простота использования. Начать изучение парсинга на PHP новичкам рекомендуется именно с неё.
  • PHPQuery . Эффективный парсинг, использующий jQuery.
  • Zend_DOM_Query . Поскольку библиотека разработана как модуль к Zend Framework, то она идеально подойдёт прежде всего разработчикам проектов на данной CMF.
  • Nokogiri . Компактная библиотека в полторы сотни строк, не уступающая по мощности вышеперечисленным аналогам.
  • PHP Simple HTML DOM Parser – библиотека функций парсинга для PHP, разработанная неким S.C. Chen @ .

    Каждый щелчок на кнопке изменяет отображаемую ссылку. Ниже представлена ​​форма с кнопкой. Следующая ссылка. Когда он достигает количества доступных ссылок, он снова устанавливается в 0. Таким образом, пользователь может беспрестанно кликать по доступным ссылкам. Но это только одна половина задачи. Кроме того, также должен быть установлен или изменен видимый, интерактивный текст ссылки.

    В области тела три примера отмечены в примере без дальнейшего форматирования. Обе графики имеют прозрачный фон, что важно, поскольку точки будут чаще появляться позже. Во вводном теге обработчик события загружается в нагрузку. Это вступает в силу, как только документ и графика будут полностью загружены в браузере.

    Главным недостатком является низкая скорость обработки. По этому показателю Simple HTML DOM проигрывает всем своим основным конкурентам. Впрочем, время получения документа по сетевым интернет-протоколам на порядки превышает продолжительность работы парсера и поэтому данный недостаток принципиален только при больших объёмах информации.

    В следующем примере показано, как это работает. Это примитивный редактор веб-страниц. Здесь пользователь может сами писать содержание страницы. Пример содержит форму со списком выбора, поле ввода и кнопку в теле документа. В поле ввода формы пользователь может ввести текстовое содержимое для выбранного элемента. Однако, прежде чем вставлять новый элемент в структуру документа, сценарий образца должен различать элементы, имеющие текстовое содержимое, и те, у кого их нет. Тем не менее, все другие выбираемые элементы могут иметь текстовое содержимое.

    В числе плюсов - отсутствие проблем с кодировками. Часто бывает, что получив содержимое страницы с помощью, например, file_get_contents, кодировку данных на промежуточном этапе приходится преобразовывать. Здесь же такой надобности у меня пока что не возникало.

    С помощью этой библиотеки вы можете обращаться к элементам и атрибутам элементов, искать определенного уровня вложенные элементы, фильтровать их, искать текст и комментарии(!).

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

    Метод может применяться к узлам, которые могут иметь дочерние узлы. Так, например, узлы элементов. В качестве параметра метод ожидает, что узел будет присоединен как дочерний узел. Исправления, подсказки и дополнения Пожалуйста, не стесняйтесь и сообщите, что не так или неправильно вводит эту страницу, что нужно добавить, чего нет, и т.д. для этого выберите запись Обсудить в меню на странице. Для размещения комментариев не требуется регистрация. Неподходящие сообщения, спам и т.д. будут удалены без комментариев.

    Приведу примеры из документации:

    // Найти ссылки и возвратить массив найденных объектов $ret = $html->find("a"); // Найти (N)-ую по счету ссылку и возвратить найденный объект или null в случае, если объект не найден $ret = $html->find("a", 0); // Найти все элементы , у которых id=foo $ret = $html->find("div"); // Найти все элементы , имеющие атрибут id $ret = $html->find("div"); // Найти все элементы, имеющие атрибут id $ret = $html->find("");

    Использование веб-скребка создает возможность извлекать данные из Интернета и обрабатывать их, что экономит много времени и усилий. Пока структура используемого документа не изменяется, данные из других версий документа могут быть извлечены без необходимости корректировки кода. Предпосылками для использования веб-скребка являются семантически правильная разметка и доступность документа в Интернете. Другие контрольные точки, которые должны быть проверены заранее, - это действительность и правильность документа, которые обычно не поддаются контролю.

    В библиотеку заложена возможность перемещения по списку элементов объектного дерева. Для этого используются:

    $e->children(), $e->parent(), $e->first_child(), $e->last_child(), $e->next_sibling(), $e->prev_sibling().

    Вот так будет выглядеть код с использованием Simple HTML DOM Parser.

    Знает, что не стоит этого делать с помощью регулярных выражений. Проиллюстрировать это утверждение поможет следующий пример.

    Это может быть не особенно полезно, но технически возможно без проблем. После разбора этот код не доставляется в браузер. Конструкция эхо-языка вызывает вывод аргументов в браузер, в этом случае возвращаемое значение функции даты. Если вы будете следить за футболом самостоятельно, вы узнаете, что мы только что запустили международное трансферное окно, и есть миллиард слухов о миллиарде игроков, идущих в миллиард клубов. Следующий скрипт проверяет два веб-сайта на предмет изменений.

    Это решение не имеет особого отношения к простому наблюдению - вы можете использовать этот тип скриптов на любом количестве сайтов. Однако этот сценарий во многих случаях является немного упрощенным. Если вы хотите следить за сайтом, который был чрезвычайно динамический код, вы бы хотели создать регулярные выражения, которые бы изолировали контент только от блока, который вы ищете.

    Возьмем HTML код:

    и многое другое

    К примеру, из него нам нужно получить описание и url сайта. Если брать исключительно этот кусок кода, то все решается достаточно просто:

    $html = "Сайт по программированию парсеров и многое другое"; preg_match("#0){ $html = file_get_html("http://yandex.ru/yandsearch?text=hi".$k."&lr=11114"); // загружаем данные // как-то их обрабатываем $html->clear(); // подчищаем за собой unset($html); $k--; }

    Сначала мы собираемся создать несколько базовых стилей. Это совершенно произвольно - вы можете сделать свой вывод таким, каким хотите. Если вы разбираете большое количество страниц, это может занять больше времени, чем максимальное время выполнения, разрешенное вашим сервером. Например, работая с моей локальной машины, она занимает около одной секунды на страницу.

    В качестве заключительной заметки всегда помните о получении разрешения до соскабливания сайта; это важно. Пример страницы Пример страницы Это простой пример. Каждый элемент может иметь атрибуты, которые контролируют его работу. Значение атрибута может оставаться в кавычках, если оно не содержит пробелов или символов.

    Эти две строчки $html->clear(); и unset($html); лучше писать сразу же после того, как Вы создали объект. Иначе забудете, и скрипт отвалится, забив всю память.

    После того, как html текст упакован в объект, можно приступать непосредственно к поиску нужных элементов.

    Большинство поисковых функций выполняет метод find(selector, ). Если второй аргумент не задан, метод возвращает массив элементов. Если же задан то элемент этого массива с индексом index.

    Пример: скачаем главную страницу моего блога, и выведем все ссылки, которые встретим на своем пути.

    Require_once "simple_html_dom.!="" and count($data->find("a"))){ foreach($data->find("a") as $a){ echo "href."">".$a->plaintext."
    "; } }

    В примере, в качестве селектора я воспользовался названием тега . Но можно использовать и другие CSS селекторы. Элемент на странице можно найти по его атрибутам. В первую очередь, это название тега, id и class. Также могут быть использованы и второстепенные атрибуты, к примеру, href ссылки или width картинки. Если и этих атрибутов нет, то не грех воспользоваться и регулярными выражениями.

    Поиск по названию тега вы уже видели

    $html->find("div")

    поиск по id

    $html->find("#preview")

    поиск по классу

    $html->find(".myclass")

    или комбинированный вариант

    $html->find("#preview div.myclass")

    в данном случае, сначала найдется элемент с id= preview затем в нем найдутся все теги div, и уже среди них фильтруются те у которых class=”myclass”

    Если метод find ничего не нашел и index не задан, то он возвращает пустой массив. Если же index задан, то метод возвращает null.

    Поэтому верным решением будет проверить

    If(count($html->find("#preview div.myclass"))) foreach($html->find("#preview div.myclass") as $div) echo $div->innertext;

    Поиск по наличию атрибута

    $html->find(" img "); // найдет нам все изображения у которых задан атрибут ширина

    или более конкретный поиск по значению атрибута

    $ret = $html->find("img");// найдет все изображения, у которых задана ширина равная 400px

    Такая нотация позволяет искать по двум и более смежным классам

    $ret = $html->find("img");//

    Поиск нескольких тегов

    $html->find("a, img, br,span");

    Поиск вложенных тегов

    $es = $html->find("ul.myclass li");// найдет все li который является потомком ul(возможно и не прямым) $es = $html->find("div.myclass li");// найдет все li в div.myclass

    У каждого найденного элемента также есть метод find

    $html->find("div.myclass li");//найдет все div.myclass а потом все li лежащие в них

    если нам нужно найти все li только первого div’а то мы можем написать так

    $html->find("div.myclass",0)->find("li");

    Поиск по значению атрибута не ограничивается только равенством. Вот доступные условия

    [атрибут] – проверяет есть ли у элемента данный атрибут

    [атрибут=величина] - проверяет, есть ли у элемента данный атрибут и равно ли его значение величине.(div – найдет все div’ы у которых class равен myclass)

    [атрибут!=величина] - проверяет, есть ли у элемента данный атрибут и не равно ли его значение величине.(div – найдет все div’ы у которых class не равен myclassok)

    [атрибут^=величина] - проверяет, есть ли у элемента данный атрибут и начинается ли его значение с величины (div – найдет все div’ы у которых class начинается с my, к примеру myclass и myclassok)

    [атрибут$=величина] - проверяет, есть ли у элемента данный атрибут и заканчивается ли его значение величиной(div – найдет все div’ы у которых class заканчивается на ok, к примеру myclassok, yok, okно не oki)

    [атрибут*=величина] - проверяет, есть ли у элемента данный атрибут и содержит ли его значение в себе величину, в любом месте(div – найдет все div’ы у которых class содержит sok, к примеру myclassok, ysoki, sok)

    Обычный текст можно искать как тег text

    $es = $html->find("text"); // найдет все текстовые блоки в html

    Комментарии находим по тегу comment

    $es = $html->find("comment");

    Каждый найденный элемент и сам $html имеют 5 полей

    $html = str_get_html("foo bar"); echo $html; // выведет foo bar; $e = $html->find("div", 0); echo $e->tag; // Вернет: "div" echo $e->outertext; // Вернет: foo bar echo $e->innertext; // Вернет: foo bar echo $e->plaintext; // Вернет: foo bar

    $e->tag Читает или записывает имя тега элемента.

    $e->outertext Читает или записывает весь HTML элемента, включая его самого.

    $e->innertext Читает или записывает внутренний HTML элемента

    $e->plaintext Читает или записывает простой текст элемента, это эквивалентно функции strip_tags($e->innertext). Хотя поле доступно для записи, запись в него ничего не даст, и исходный html не изменит

    $html = str_get_html("foo barsrc)); if($i>$n)break; // выходим из цикла если скачали достаточно фотографий } } $data->clear();// подчищаем за собой unset($data);

    Как быть если нам нужно больше фото, чем лежит на одной странице?

    Ответ прост: Код, приведенный выше, заключается в функцию, в html помимо фото находим еще и URLвсех страниц, и рекурсивно вызываем данную функцию для этих страниц.

    Require_once "simple_html_dom.php"; function getYandexImages($url,$findpages = true){ static $i = 1; $n = 200; // загружаем данный URL $data = file_get_html($url); // очищаем страницу от лишних данных, это не обязательно, но когда HTML сильно захламлен бывает удобно почистить его, для дальнейшего анализа foreach($data->find("script,link,comment") as $tmp)$tmp->outertext = ""; // находим URL страниц только для первого вызова функции if($findpages and count($data->find("div.b-pager__pages a"))){ foreach($data->find("div.b-pager__pages a") as $a){ // довольно распространенный случай - локальный URL. Поэтому иногда url надо дополнять до полного if(!preg_match("#^http://#",$a->href))$a->href = "http://images.yandex.ru".$a->href; // и еще дна тонкость, & надо заменять на & $a->href = str_replace("&","&",$a->href); // вызываем функцию для каждой страницы getYandexImages($a->href,false); } } // находим все изображения на странице if(count($data->find("div.b-image img"))){ foreach($data->find("div.b-image img") as $img){ // выводим на экран изображение echo "src.""/>"; // и скачиваем его в файл file_put_contents("data/".($i++).".jpg",file_get_contents($img->src)); if($i>$n)exit; // завершаем работу если скачали достаточно фотографий } } $data->clear();// подчищаем за собой unset($data); } // поисковый URL $url = "http://images.yandex.ru/yandsearch?text=".urlencode("Джессика Альба")."&rpt=image"; getYandexImages($url);

    Все хорошо, 200 картинок лежат в папке data. Но их размер слишком мал.

    Поэтому завершающим аккордом нашей практики будет загрузка увеличенной фотографии.

    Для этого определим еще одну функцию

    Function getBigImage($url){ $data = @file_get_contents($url); if(trim($data)=="")return false; // бывает что сайт недоступен, его фото мы не грузим $data = str_get_html($data); // находим фото if(count($data->find("#i-main-pic"))){ $dataimg = @file_get_contents($data->find("#i-main-pic",0)->src); // собачка нужна в если сервер нам вернул 404, это выозвет Warning:, поэтому экранируем ошибки if(trim($dataimg)=="")return false; // фото не доступно, его не грузим file_put_contents("data/".md5($url).".jpg", $dataimg); // сохрпаняем в файл } $data->clear();// подчищаем за собой unset($data); }

    и слегка поправим getYandexImages

    Function getYandexImages($url,$findpages = true){ global $i,$n; // загружаем данный URL $data = @file_get_contents($url); $data = str_get_html($data); // очищаем страницу от лишних данных, это не обязательно, но когда HTML сильно захламлен бывает удобно почистить его, для дальнейшего анализа foreach($data->find("script,link,comment") as $tmp)$tmp->outertext = ""; // находим URL страниц только для первого вызова функции if($findpages and count($data->find("div.b-pager__pages a"))){ foreach($data->find("div.b-pager__pages a") as $a){ // довольно распространенный случай - локальный URL. Поэтому иногда url надо дополнять до полного if(!preg_match("#^http://#",$a->href))$a->href = "http://images.yandex.ru".$a->href; // и еще дна тонкость, & надо заменять на & $a->href = str_replace("&","&",$a->href); // вызываем функцию для каждой страницы getYandexImages($a->href,false); } } // находим все изображения на странице if(count($data->find("div.b-image img"))){ foreach($data->find("div.b-image a") as $a){ if(!preg_match("#^http://#",$a->href))$a->href = "http://images.yandex.ru".$a->href; $a->href = str_replace("&","&",$a->href); getBigImage($a->href); if($i++>=$n)exit; // завершаем работу если скачали достаточно фотографий echo "document.getElementById("counter").innerHTML = "Загружено: ".$i." из ".$n." фото";"; flush(); } } $data->clear();// подчищаем за собой unset($data); } // поисковый URL $i = 1; $n = 20; // будем грабить 20 картинок $url = "http://images.yandex.ru/yandsearch?text=".urlencode("Джессика Альба")."&rpt=image"; getYandexImages($url);

    Вот и все, наслаждаемся фото великолепной Джессики Альбы. Надеюсь меня простит , ведь по сути фото грабится не с их серверов, а с прямиком с сайтов, где они лежат.

    Кроме того это всего лишь демонстрация работы. Думаю никому в здравом уме, не придет в голову парсить Яндекс с помощью file_get_content. Данную библиотеку можно применять и в мирном программировании. К примеру в качестве для CMS. Почему нет, с хорошим кешированием будет очень удобная штука.

    При больших объемах сайтов доноров, неплохо бы разбить все на потоки .

    UPD: Благодаря пользователю Диме, выяснилось, что библиотека обновилась 2011-07-14 и имеет версию 1.5. Нововведений не много, однако самый главный баг, с которым сталкивались все, кто пользовался библиотекой, а именно утечка памяти, устранен. На то она и версия 1.5, а не 2.0. Радует, что проект все же поддерживается и развивается. Ждем новых релизов.

    Рассказать друзьям