Я решила подтянуть данные медального зачета Зимней олимпиады Пекин-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
Если вдруг таблица внизу не отображается, то сайт Комсомольской правды увидел мою статью и поменял структуру таблицы, а может и вовсе удалил её. Всем хорошего дня =)