Strict Standards: Resource ID#33 used as offset, casting to integer (33) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#35 used as offset, casting to integer (35) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#36 used as offset, casting to integer (36) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: Парсер курсов валют и погоды. Нужна помощь...
ТвойWeb » WebMaster класс » PHP/Perl » Парсер курсов валют и погоды. Нужна помощь...

Страниц (1): [1]
 

1. defenderyk - 10 Ноября, 2008 - 12:50:05 - перейти к сообщению
Вот наткнулся на такой парсер курсов валют. Вроде на первый взгляд все нормально, но в течении теста оказалось, что курсы по непонятным для меня причинам разнатся с теми, что на сайте ЦБ.
И не понял с какой частотой идет обновление инфы в файл.

Сам код. К нему еще прилагается папка 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 ? 'поднялся' : 'опустился').'&nbsp;&nbsp;&nbsp;&nbsp;<strong>USD</strong> ЦБ РФ </td>
<td align="center"><strong>'.$val_today['dollar'].'</strong></td>
</tr>
<tr>
<td>'.($euro_up ? 'поднялся' : 'опустился').'&nbsp;&nbsp;&nbsp;&nbsp;<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 часа вместе с картинками. и уже вывод инфы шел с сервера сайта.
Во первых это уменьшит нагрузку на сервер, и что не менее важно сэкономит трафик.
2. Furax - 11 Ноября, 2008 - 05:08:23 - перейти к сообщению
defenderyk
Отображаемые значения совпадают с какой-то другой валютой? Правильно ли идут часы на сервере?
3. defenderyk - 11 Ноября, 2008 - 05:15:18 - перейти к сообщению
Нет, ни с какой другой не совпадают. Код валюты указан правильно. видимо курсы все же меняются не один раз в сутки. А парсится видимо один раз в сутки. И можно ли этот парсер засунуть в базу данных и тоже самое проделать с парсером погоды, если кто знает как его можно реализовать. Растерялся

На сервере часы на 5 мин. отстают от Московского.
4. Furax - 11 Ноября, 2008 - 08:09:38 - перейти к сообщению
Парсится? Да, однажды в сутки. Этот код нехорош, кстати, ещё и тем, что будет неправильно работать, если между двумя обращениями к нему пройдёт больше одного дня.

5 минут - это несущественно, проблема, видимо, действительно в частом обновлении данных на удалённом сервере.

Засунуть в базу - как раз это весьма просто: надо создать таблицу вида id|дата|валюта|курс, в которой старые строки будут постепенно стираться, а новые - добавляться. Для гисметео, очевидно, понадобится другой парсер, поскольку код страницы другой. Но вообще, ИМХО, гораздо правильнее вставить стандартную кнопку Гисметео: и траффика на хостинге меньше тратится, и проблем меньше, и не придётся дёргаться, если Гисметео вдруг дизайн сменит.
5. awep - 11 Ноября, 2008 - 11:42:29 - перейти к сообщению
Погоду можно выдергивать из http://pda.gismeteo.ru/ и http://wap.gismeteo.ru - скорее всего, дизайн там меняться не будет.
а вообще есть сайт http://rp5.ru , там погоду можно экспортировать в RSS, XML, их парсить просто.
6. defenderyk - 11 Ноября, 2008 - 15:18:55 - перейти к сообщению
сайт локален для города, а если ставить обычный инфыормер, то он идет с внешки и тем самым сайт не на 100% локален получается.
awep пишет:
а вообще есть сайт http://rp5.ru , там погоду можно экспортировать в RSS, XML, их парсить просто.


Это я знаю, но вся проблема в том, что для меня это не просто...
Furax пишет:
Засунуть в базу - как раз это весьма просто: надо создать таблицу вида i


Алгоритм действий я тоже знаю) но я не знаю как это реализовывается Ниндзя
7. Furax - 11 Ноября, 2008 - 23:42:01 - перейти к сообщению
В смысле? Тебе SQL-код написать?
8. defenderyk - 12 Ноября, 2008 - 04:23:44 - перейти к сообщению
это конечно идеальный вариант Растерялся
9. Furax - 12 Ноября, 2008 - 07:59:06 - перейти к сообщению
Создание таблицы:
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'));

Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0367]     [ Gzipped ]