Перейти к содержимому


Парсинг коммерческого курса из Приватбанка UA

парсинг курса приватбанк

  • Вы не можете ответить в тему
Сообщений в теме: 6

#1 FusSheva

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 210 сообщений
Репутация: 7
Начинающий

Отправлено 19 January 2015 - 12:38 PM

Может кому пригодится... ;)
В виду того что в моей стране сейчас бардак и курс доллара скачет как некоторые на майдане... (но не будем о политике и грустном).
Короче, магазин работает в основном через Приватбанк Украины. Цены меняются в зависимости от курса доллара, потому как товар закупается за валюту и в основном из-за рубежа.
Но курс Приватбанка не обычный, В отделениях, а так называемый коммерческий, Курсы карт и пополнения вкладов по которому меняют при покупке товара онлайн гривны на доллары.

Так вот, иногда просто забываю посмотреть на сайте Приватбанка этот коммерческий курс доллара.
https://privatbank.ua/ - внизу страницы справа висит вот такой виджет:

Прикрепленный файл  IMG_19.01.2015-11.57.23.jpg   56.5К   1 Количество загрузок:

В этой связи родилась идея, отображать этот коммерческий курс прямо в админке магазина (так как там бываю намного чаще). :)
Решил сделать небольшой парсинг этого коммерческого курса. Погуглив так как с парсингом сталкиваюсь впервые, на свет родился вот такой вот код.
Прошу сильно не пинать, и подозреваю что можно сделать еще проще. Но во всяком случае этот код работает тоже:

И так...

1. Создаем файл core/includes/admin/privat_curs.php
<?
$file = fopen('Полный\\путь\\к\\файлу\\core\\temp\\curs.txt','w'); // полный путь файлу
$cont = file_get_contents("https://privatbank.ua/"); // адрес откуда будем парсить
fputs($file,$cont,strlen($cont));
fclose($file);
if (file_exists("Полный\\путь\\к\\файлу\\core\\temp\\curs.txt")) {
$f = file("Полный\\путь\\к\\файлу\\core\\temp\\curs.txt");
$search = "id='selectByCard'"; // ищем строку индификатор
$i = 0;
while ($i < sizeof($f)&& strpos($f[$i], $search) == false) {
$i++;
}
$stroka = $i+14; // находим строку с коммерческим курсом Приватбанка
$parse  = "$f[$stroka]"; // присваиваем переменной нужную строку
$remov = array("<td width=\"25%\" style=\"text-align:right;\">", "", "</td>"); // указываем что лишнее нужно будет удалить
$thatleave  = array("", $f[$stroka], ""); // оставляем только цифры коммерческого курса
$curs = str_replace($remov, $thatleave, $parse); // меняем/собираем все вместе
} else { // если нет файла (не загрузился по каким то причинам)
$curs .= "UPS"; // будем выводить эту фразу или какую сами пропишите
}
// создаем пару-ключ smarty для вывода информации
$smarty->assign("curs_ptivat", $curs); // в нужном нам месте шаблона админки выводим курс тегом {$curs_ptivat}
?>

2. Меняем в коде полный путь к файлу core\temp\curs.txt на свой (сам файл потом создается автоматически).
3. В шаблоне админки в нужном вам месте прописываем следующий код:
{$curs_ptivat}

Прописывается вывод курса в core\tpl\admin\index.tpl.html шаблона админки там, где вам будет удобно.
У меня это прописано вверху слева, в шапке, вместе с выводом статусов заказов (смотрите соответствующий мод для этого тут на форуме).

Кажись всё. Удачи в бизнесе!

p.s. Кто оптимизирует работу парсинга или предложит что либо лучшее - буду только рад.
Мои мысли и действия см. в комментариях кода.

p.p.s. Кстати, сначала делал вот так:
<?
$file = fopen('Полный\\путь\\к\\файлу\\core\\temp\\curs\\curs.txt','w');
$cont = file_get_contents("https://privatbank.ua/");
fputs($file,$cont,strlen($cont));
fclose($file);
if (file_exists("Полный\\путь\\к\\файлу\\core\\temp\\curs\\curs.txt")) {
$f = file("Полный\\путь\\к\\файлу\\core\\temp\\curs\\curs.txt");
$search = "id='selectByCard'";
$i = 0;
while ($i < sizeof($f)&& strpos($f[$i], $search) == false) {
$i++;
}
$stroka = $i+14;
$curs =  "USD/UAH: ".str_replace("cursid=", "", $f[$stroka])."";
} else {
$curs .= "UPS";
}  
echo $curs;
?>

Но в этом случае мы вытягиваем полностью строку типа:
<td style="text-align:right;" width="25%">21.0084</td>
Которая в конечном счете ломала шаблон админки из-за лишних тегов.
По этому сделал именно так как расписано в шапке темы.
  • 0
Каждый человек способен на многое. Но к сожалению, не каждый знает на что он способен.

#2 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 19 January 2015 - 01:25 PM

1. Зачем получив HTML-код страницы приват банка сохранять его в файл, а затем доставать из этого файла? :)
Почему вместо

