Парсим цены на товары (коммодитис) с Блумберга на 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

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


7 Комментариев »

  1. smart said,

    Октябрь 17, 2006 @ 19:13

    Спасибо за serialize :) о существование такой функции и ее применении даже не знал.

  2. Артём said,

    Ноябрь 1, 2006 @ 23:25

    Спасибо! Давно искал.

    Я немного доработаю напильником и поставлю у себя со ссылкой.

  3. Артём said,

    Ноябрь 2, 2006 @ 00:55

    Михаил, что-то у меня не получается заставить его работать :-(

    Могли бы Вы прислать файл php мне на (e-mail удален, чтобы не попасть к спамерам)?

    Заранее спасибо!

  4. Mikhail said,

    Ноябрь 2, 2006 @ 02:08

    2Артём: выслал на почту.
    Также внес изменения в пост и файлик выложил сюда: commodities.php.txt - после сохранения, убрать расширение .txt.

  5. Артём said,

    Ноябрь 2, 2006 @ 02:27

    всё, присылать не надо, заработало ;-)

  6. Артём said,

    Ноябрь 2, 2006 @ 02:28

    ой, не заметил, что уже выслали.
    спасибо!

  7. elliot said,

    Февраль 1, 2007 @ 04:16

    Тема граббинга и парсинга сейчас очень актуальна. Спасибо за статью. Узнал много нового.

RSS feed for comments on this post · TrackBack URI.

Прокомментируйте