Каналы для сайтов без RSS



Вы уже в курсе, как создавать полные версии RSS-лент на базе неполных? Теперь усложним задачу и создадим RSS-ленту для сайта, у которого вообще нет RSS-лент.

Идея

Любая полнотекстовая лента на RSS-farm формируется в 2 этапа. Сначала собирается множество ссылок (и дополнительной информации, вроде даты публикации, автора и т.д., но ссылки — самое важное), на основе которых будут созданы статьи (Articles). Затем, на основе ссылок, создаются статьи и собираются тексты статей.

В случае, когда канал базируется на неполной RSS-ленте, первый этап происходит автоматически. RSS-farm автоматически разбирает неполную RSS-ленту и извлекает из нее информацию о будущих статьях: ссылка на страницу со статьей, дату публикации, вложения и прочее. Вам в вашем шаблоне остается только указать, где на странице находится недостающий текст RSS-ленты.

Когда же RSS-ленты нет, первый этап нужно проделать самостоятельно. Как это сделать?

Пример

В Сети есть множество замечательных сайтов, которые не поставляют RSS вообще. Один из них — «Интернет против телеэкрана». Для него мы и сделаем настоящую RSS-ленту.

Для начала, нам нужно собрать множество ссылок на страницы, с которых мы будем собирать информацию. Открывает DevTools, переходим на вкладку «Parser», водим Url «http://www.contr-tv.ru/» и смотрим на дерево элементов. Нам нужно понять, как собрать ссылки на новости.

Изучив структуру документа, можно собрать эти ссылки, например, так:

try{
	var d = new Document(channel.url, channel.encoding);

	// Массив с заголовками и ссылками на новости
	var links = d.getElementsByAttr('div', 'class', 'newTitle');
	// Массив с датами
	var dates = d.getElementsByAttr('div', 'class', 'newDate');

	for(var i=0; i< links.length; i++){
		var cUrl = links[i].getElementsByTagName('a')[0].getAttribute('href');
		var cTitle = links[i].getElementsByTagName('a')[0].innerText;
		// Приведем дату к формату ДД.ММ.ГГГГ
		var cDate = dates[i].innerText.replace('/','.') + '.' + DateTime.Now.Year;

		var a = new Article();
		a.id = a.url = 'http://www.contr-tv.ru' + cUrl;
		a.header = cTitle;
		a.date = DateTime.Parse(cDate);

		// Помещаем новую статью в канал
		// Текст новости получим чуть позже
		channel.articles.push(a);
	}
}catch(ex){errorMessages.Add(ex)}

Внимание! Очень важно заполнить поле даты новости (article.date). Без даты и новость — не новость, и канал работать не будет.

Этот код нужно поместить в секцию Channel Template и посмотреть, что из этого получится. А получится вот что:

Таким образом, у нас как будто появилась неполная RSS-лента.

Теперь можно плавно переходить ко второму этапу: нужно пройтись по ссылкам и вытащить текст новости. Делаем это в секции Article Template — код из этой секции будет вызван для каждой статьи, созданной в ChannelTemplate.

try{
	var d = new Document(article.url,channel.encoding);
	var el = d.getElementsByAttr("div", "class" , "articleText")[0];
	article.body = el.innerHTML;
}catch(ex){errorMessages.Add(ex)}

Запускаем шаблон, наслаждаемся!