Парсер курсов валют на PHP
Хочу поделиться с вами некоторыми наработками в области парсинга(граббинга), в данном случае речь пойдет о парсинге курсов валют. В качестве донора мы будем рассматривать сайт ЦБРФ, т.к. он всегда поддерживает актуальные данные, всегда доступен и вообще многие сайты берут информацию о курсах именно с него.
Для чего нам парсить курсы валют, думаю на этот вопрос каждый сможет ответить сам, ведь очень часто в проектах связанных с недвижимостью, финансами, банками или вообще любой другой торговой деятельностью возникает нужда представлять цены в валютах разных стран (да еще и с автоматическим конвертированием).
Я предлагаю рассмотреть два рабочих варианта, два скрипта написанных на PHP, но работающих по разному с данными в разных форматах. Тем самым не только достичь поставленной цели, а также научится парсить HTML(разбором дерева DOM) таблицы и XML потоки.
Вариант первый, DOM, таблицы.
<?php $date = date('d.m.Y'); $url="http://www.cbr.ru/currency_base/D_print.aspx?date_req=$date"; // URL страницы с курсами валют на сегодня $html = file_get_contents($url); // Читаем содержимое HTML страницы $charset = 'UTF-8'; // кодировка получаемой страницы // на данном этапе, находим на в коде блок с классом header2, и все что до него удаляем, т.к. оно нам ненужно, там содержится ненужная нам информация $pos=mb_strpos($html,'<table class="CBRTBL">', 0, $charset); // позиция $html=mb_substr($html,$pos,mb_strlen($html, $charset), $charset); // обрезаем до указанной позиции, удаляя все лишнее $dom = new domDocument; // создаем объект дерева DOM $dom->loadHTML($html); // загружаем в него спарсенную страницу $dom->preserveWhiteSpace = false; //echo $html; $tables = $dom->getElementsByTagName('table'); // получаем из дерева DOM первую таблицу, ею является как раз таблица содержащая курсы валют $rows = $tables->item(0)->getElementsByTagName('tr'); // получаем из таблицы все строки $i=0; $curs = array(); // массив который будет хранить данные foreach ($rows as $row) // беребор полученных строк { if($i==0) {$i++; continue;} // первую строку пропускаем, т.к. она содержит заголовки столбцов а не данные $cols = $row->getElementsByTagName('td'); // разбираем все строки по столбцам // записываем в полученные данные в массив, для удобного представления и работы дальше $curs[$i][0]=$cols->item(0)->nodeValue; // Цифр. код $curs[$i][1]=$cols->item(1)->nodeValue; // Букв. код $curs[$i][2]=$cols->item(2)->nodeValue; // Единиц $curs[$i][3]=$cols->item(3)->nodeValue; // Валюта $curs[$i][4]=$cols->item(4)->nodeValue; // Курс $i++; } print_r($curs);// выводим полученный массив |
Вариант второй, XML.
<?php $url = "http://www.cbr.ru/scripts/XML_daily.asp"; // URL, XML документ, всегда содержит актуальные данные $curs = array(); // массив с данными // функция полчуния даты из спарсенного XML function get_timestamp($date) { list($d, $m, $y) = explode('.', $date); return mktime(0, 0, 0, $m, $d, $y); } if(!$xml=simplexml_load_file($url)) die('Ошибка загрузки XML'); // загружаем полученный документ в дерево XML $curs['date']=get_timestamp($xml->attributes()->Date); // получаем текущую дату foreach($xml->Valute as $m){ // перебор всех значений // для примера будем получать значения курсов лишь для двух валют USD и EUR if($m->CharCode=="USD" || $m->CharCode=="EUR"){ $curs[(string)$m->CharCode]=(float)str_replace(",", ".", (string)$m->Value); // запись значений в массив } } print_r($curs); |
Вот два простых примера как можно быстро получать всегда актуальные данные курсов валют с помощью PHP, а далее уже работать с ними в своем скрипте, сохранять в базу данных и т.д.
Разумеется таким же образом можно получать и другие не менее важные данные с других сайтов доноров.

Автор:






