AlexandraSvetik
@AlexandraSvetik

Как спарсить данные с сайта?

Добрый день всем. Прошу помочь. Я только начала учить php хочу спарсить валюту с сайта https://kase.kz/ru/currency/
Вот код который я написала
<?php 
require_once 'simple_html_dom.php';
$data = file_get_html('https://kase.kz/ru/currency/');
$result = [];
if($data->innertext!='' and count($data->find('.currency-tabs__item a  span .big'))){
  foreach($data->find('.currency-tabs__item a') as $a){
    echo '<p>'.$a->plaintext.'</p>';
  }
}
?>

вот ссылка на библиотеку

Я хочу вывести только 3 валюты это евро доллар и рубль
не могу просеять результаты. Скажите что я не так делаю потому что выводит все и не массивом а строками
на скриншоте показала что нужно и нужно только валюта (цифры)
64ae46f2b440b591915479.png
Пыталась перевести данные в массив тоже не получается
вот код
require_once 'simple_html_dom.php';
$data = file_get_html('https://kase.kz/ru/currency/');
if($data->innertext!='' and count($data->find('.currency-tabs__item a  span .big'))){
  foreach($data->find('.currency-tabs__item a') as $a){
    $htmlText = "'<p>'.$a->plaintext.'</p>'";
    $textArray = explode('<p>', $htmlText);
    $textArray = array_filter($textArray, 'strlen');
    print_r($textArray);
  }
}

64ae47a4d4e5a658858239.png
  • Вопрос задан
  • 188 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А не проще парсить напрямую, без цикла?
$usdkzt = $data->find('a[href="#USDKZT"] .currency-round__round .big', 0)->innertext();
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@maksam07
1. Где у вас проверка, что валюта должна быть евро доллар и рубль для вывода?
2. Где вы хотите видеть массив? Вы сами используете plaintext, чтобы вывести строку
3. Еще не до конца понятно, почему вы сначала используете '.currency-tabs__item a span .big', а далее '.currency-tabs__item a'
Ответ написан
Ichi
@Ichi
Увлекаюсь программированием
Если правильно помню, то в цикле можно проверять
if (!in_array($a->href, ['#USDKZT', '#EURKZT']) ) continue;


Как вариант использовать внутренние запросы
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://kase.kz/charts/currency/history',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'symbol=USDKZT_TOM&resolution=D&from=1658040727&to=1658040727&chart_language_code=ru',
  CURLOPT_HTTPHEADER => array(
    'Accept: */*',
    'Content-Type: application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie: __Host-csrftoken=КУКА; ',
    'Referer: https://kase.kz/ru/currency/',
    'X-CSRFToken: ТОКЕН',
    'X-KL-Ajax-Request: Ajax_Request',
    'X-Requested-With: XMLHttpRequest'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;


Правда непонятно, как часто меняются куки и токен, по идее можно делать запрос на получения куки и токена и проверить, когда она "протухнет". Обычно действуют от 1 до 24 часов.
Payload: symbol=USDKZT_TOM&resolution=D&from=1658040727&to=1658040727
Время указываем текущие (или диапазон). Если указать одинаковыми:
{"c": [486.35], "t": [1658102400], "o": [482.0], "v": [131183750], "h": [487.3], "l": [482.0], "s": "ok"}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы