Парсинг RSS-ленты «Яндекс.Фотки» при помощи PHP (SimpleXML, XPath)

Бывают ситуации, когда к своему сайту необходимо подключить определенный информационный контент стороннего ресурса, но готовых скриптов для размещения на внешних сайтах тот ресурс не предоставляет. Вот тогда и приходит в помощь возможность парсинга RSS ленты. В этой статье будет рассмотрен пример получения случайного фото дня из RSS-ленты сервиса «Яндекс.Фотки». Для достижения этой цели будет использован класс PHP 5SimpleXML с применением XPath.

Краткая терминология:
RSS – семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Информация из различных источников, представленная в формате RSS, может быть собрана, обработана и представлена пользователю в удобном для него виде специальными программами-агрегаторами или онлайн-сервисами, такими, как Google Reader (закрыт), Яндекс.Лента и другими. [Wikipedia]

Существует два основных способа XML-парсинга: на базе деревьев и на базе потоков. Метод дерева (будет использован в этой статье) предусматривает загрузку в память всего XML-документа целиком. Древовидная структура файла позволяет произвольно обращаться к элементам документа и редактировать XML. Примерами парсеров по методу дерева служат DOM и SimpleXML. Они хранят древовидную структуру в памяти в разных, но взаимодействующих форматах.

SimpleXML – класс в PHP 5, для работы с XML-документами. SimpleXML представляет XML-документ как структуру данных. Этот класс простой в использовании, поскольку он решает лишь самые общие задачи работы с XML, оставив другие для других расширений. [Wikipedia]

Структура RSS ленты следующая:

<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:media="http://search.yahoo.com/mrss" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>Все фото дня на Яндекс.Фотках</title>
<atom:link rel="next" href="http://fotki.yandex.ru/calendar/rss2?p=1"/>
<link>http://fotki.yandex.ru/calendar/</link>
<pubDate>Thu, 16 Jan 2014 17:12 +0400</pubDate>
<lastBuildDate>Thu, 16 Jan 2014 17:12 +0400</lastBuildDate>
<atom:icon>http://fotki.yandex.ru/i/bird.png</atom:icon>

<item>
<author>troolga11</author>
<link>http://fotki.yandex.ru/users/troolga11/view/660643/</link>
<media:thumbnail url="http://img-fotki.yandex.ru/get/9111/107069325.6e/0_a14a3_ea5473e5_M" medium="image" type="image/jpeg"/>
<media:content url="http://img-fotki.yandex.ru/get/9111/107069325.6e/0_a14a3_ea5473e5_XL" medium="image" type="image/jpeg"/>
<pubDate>Thu, 16 Jan 2014 17:12 +0400</pubDate>
<title>Крещендо .</title>
<description><p><a href="http://fotki.yandex.ru/users/troolga11/view/660643/"><img src="http://img-fotki.yandex.ru/get/9111/107069325.6e/0_a14a3_ea5473e5_M" alt="Крещендо ." width="300" height="256"/></a><br/></p></description>
</item>

<item>
…
</item>
…
…
</channel>
</rss>

PHP код парсинга:

<?php
	// Случайное число в диапазоне [0..99]
	$random = rand(0, 99);
	
	// Ссылка на XML-файл
	$url = "http://fotki.yandex.ru/calendar/rss2";
	
	// Загружаем файл
	$rss = simplexml_load_file($url);
	if($rss) {
		// Выбираем для работы <item> под номером $random
		$item = $rss->channel->item[$random];
		// Получаем название фотографии и сразу устанавливаем кодировку "windows-1251"
		$title = iconv("utf-8", "windows-1251", $item->title);
		// Производим редактирование названия
		$title = preg_replace('[ \.]', '\.', $title);
		if(preg_match("[\.JPG$|\.jpg$|\.JPEG$|\.jpeg$|\.PNG$|\.png$|\.GIF$|\.gif$]", $title)) $title="(Фото без имени)";
		$title = preg_replace("[copy]", "", $title);
		// Ссылка на Яндекс.Фотки с фотографией дня
		$link = $item->link;
		// поиск и получение ссылки на малый размер фотографии дня
		$search_media_M = $item->xpath("media:thumbnail");
		$url_img_M = $search_media_M[0][url];
		// поиск и получение ссылки на большой размер фотографии дня
		$search_media_XL = $item->xpath("media:content");
		$url_img_XL = $search_media_XL[0][url];
	}
	else { echo "Не удалось загрузить Яндекс Фото Дня"; }
	// вывод результата парсинга в окно браузера
	printf("<div align='center'><a href='$link' target='_blank'><img src='$url_img_M' style='max-width:240px'></a><br>
	<strong><em><div style=\"font-size:14px; color:#900;\">$title</div></em></strong></div><br>");
?>

Комментарии (0):

Комментариев, к данной статье, нет

Оставить комментарий:


* Введите Ваше имя


* Введите комментарий

Введите результат с картинки:

* Введите результат

Фото дня на Яndex


(Фото без имени)