mail@vecdev.ru

Медальный зачет олимпиады Пекин-2022 на свой сайт CURL+PHP на Битриксе

Я решила подтянуть данные медального зачета Зимней олимпиады Пекин-2022, которая проходит в Китае при помощи CURL и PHP. Данные брались с сайта Комсомольской правды. Далее я отдавала сформированный массив через JSON, а принимала в инфоблоке при помощи AJAX. Результаты в конце статьи, но обо всем по порядку.

Формирование массива данных Олимпийских медалей всех стран с помощью CURL

Для начала нужно забрать страницу медального зачета со стороннего сайта при помощи CURL.

$feed = 'https://www.kp.ru/sports/olimpiada-2022-v-pekine/medalnyj-zachet-olimpiady-2022/';
$ch = curl_init($feed);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);
$dom = new DOMDocument();
$dom->loadHTML($html);
$arResult = array(); // в этот массив будем собирать все данные

В итоге у нас на руках будет DOM объект всей страницы медального зачета Зимней олимпиады 2022 с сайта Комсомольской правды, но нам нужна только таблица медального зачета, так что делаем выборку. Искать буду таблицу по тегу TABLE.


foreach ($dom->getElementsByTagName('table') as $table) { // нахожу таблицу    $class = $table->getAttribute("class"); // получаю класс таблицы
    if (strpos($class, 'main-table__table--medals') !== false) { //если таблица моя по классу
        foreach ($table->getElementsByTagName('tr') as $tr) { //нахожу строку таблицы
            $flag = 0;
            foreach ($tr->getElementsByTagName('td') as $td) { //нахожу ячейку строки в строке
                $td_class = $td->getAttribute("class"); // получаю класс ячейки
                // если класс в таблице соответствует порядковому номеру, то беру его и запоминаю как ключ массива
                if (strpos($td_class, 'main-table__place') !== false) {
                    $flag = $td->textContent;
                    $arResult[$td->textContent]["NUM"] = $flag;
                }
                //если класс ячейки в которой лежит картинка, то забиаем путь к ней
                if (strpos($td_class, 'main-table__flag-cell') !== false) {
                    $img = $td->firstChild;
                    //просто так src картинки не заберешь, поэтому придется извращаться через XML
                    $src = simplexml_import_dom($img);
                    if($src["data-lazy-src"] != null){
                        $arResult[$flag]["FLAG"] = $src["data-lazy-src"];
                    } else {
                        $arResult[$flag]["FLAG"] = '';
                    }
                }
                //если класс ячейки в которой лежит название
                if (strpos($td_class, 'main-table__name') !== false) {
                    $arResult[$flag]["NAME"] = $td->firstChild->textContent;
                }
                //если класс ячейки в которой лежит количество медалей - Золото, серебро, бронза, всего
                if (strpos($td_class, 'main-table__score') !== false) {
                    $arResult[$flag]["SCORE"][] = $td->textContent;
                }
            }
        }
    }
}
echo json_encode($arResult); ?>

На выходе у нас получится нормальный такой массив данных по всем странам и медалям, осталось только грамотно его вывести, но это уже дело техники. Ниже пример структуры массива, вывожу только часть, чтобы показать как это все смотрится:

Array
(
    [1] => Array
        (
            [NUM] => 1
            [FLAG] => SimpleXMLElement Object
                (
                    [0] => https://s9.stc.all.kpcdn.net/sports/wp-content/uploads/2021/12/au.svg
                )

            [NAME] => Австралия
            [SCORE] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                )

        )

    [2] => Array
        (
            [NUM] => 2
            [FLAG] => SimpleXMLElement Object
                (
                    [0] => https://www.kp.ru/sports/wp-content/uploads/2021/06/at.svg
                )

            [NAME] => Австрия
            [SCORE] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                )

        )

Готовая таблица медального зачета со стороннего сайта полученная через CURL

Если вдруг таблица внизу не отображается, то сайт Комсомольской правды увидел мою статью и поменял структуру таблицы, а может и вовсе удалил её. Всем хорошего дня =)

Частный разработчик сайтов Vector Dev
Комментарии