ExpandПоследние новости

ExpandПопулярное

ExpandВажно!

Уважаемые пользователи! На сайте представлены материалы по компоненту NewsGrabberJC для Joomla и скрипту NewsGrabber.

Пожалуйста, не путайте эти 2 понятия!!!


Настройка парсинга контента в скрипте NewsGrabber
Написал Administrator   
11.10.2007
Настройка парсинга контента

Пожалуй самый сложный раздел в админке - RSS ленты Smile

Небольшая вводная... Для сбора контента, нам необходимо получить с сайта-источника RSS или ATOM ленту с заголовками и ссылками на полный текст. В случае если такой ленты у сайта нет, то можно использовать страницы сайта на которых есть обновляемый список заголовков и ссылок, по простому говоря - нам необходима страница с новостной лентой.

Интерфейс управления сайтами-источниками.


Добавление нового источника (по просьбе первого топик стартера этого раздела, делаем на примере RSS ленты reuters http://feeds.feedburner.com/reuters/topNews/

При нажатии ссылки добавления нового источника. Вы попадаете на страницу с формой основных параметров:

Раздел - выбираем к какому разделу/подразделу относится источник
Название - название источника, будет выводиться на сайт. Пишем Reuters
URL - URL RSS или HTML ленты новостей. В данном случае http://feeds.feedburner.com/reuters/topNews/ (Вариант с HTML лентой рассмотрим ниже)

Жмем "Сохранить изменения" и переходим на следующую страницу настройки источника.


Первые три поля уже заполнены.

Для RSS лент надо сразу заполнить Связь полей RSS-ленты. Тут все понятно - Заголовок новости (title); Описание новости (description); Ссылка на текст новости (link). Эти соотношения являются стандартными для лент формата RSS и ATOM.

Поле "Шаблон заголовков" заполняется только в случае обработки HTML лент. В данном примере оставляем его пустым.

Теперь нам надо создать шаблон для выдирания полного текста новости из страницы и поместить его в поле "Шаблон текста новости". В шаблоне для парсинга полного текста используются следующие операторы:

{get} - указывает что в этом месте мы собираем контент
{skip} - указывает что в этом месте мы пропускаем контент

Итак поехали... Открываем одну из новостей RSS ленты ( http://feeds.feedburner.com/reuters/topNews?m=27679 ) в браузере. Смотрим исходный HTML код.

ВНИМАНИЕ!!! Шаблон для парсинга должен начинаться и оканчивать уникальным HTML кода страницы.

Подбираем такие уникальные элементы, поближе к тексту новости, в нашем открытом исходнике:

Код:
   <div id="ArticleBody_SubDivUtilities">
      <a id="ArticleBody_EmailArticle" href="javascript:commonPopup('/misc/EmailPopup.aspx?type=topNews&storyID=2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml&link=/news/ArticleNews.aspx', 540, 600, 1, 'emailPopup')">Email This Article</a> | <a id="ArticleBody_PrinterFriendly" href="javascript:commonPopup('/misc/PrinterFriendlyPopup.aspx?type=topNews&storyID=2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml', 540, 525, 1, 'printerPopup')">Print This Article</a>
       | <a id="ArticleBody_ReprintsLink" href="javascript:commonPopup('http://license.icopyright.net/3.5398?icx_id=2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml&edition=US&category=topNews', 580, 635, 1, 'purchasePopup')">Reprints</a>
      
   </div>
</div>
     
<div class="articleTextSizerFull" id="textSizer">
        [<a href="javascript:sizeDown();" mce_href="javascript:sizeDown();" class="control">-</a>]
        <a href="javascript:resetCurrentsize();" mce_href="javascript:resetCurrentsize();">Text</a>
        [<a href="javascript:sizeUp();" mce_href="javascript:sizeUp();" class="control">+</a>]
</div>
<p>
By Nidal al-Mughrabi<p>GAZA (Reuters) - A new Hamas-led militia battled gunmen from a Fatah-dominated security force near the Palestinian parliament in Gaza on Monday in fresh internal fighting and medics said a Jordanian citizen was killed.<p>Palestinian security sources said the Jordanian was driving a car with Jordanian diplomatic license plates when he was caught in crossfire. Six civilian bystanders and a policeman were wounded, medics said.<p>Witnesses said members of the new force set up by the ruling militant Islamic group returned fire after coming under attack.
</p>


<p>
<p>Hamas officials said the assailants were from the Preventive Security agency, staffed largely by men loyal to the long-dominant Fatah group of President Mahmoud Abbas.<p>The Hamas security men took cover inside a building near parliament. Ordinary police also joined the battle, witnesses said. A vehicle belonging to Preventive Security was set on fire in the area, witnesses said. Civilians fled the streets.<p>Palestinian security sources said the Jordanian was an administrative employee at his country's mission in Gaza and not a diplomat.<p>Hamas, which took power in March after winning January elections, deployed its new 3,000-strong force in Gaza last week, prompting Abbas, a moderate, to order police onto the streets too. The rival forces clashed within barely a day.<p>Apparent assassination attempts against two top Abbas commanders at the weekend -- one was badly wounded -- have also stoked worries of further strife. Hamas has denied any responsibility for the two attacks.
  <span class="inlineLinks"><a id="ArticleBody_Continued" href="javascript:ArticlePaging('/news/newsarticle.aspx','topNews','2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml','1','','','NewsArt-C1-ArticlePage1');" mce_href="javascript:ArticlePaging('/news/newsarticle.aspx','topNews','2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml','1','','','NewsArt-C1-ArticlePage1');">Continued...</a></span>
</p>

<div class="pageNavigation">
   < Previous
      
    <strong>1</strong> | <a href="javascript:ArticlePaging('/news/newsarticle.aspx','topNews','2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml','1','','','NewsArt-C1-ArticlePage1');" mce_href="javascript:ArticlePaging('/news/newsarticle.aspx','topNews','2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml','1','','','NewsArt-C1-ArticlePage1');">2</a>
      
    <a href="javascript:ArticlePaging('/news/newsarticle.aspx','topNews','2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml','1','','','NewsArt-C1-ArticlePage1');" mce_href="javascript:ArticlePaging('/news/newsarticle.aspx','topNews','2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml','1','','','NewsArt-C1-ArticlePage1');">Next ></a>
</div>

<p class="copyright">© Reuters 2006. All Rights Reserved.</p>
<span id="ArticleBody_NextArticleContainer"></span>

Тег
Код:
<div id="ArticleBody_SubDivUtilities">
встречается в HTML документе только один раз - уникальный код. Ставим его в начало шаблона. Видим, что текст начинается после конструкции

Код:
<div class="articleTextSizerFull" id="textSizer">
        [<a href="javascript:sizeDown();" mce_href="javascript:sizeDown();" class="control">-</a>]
        <a href="javascript:resetCurrentsize();" mce_href="javascript:resetCurrentsize();">Text</a>
        [<a href="javascript:sizeUp();" mce_href="javascript:sizeUp();" class="control">+</a>]
</div>


Поэтому наш шаблон теперь выглядит так:

Код:
<div id="ArticleBody_SubDivUtilities">
{skip}
<div class="articleTextSizerFull" id="textSizer">
        [<a href="javascript:sizeDown();" mce_href="javascript:sizeDown();" class="control">-</a>]
        <a href="javascript:resetCurrentsize();" mce_href="javascript:resetCurrentsize();">Text</a>
        [<a href="javascript:sizeUp();" mce_href="javascript:sizeUp();" class="control">+</a>]
</div>

(на самом деле можно было начинать конструирование шаблона с этой конструкции, я просто хотел показать, как используется оператор {skip})

Опять же с помощью оператора {skip} можно упростить начало нашего шаблона:

Код:
<div id="ArticleBody_SubDivUtilities">
{skip}
<div class="articleTextSizerFull" id="textSizer">
{skip}
</div>

Далее следует текст, который нам необходимо получить. Ставим в шаблон {get}. Ограничиваем шаблон кодом

Код:
<p class="copyright">© Reuters 2006. All Rights Reserved.</p>


А учитывая что сам реутерс может тоже брать с кого то новости и копирайт может меняться, ставим {skip} вместо копирайта. Получаем шаблон:

Код:
<div id="ArticleBody_SubDivUtilities">
{skip}
<div class="articleTextSizerFull" id="textSizer">
{skip}
</div>
{get}
<p class="copyright">{skip}</p>

Теперь проверим правильность составления шаблона. В поле "URL новости" вставим тот самый адрес который мы взяли с RSS ленты, и жмем кнопку "Проверить шаблон". В новосм окне должна открыться страницы с выдранным текстом. Если открывается сайт, хоть и "плохо" выглядящий. Значит мы ошиблись с шаблоном и надо проверять ошибки...

Проверьте созданный шаблон поочередно со всеми ссылками из RSS. Результат проверки должен быть аналогичен с нашей первой новостью. Разумеется за исключением контента.

Выставляем интервал обновления ленты. Этот параметр задается в минутах. Данная величина должна быть объективна, т.е. мы должны не пропустить ни одной новости с сайта-источника и в то же время как можно реже к нему обращаться за обновлениями. Я поступаю так: смотрю время добавления в RSS ленту первой новости и последней. Считаю разницу во времени и делю это время на 2-3. Т.е. если разница между первой и последней новостью в RSS - 5 часов (300 минут) то интервал обновления ленты я ставлю 150 минут.

Загружать текст новости - если данная опция отключена, то скрипт обрабатывает лишь RSS ленту. Отключая у источников эту опцию, можно на основе скрипта создать... например on-line агрегатор RSS Smile

Загружать изображения - если у вас мало дискового пространства на хостинге, то эту опцию лучше отключить - изображения на вашем сервере не будут сохраняться.

Удалять теги (text) При парсинге контента, все теги будут максимально очищены от различных бесполезных для нас атрибутов и параметров. НО! Основные теги всеже остаются. Чтобы вырезать ненужные теги и при этом сохранять в контенте их содержимое, добавьте этот тег в список.

Оказалось все не так уж и сложно! Правда? Very Happy

Это были базовые знания... А теперь наведем красоту... Smile

Вы уже наверно заметили, что новость на примере которой мы делали шаблон, размещена на 2-х страница и мы получили только первую из них. А очень хочется полную!!! Долго думал как это реализовать и придумал Smile в 95% случаях на сайтах есть версии для печати, а уж в них уже никто не представляет публикацию в постраничном выводе. Так почему же нам не парсить её? Сказано - сделано! Будем парсить!

Помните, у нас была ссылка для примера? Вот эта:

Код:
http://feeds.feedburner.com/reuters/topNews?m=27679


Давайте вставим ее в браузер и посмотрим что будет. После того как страница открылась посмотрите в адресную строку. Мы там увидим совсем другой адрес:

Код:
http://today.reuters.com/news/newsarticle.aspx?type=topNews&storyid=2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml&src=rss


Редирект после перехода по ссылке с RSS ленты - очень частое явление. И скрипт его нормально обрабатывает. Но надо учесть что при парсинге новости со страницы для печати, мы будем использовать тот URL что мы получили после открытия страницы в браузере, а не URL из тега <link> RSS ленты.

Ищем на странице ссылку на версию для печати и открываем его. URL страницы с версией для печати такой:

Код:
http://today.reuters.com/misc/PrinterFriendlyPopup.aspx?type=topNews&storyID=2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml


А теперь URL исходной страницы и версии для печати:

Код:
http://today.reuters.com/news/newsarticle.aspx?type=topNews&storyid=2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml&src=rss

http://today.reuters.com/misc/PrinterFriendlyPopup.aspx?type=topNews&storyID=2006-05-22T130936Z_01_L22523425_RTRUKOC_0_US-MIDEAST.xml


Ищем различия... Smile

А различия такие:

1) В исходном URL - /news/newsarticle.aspx
В URL для печати - /misc/PrinterFriendlyPopup.aspx
2) В конце URL версии для печати нету &src=rss

