Парсер валют на php

Парсим курсы валют на php и кешируем их в 1с-Битрикс

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

Поэтому сейчас мы сделаем парсер курса валют на php с сайта cbr.ru, отобразим динамику изменения курса и в конце закешируем полученные данные для эффективного использования в 1с-Битрикс.

Получаем и обрабатываем данные

Самые свежие данные мы будем получать из xml-файла, который совершенно бесплатно предоставляет нам сайт cbr.ru. Адрес файла имеет вид — http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=10/02/2011&date_req2=26/02/2011&VAL_NM_RQ=R01235

Здесь date_req1 — дата начала периода; date_req2 — дата конца периода, за который нужна динамика; VAL_NM_RQ — идентификатор валюты (R01235 для USD, R01239 для EUR)

Структура полученного xml-файла такова:

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

// формируем 2 даты - "завтра" и несколько дней назад $curDate = date('d/m/Y', mktime(0,0,0,date("n"),date("j")+1,date("Y"))); $curDate2 = date('d/m/Y', mktime(0,0,0,date("n"),date("j")-10,date("Y"))); // xml с сайта ЦБ РФ $currencyXML = file_get_contents('http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.$curDate2.'&date_req2='.$curDate.'&VAL_NM_RQ=R01235'); // убираем переносы строк $currencyXML = str_replace(Array("\r\n","\n","\r"),'',$currencyXML); // регулярное выражение получает все значения тегов в массив $arValues preg_match_all('#(.*?)#', $currencyXML, $arValues, PREG_PATTERN_ORDER); // если совпадений больше одного, т.е. в xml были данные как минимум за 2 дня и можно отследить динамику if(count($arValues[1])>=2) < // развернем массив, чтобы первыми шли свежие данные $arValues[1] = array_reverse($arValues[1]); // сделаем резделителем целой и дробной части точку $kurs = str_replace(",",".",$arValues[1][0]); // разница курсов, округленная до 4х знаков после запятой $diff = round(floatval(str_replace(",",".",$arValues[1][0])) - floatval(str_replace(",",".",$arValues[1][1])), 4); >

«Завтра» и «несколько дней назад» выбраны не просто так — курс валюты иногда появляется заранее, а иногда не появляется вообще, например по воскресеньям или праздникам.
Теперь можно вывести в нужном месте значения переменных $kurs и $diff и радоваться полученному результату:)

Но дергать xml на каждом хите пользователя нехорошо, поэтому все это дело нужно закешировать

Кешируем результат в 1с-Битрикс

Кешировать будем результирующий html-код, для этого используем класс CPageCache.

 USD:  
Изменение: EndDataCache(); endif; ?>

Пара слов о выборе времени кеширования и идентификатора кеша. Так как на всех страницах сайта результат работы скрипта одинаковый, то есть смысл оставить идентификатором константу, тогда будет один периодически обновляемый (6 часов в примере) файл кеша. Также можно привязать идентификатор к дате и увеличить время жизни кеша, тогда новые данные будут тянуться ровно 1 раз в сутки, но на каждый день появится отдельный файл.

Источник

Парсер курса доллара на PHP (функция)

Печать PDF

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

Брать на прямую данные с сайта cbr.ru не особо правильно, так как придется загружать всю их страницу, а потом с ней работать. К счастью у них есть XML видимо специально для разработчиков. Вот именно оттуда мы и будем брать курс по id валюты. Где взять id валюты? Да в том же XML файле http://www.cbr.ru/scripts/XML_daily.asp?date_req=06.03.2012 ищем нужную нам валюту и запомниаем его id (к примеру R01135)

Собственно перейдем к написанию кода

