PHP: как быстро извлечь нужные данные с чужого сайта и показать у себя
Собственно, точно так же, как в этой заметке, со времени её написания ничего не изменилось :)
Для примера воспользуемся официальным рейтингом шахматистов от ФИДЕ, поскольку речь сегодня шла именно о нём.
Логично сделать следующие 5 шагов:
- Определить URL нужной страницы и получить её, проще всего целиком через функцию
file_get_contents
; - Изучить формат полученной страницы, найдя фрагменты разметки, "от которого" и "до которого" нужно копировать. Альтернатива - более интеллектуальный подход, связанный с разбором DOM документа средствами Javascript или специализированных PHP-библиотек;
- Отрезать нужную часть страницы и отделить её (см. в коде функцию
process
, не изменившуюся с процитированной заметки); - Сделать в выдранном фрагменте замены по некоему элементарно устроенному списку
$replacements
(что => на_что
), например, относительные ссылки на абсолютные, английские названия столбцов таблицы на русские и т.д.; - Показать обработанный фрагмент, поместив его в отдельный тег
<iframe>
или просто встроив код в "движок" в нужном месте.
Вот полный код скрипта, реализующего данный подход, проверен на локалхосте, где сработал на момент написания заметки. Возможно, в будущем придётся поменять настройки $start
и $end
в начале кода.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta content="text/html; charset=utf-8" http-equiv="content-type"> <title>FIDE rating</title> </head> <body> <?php //Настройки $url = 'http://ratings.fide.com/top.phtml?list=men'; //URL для извлечения данных $start = '<div id="main-col">'; //С чего начать $end = '<span class="article_separator">'; //Чем закончить $replacements = array ( //Что на что заменять перед показом '/top_files.phtml' => 'http://ratings.fide.com/top_files.phtml', '<b>Rank</b>' => '<b>Место</b>', '<b>Name</b>' => '<b>Имя</b>', '<b>Title</b>' => '<b>Титул</b>', '<b>Country</b>' => '<b>Страна</b>', '<b>Rating</b>' => '<b>Рейтинг</b>', '<b>Games</b>' => '<b>Игры</b>', '<b>B-Year</b>' => '<b>Возраст</b>' ); //Код function process($s,$start,$end,$include) { $s1=strpos ($s,$start); $s2=strpos ($s,$end); if (!is_integer($s1)) { return "Не найден начальный сегмент: ".htmlspecialchars($start); } if (!is_integer($s2)) { return "Не найден конечный сегмент: ".htmlspecialchars($end); } if ($s1>$s2) { return "Конечный сегмент предшествует начальному"; } if ($include) { //Включать начало и конец return substr ($s,$s1,$s2-$s1+strlen($end)); } else { //Исключить начало и конец $s1+=strlen($start); return substr ($s,$s1,$s2-$s1); } } $string = process (file_get_contents($url),$start,$end,false); echo str_replace (array_keys($replacements),array_values($replacements),$string); ?> </body></html>
Размещать скрипт следуют в Юникоде (UTF-8). Вот скрипт в работе.
Живой рейтинг сильнейших шахматистов мира
30.08.2015, 21:03 [9915 просмотров]