Для начала попробуем, будет ли работать адрес для печати если в конец URL добавить &src=rss... Работает! Smile Значит нам остается только сделать подмену /news/newsarticle.aspx на /misc/PrinterFriendlyPopup.aspx

Четвертая строка сверху в окне настройки ленты - Страница для печати. Там два поля: первое - что меняем, второе - на что меняем. Соответственно в первое вставляем /news/newsarticle.aspx во второе - /misc/PrinterFriendlyPopup.aspx.

Затем делаем шаблон на страницу для печати. Ну шаблоны мы уже вроде научились делать...

Код:
<span class="newsDate">{skip}</span><br><br>
<p>{skip}) -
{get}
</td>
</tr>
<tr><td colspan="2" valign="top"><hr></td></tr>


И проверяем его, вставляя в поле адреса для проверки хоть адрес из RSS хоть тот что появляется после редиректа.

При проверке, перед сграбленным текстом выводится адреса URL (что было -> что стало после замены).

В полях замены можно использовать регулярные выражения. Если Вы знаете, что это такое, то вам сказочно повезло! Если нет. То срочно ищите литературу и учите RegExp`ы очень может пригодиться.

И еще хочу заметить, что при использовании подстановок, скрипту придется загрузить сначала обычную страницу, а только потом версию для печати. Поэтому, при больших объемах парсинга, его время увеличиться в 1,5-2 раза... Возрастут также потребляемые ресурсы...

Вырезание ненужных фрагментов

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

Код:
<original start code>
{skip}
<h1>{skip}</h1>
{get}
<table><tr><td>Это нам не надо</td></tr></table>
{get}
<original end code>


Но такой выход из положения нас устроит в том случае, если ненужный фрагмент встречается на всех страницах которые мы будем грабить. Если же подобная ситуация встречается не постоянно, то вырезать из контента подобные куски мы можем с помощью конструкции <remove></remove> Эта конструкция добавляется сразу после шаблона, в ней можно использовать оператор {skip}. При ее использовании наш шаблон будет вылядеть так:

Код:
<original start code>
{skip}
<h1>{skip}</h1>
{get}
<original end code>
<remove>
<table><tr><td>Это нам не надо</td></tr></table>
</remove>


т.е. если вдруг в контенте встретиться конструкция <table><tr><td>Это нам не надо</td></tr></table> она будет вырезана. Если написать в шаблоне:

Код:
<original start code>
{skip}
<h1>{skip}</h1>
{get}
<original end code>
<remove>
<table{skip}/table>
</remove>


то из сграбленного контента будут вырезаться вообще все таблицы.

Ну вот и все с этим пунктом меню. Оказалось все не так уж и сложно Very Happy
Код:
 
 
< Пред.   След. >