function valuta($id) $date = date(«d/m/Y»);
$link = «http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date»;
$str = file_get_contents ($link);
preg_match(‘#.*?.(.*?).*?#is’, $str, $value);
preg_match(‘#.*?.(.*?).*?#is’, $str, $code);
$write = $code[1].’ ‘.$value[1];
return $write;
>
echo valuta(‘R01239’);

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

К счастю выход есть всегда — сделать кеш.

Приступим к добавлению кеша в функцию

function valuta($id) $cache=0;
$time_cache=10800; // время жизни кеша
$time = time();
if(file_exists($id)) $str = file_get_contents($id);
$str = explode(«:», $str);
if($str[0] <$time) $cache=1;
>
else return $str[1];
>
>
else $cache=1;
>
if($cache==1) $date = date(«d/m/Y»);
$link = «http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date»;
$str = file_get_contents ($link);
preg_match(‘#.*?.(.*?).*?#is’, $str, $value);
preg_match(‘#.*?.(.*?).*?#is’, $str, $code);
if($value[1]!=») $write = $code[1].’ ‘.$value[1];
file_put_contents($id, $time+$time_cache.’:’.$write);
return $write;
>
>
>

echo valuta(‘R01239’);
echo «
«;
echo valuta(‘R01235’);

Вот теперь все. Скрипт записывает полученные данные в файл и при последующих обращениях берет данные из файла при условии что кеш актуален.

Вот что у меня выводит данный скрипт:

Источник

Получаем курсы валют с сайта Центробанка на PHP

В некоторых случаях при работе с коммерцией возникает необходимость получения актуальной информации о курсе той или иной валюты. Центробанк – лучший источник таких данных, а учитывая то, что он предоставляет открытую и своевременно обновляемую информацию о курсе валют в формате XML – грех ею не воспользоваться.

Я рад поделиться с вами своей небольшой функцией, которая отлично справляется с описанной в заголовке задачей, а именно – бесплатным получением курса валют ЦБ РФ на PHP.

Функция эта выглядит следующим образом:

 function get_currency($currency_code, $format) { $date = date('d/m/Y'); // Текущая дата $cache_time_out = 14400; // Время жизни кэша в секундах $file_currency_cache = './currency.xml'; // Файл кэша if(!is_file($file_currency_cache) || filemtime($file_currency_cache) < (time() - $cache_time_out)) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.cbr.ru/scripts/XML_daily.asp?date_req='.$date); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $out = curl_exec($ch); curl_close($ch); file_put_contents($file_currency_cache, $out); >$content_currency = simplexml_load_file($file_currency_cache); return number_format(str_replace(',', '.', $content_currency->xpath('Valute[CharCode="'.$currency_code.'"]')[0]->Value), $format); >
 $date = date('d/m/Y'); // Текущая дата $cache_time_out = 14400; // Время жизни кэша в секундах

отвечают за дату (в нашем случае она текущая) и время жизни кэша соответственно. Поскольку ЦБ не так часто обновляет данные о валютах, не стоит докучать ему просто так при каждом их использовании. Значения в этих строках (по желанию) можете изменить на свои.

Использование функции следующее:

Здесь «USD» – символьный код валюты (в нашем случае – это доллар США), а «3» – количество знаков после запятой.

Допустимый перечень валют, предоставляемых ЦБ РФ (на момент написания статьи) в виде «символьный код валюты – номинал и название»:

 AUD – 1 австралийский доллар AZN – 1 азербайджанский манат GBP – 1 фунт стерлингов Соединенного королевства AMD – 100 армянских драмов BYN – 1 белорусский рубль BGN – 1 болгарский лев BRL – 1 бразильский реал HUF – 100 венгерских форинтов HKD – 10 гонконгских долларов DKK – 10 датских крон USD – 1 доллар США EUR – 1 евро INR – 100 индийских рупий KZT – 100 казахстанских тенге CAD – 1 канадский доллар KGS – 100 киргизских сомов CNY – 10 китайских юаней MDL – 10 молдавских леев NOK – 10 норвежских крон PLN – 1 польский злотый RON – 1 румынский лей XDR – 1 СДР (специальные права заимствования) SGD – 1 сингапурский доллар TJS – 10 таджикских сомони TRY – 1 турецкая лира TMT – 1 новый туркменский манат UZS – 10 000 узбекских сумов UAH – 10 украинских гривен CZK – 10 чешских крон SEK - 10 шведских крон CHF – 1 швейцарский франк ZAR – 10 южноафриканских рэндов KRW – 1 000 вон Республики Корея

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

Источник

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

Author

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

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

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

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

Вариант первый, DOM, таблицы.

 $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,', 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.

 $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) } print_r($curs);

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

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

CategoryPHP Tagsphp, парсер

Похожие записи

Источник

Читайте также:  Less or equal java
Оцените статью