$file = fopen('Полный\\путь\\к\\файлу\\core\\temp\\curs\\curs.txt','w');
$cont = file_get_contents("https://privatbank.ua/");
fputs($file,$cont,strlen($cont));
fclose($file);
if (file_exists("Полный\\путь\\к\\файлу\\core\\temp\\curs\\curs.txt")) {
$f = file("Полный\\путь\\к\\файлу\\core\\temp\\curs\\curs.txt");

не сделать

$f = file_get_contents("https://privatbank.ua/");

2. Целевой набор символов (курс) легко вылавливается регулярным выражением, т.е. кодом в одну строку. Хотя, это на вкус и цвет. Какая разница, как вылавливать :).
3. Почему не сделать еще шажок и не прописывать этот выловленный курс (курсы) автоматически в базу?
Т.е. в базу пишем дату и курс (надо будет добавить поле даты к таблице валют).
В коде проверяем, наступил ли "час X", т.е. время проверки курса.
Если наступил, то смотрим дату текущего курса.
Если она не сегодняшняя, значит, курс еще не меняли/проверяли.
Соответственно, проверяем/сохраняем.
Ну и проверки/ограничения.
Чтобы, скажем, курс не менялся при изменении курса более чем на 50% от вчерашнего (защита от опечатки на стороне приват-банка).
И если изменение больше (а также если не удалось выделить курс из страницы либо страница недоступна, либо еще чего) - письмо админу.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#3 FusSheva

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 210 сообщений
Репутация: 7
Начинающий

Отправлено 19 January 2015 - 04:44 PM

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

А обрабатывать страницу налету не загоняя в файл - отличная идея. Попробуем на досуге реализовать.
  • 0
Каждый человек способен на многое. Но к сожалению, не каждый знает на что он способен.

#4 FusSheva

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 210 сообщений
Репутация: 7
Начинающий

Отправлено 25 February 2015 - 03:16 PM

Недавно столкнулся с проблемкой. На одном из серверов где ставил этот парсер в php.ini была отключена функция allow_url_fopen пришлось переделывать парсер и использовать функцию cURL
В итоге получилось запустить работу парсера вот так:

<?
 $url  = 'https://privatbank.ua/ua/';
 $path = 'Полный/путь/к/файлу/core/temp/curs.txt';
 
$fp = fopen($path, 'w');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);
$data = curl_exec($ch);
curl_close($ch);
fclose($fp);

if (file_exists("Полный/путь/к/файлу/core/temp/curs.txt'")) {
$f = file("Полный/путь/к/файлу/core/temp/curs.txt'");
$search = "id='selectByCard'"; // ищем строку индификатор
$i = 0;
while ($i < sizeof($f)&& strpos($f[$i], $search) == false) {
$i++;
}
$stroka = $i+14; // находим строку с коммерческим курсом Приватбанка
$parse  = "$f[$stroka]"; // присваиваем переменной нужную строку
$remov = array("<td width=\"25%\" style=\"text-align:right;\">", "", "</td>"); // указываем что лишнее нужно будет удалить
$thatleave  = array("", $f[$stroka], ""); // оставляем только цифры коммерческого курса
$curs = str_replace($remov, $thatleave, $parse); // меняем/собираем все вместе
} else { // если нет файла (не загрузился по каким то причинам)
$curs .= "UPS"; // будем выводить эту фразу или какую сами пропишите
}
// создаем пару-ключ smarty для вывода информации
$smarty->assign("curs_ptivat", $curs); // в нужном нам месте шаблона админки выводим курс тегом {$curs_ptivat}
?>

p.s. Кстати, двойные обратные слеши (как в примере в шапке темы) нужно ставить на Windows серверах.
А под Linux нужно как в этом коде.
  • 0
Каждый человек способен на многое. Но к сожалению, не каждый знает на что он способен.

#5 Den

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 117 сообщений
Репутация: 0
Начинающий

Отправлено 17 December 2015 - 06:00 PM

По мотивам топикстартера сделал парсинг курса для черного рынка. Он есть на kurs.com.ua и на minfin.com.ua. Первому доверяю больше, но там так все заскриптовано, что вытянуть нужную информацию не смог, сделал для минфина. Прикладываю образец для евро:
<?
ini_set('user_agent','Mozilla/4.0 (compatible; MSIE 6.0)');
$f = file_get_contents("http://minfin.com.ua/currency/auction/eur/buy/all/");
preg_match("/\<small class\=\"au-mid-buysell--title\"\>Средняя продажа:\<\/small\>[\s\S]*?(\d\d,\d\d)/i", $f, $eur);
$euro = str_replace(",", ".", $eur[1]);
$smarty->assign("euro_minfin", $euro);
?>

  • 0

#6 FusSheva

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 210 сообщений
Репутация: 7
Начинающий

Отправлено 18 December 2015 - 11:44 AM

Как то не понял работу переменной $eur ?

Верней какое и где присваивается ей значение?
  • 0
Каждый человек способен на многое. Но к сожалению, не каждый знает на что он способен.

#7 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 18 December 2015 - 12:58 PM

Верней какое и где присваивается ей значение?

функция preg_match заносит найденное в массив, передаваемый по ссылке, а возвращает true/false было ли найдено хоть одно соответствие регулярке.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)