Парсер курсов валют на PHP

Author Автор: Роман Чернышов    Опубликовано: 15 мая 2012

Хочу поделиться с вами некоторыми наработками в области парсинга(граббинга), в данном случае речь пойдет о парсинге курсов валют. В качестве донора мы будем рассматривать сайт ЦБРФ, т.к. он всегда поддерживает актуальные данные, всегда доступен и вообще многие сайты берут информацию о курсах именно с него.

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

Я предлагаю рассмотреть два рабочих варианта, два скрипта написанных на 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, а далее уже работать с ними в своем скрипте, сохранять в базу данных и т.д.

Разумеется таким же образом можно получать и другие не менее важные данные с других сайтов доноров.

Оставить комментарий

Автор блога
Чернышов Роман
Роман Чернышов
Веб-разработчик, Full Stack
Senior, Architector
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка