Парсим цены на товары (коммодитис) с Блумберга на PHP
Недавно я писал о том, что посещал курсы касаемо фондового рынка. Одним из советов по утрам было смотреть на Bloomberg цены за товарном рынке (commodities).
Дабы совместить полезное с приятным, я написал PHP-скрипт для получения данных о котировках на коммодитис. Для конкретного применения его нужно подработать напильником, однако основной функционал реализован.
Скрипт дергает сайт Блумберга не каждый раз, а не чаще раза в час (используется кэширование).
Пример работы скрипта тут: commodities.php, исходник скачать можно тут.
<?php
// commodities.php
// Парсинг коммодитис с сайта Блумберга
// Parsing commodities price data from Bloomberg
// http://turenko.com/blog/2006/10/17/parsing-bloomberg-commodities-prices-in-php/
// (c) Mikhail Turenko, 17/10/2006, mikhail[at]turenko[dot]net
$data = get_bloomberg_commodities();
$keys = array_keys($data);
print "<table border='1'>\n";
for ($i=0; $i<count($keys); $i++)
{
$name = $keys[$i];
$val = $data[$name];
// $val[0] - цена, $val[1] - изменение,
// $val[2] - в процентах, $val[3] - время
print "<tr><td>$name</td><td>${val[0]}</td><td>${val[3]}</td></tr>\n";
}
print "</table>\n";
// функция для забора данных с bloomberg.com
function get_bloomberg_commodities()
{
// файл кэша (должен иметь права на чтение и запись скриптом)
$cachefile = 'bloom-cfutures.txt';
// максимальный возраст кэша (секунд)
$maxage = 60 * 60;
// адрес, где берем цены на коммодитис
$url = 'http://www.bloomberg.com/markets/commodities/cfutures.html';
if (is_readable($cachefile) && (time() - filemtime($cachefile) < $maxage))
{ // если есть нормальный кэш, читаем из него
$raw = file_get_contents($cachefile);
$data = unserialize($raw);
}
else
{ // иначе парсим блумберг...
// скачиваем страницу
$html = file_get_contents($url);
$data = array();
// интересующие позиции и их названия в качестве ключей
$items = array(
'Нефть' => 'WTI CRUDE FUTURE',
'Газ' => 'NATURAL GAS FUTR',
'Золото' => 'GOLD 100 OZ FUTR',
'Никель' => 'LME NICKEL FUTURE'
);
// перебираем интересующие позиции и выдираем их значения
foreach ($items as $name => $title)
{
if (preg_match("!<td[^>]*>.*$title.*</td>.*<td[^>]*>(.*)</td>.*".
"<td[^>]*>(.*)</td>.*<td[^>]*>(.*)</td>.*<td[^>]*>(.*)</td>!iU", $html, $matches))
{
// первый элемент убираем
array_shift($matches);
// чистим от HTML-тэгов и записываем в массив $data
for ($i=0; $i<count($matches); $i++)
{
$data[$name][$i] = strip_tags($matches[$i]);
}
}
}
// пишем кэш файл, чтобы сильно часто не дергать блумберг
$fp = fopen($cachefile, 'w');
fputs($fp, serialize($data));
fclose($fp);
}
return $data;
}
?>
Добавлено 1 ноября 2006 г.:
краткая инструкция по использованию примера:
1. выделить весь код PHP на странице (Ctrl+Ins);
2. создать новый файл;
3. вставить туда весь код (Shift+Ins);
4. сохранить файл под именем, например, commodities.php;
5. создать и сохранить пустой файл под именем bloom-cfutures.txt
6. назначить права на чтение запись (666 или rw-rw-rw-) файлу bloom-cfutures.txt, чтобы скрипт мог туда писать.
7. запустить скрипт.
Постоянная ссылка ·
Добавьте на news2.ru
Похожие записи:
- Опыт обращения в лавочки по восстановлению данных
- По поводу способов потери данных
- Google Mail не доступен
- Правильное использование интернета для бизнеса



smart said,
Октябрь 17, 2006 @ 19:13
Спасибо за serialize
о существование такой функции и ее применении даже не знал.
Артём said,
Ноябрь 1, 2006 @ 23:25
Спасибо! Давно искал.
Я немного доработаю напильником и поставлю у себя со ссылкой.
Артём said,
Ноябрь 2, 2006 @ 00:55
Михаил, что-то у меня не получается заставить его работать
Могли бы Вы прислать файл php мне на
(e-mail удален, чтобы не попасть к спамерам)?Заранее спасибо!
Mikhail said,
Ноябрь 2, 2006 @ 02:08
2Артём: выслал на почту.
Также внес изменения в пост и файлик выложил сюда: commodities.php.txt - после сохранения, убрать расширение .txt.
Артём said,
Ноябрь 2, 2006 @ 02:27
всё, присылать не надо, заработало
Артём said,
Ноябрь 2, 2006 @ 02:28
ой, не заметил, что уже выслали.
спасибо!
elliot said,
Февраль 1, 2007 @ 04:16
Тема граббинга и парсинга сейчас очень актуальна. Спасибо за статью. Узнал много нового.