Описание: Подмогите с реализацией |
Поиск в теме | Версия для печати |
defenderyk |
Отправлено: 10 Ноября, 2008 - 12:50:05
|
Super Member
Покинул форум
Сообщений всего: 709
Дата рег-ции: Окт. 2007
Откуда: Россия
Карма 3
|
Вот наткнулся на такой парсер курсов валют. Вроде на первый взгляд все нормально, но в течении теста оказалось, что курсы по непонятным для меня причинам разнатся с теми, что на сайте ЦБ.
И не понял с какой частотой идет обновление инфы в файл.
Сам код. К нему еще прилагается папка downloads в которую и парсится инфо:
CODE:
<?
* Версия: 1.1
* комерческое использование этого скрипта только с разрешения автора
*************************************************************/
function getTodayFileName(){
return 'downloads/kurs_valut_'.date('dmy').'.htm';
}
function getYesterdayFileName(){
return 'downloads/kurs_valut_'.date("dmy",mktime(0,0,0,date("m") ,date("d")-1,date("Y"))).'.htm';
}
function getValKurs(&$val,$date=null){
if($date==null) $date = date("d/m/Y");
$link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date";
// Загружаем HTML-страницу
$fd = fopen($link, "r");
$content="";
if($fd){
// Чтение содержимого файла в переменную $content
while(!feof ($fd)) $content .= fgets($fd, 4096);
} else return;
// Закрыть открытый файловый дескриптор
fclose ($fd);
// Разбираем содержимое, при помощи регулярных выражений
$pattern = "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i";
preg_match_all($pattern, $content, $out, PREG_SET_ORDER);
$val['dollar'] = "";
$val['euro'] = "";
foreach($out as $cur){
if($cur[2] == 840) $val['dollar'] = doubleVal(str_replace(",",".",$cur[4]));
if($cur[2] == 978) $val['euro'] = doubleVal(str_replace(",",".",$cur[4]));
}
}
if(!file_exists(getTodayFileName())){
$val_today = array();
$val_yesterday = array();
// получаем курсы валют
getValKurs($val_today);
getValKurs($val_yesterday,date("d/m/Y",mktime(0,0,0,date("m") ,date("d")-1,date("Y"))));
// ставим признак, поднялся курс или нет
$dollar_up = ($val_today['dollar']-$val_yesterday['dollar'] > 0 ? true : false);
$euro_up = ($val_today['euro']-$val_yesterday['euro'] > 0 ? true : false);
tempnam('downloads',getTodayFileName());
$fp = fopen(getTodayFileName(), "w");
// пошел HTML код со вставкой полученных данных курсов валют, имените его как вам необходимо
fwrite($fp,'
<table border="1" cellpadding="5" cellspacing="0">
<tr>
<td colspan="2">Курс валют на '.date('d/m/Y').'</td>
</tr>
<tr>
<td>'.($dollar_up ? 'поднялся' : 'опустился').' <strong>USD</strong> ЦБ РФ </td>
<td align="center"><strong>'.$val_today['dollar'].'</strong></td>
</tr>
<tr>
<td>'.($euro_up ? 'поднялся' : 'опустился').' <strong>EUR</strong> ЦБ РФ </td>
<td align="center"><strong>'.$val_today['euro'].'</strong></td>
</tr>
</table>
');
fclose($fp);
if(file_exists(getYesterdayFileName())) unlink(getYesterdayFileName());
} readfile(getTodayFileName());
?>
И можно ли сделать подобное с погодой например с гисметео или рамблера, чтобы парсился раз в 4 часа вместе с картинками. и уже вывод инфы шел с сервера сайта.
Во первых это уменьшит нагрузку на сервер, и что не менее важно сэкономит трафик. |
|
|
Furax |
Отправлено: 11 Ноября, 2008 - 08:09:38
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Парсится? Да, однажды в сутки. Этот код нехорош, кстати, ещё и тем, что будет неправильно работать, если между двумя обращениями к нему пройдёт больше одного дня.
5 минут - это несущественно, проблема, видимо, действительно в частом обновлении данных на удалённом сервере.
Засунуть в базу - как раз это весьма просто: надо создать таблицу вида id|дата|валюта|курс, в которой старые строки будут постепенно стираться, а новые - добавляться. Для гисметео, очевидно, понадобится другой парсер, поскольку код страницы другой. Но вообще, ИМХО, гораздо правильнее вставить стандартную кнопку Гисметео: и траффика на хостинге меньше тратится, и проблем меньше, и не придётся дёргаться, если Гисметео вдруг дизайн сменит. |
|
|
defenderyk |
Отправлено: 11 Ноября, 2008 - 15:18:55
|
Super Member
Покинул форум
Сообщений всего: 709
Дата рег-ции: Окт. 2007
Откуда: Россия
Карма 3
|
сайт локален для города, а если ставить обычный инфыормер, то он идет с внешки и тем самым сайт не на 100% локален получается.awep пишет:а вообще есть сайт http://rp5.ru , там погоду можно экспортировать в RSS, XML, их парсить просто.
Это я знаю, но вся проблема в том, что для меня это не просто...Furax пишет:Засунуть в базу - как раз это весьма просто: надо создать таблицу вида i
Алгоритм действий я тоже знаю) но я не знаю как это реализовывается |
|
|
Furax |
Отправлено: 12 Ноября, 2008 - 07:59:06
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Создание таблицы:CODE:CREATE TABLE `currency` (
`id` INT NOT NULL ,
`currency` INT NOT NULL ,
`date` TIMESTAMP NOT NULL ,
`value` FLOAT NOT NULL ,
PRIMARY KEY ( `id` )
); Далее, получив, например, переменную $dollar для доллара (в Твоём коде она называлась $val_today['dollar']), нужно отправить её в эту таблицу:CODE:mysql_query("INSERT INTO `currency` (`id`, `currency`, `date`, `value`) VALUES (NULL, 1, NOW(), $dollar)"); Здесь единица - код валюты (напрмер, 1 для доллара, 2 - для евро и так далее; этот код может также совпадать с кодом в базе CBR, но это не обязательно). Получить последнюю запись можно так:CODE:list($value, $date) = mysql_fetch_row(mysql_query('SELECT `value`, `date` FROM `currency` WHERE `currency` = 1 ORDER BY `date` DESC LIMIT 1')); |
|
|
|
Поиск в теме | Версия для печати |
Страниц (1): [1] |
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0, скрытых: 0) |
« PHP/Perl » |
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
|
|
|