Agregator RSSów z portali informacyjnych

Pierwszego kwietnia pisaliśmy o ,,szokujących danych o szoku”. Humorystyczny wpis zdradzał przy okazji powstanie narzędzia zbierającego RSSy z różnych polskich portali informacyjnych.
Narzędzie to jest dostępne publicznie, można z niego korzystać do woli. Jak? O tym napisze dziś jego autor Mateusz Kula.

Dla niecierpliwych mały spoiler. Poniższy fragment kodu R pobiera RSSy z okresu od 1 stycznia 2012 do 1 czerwca 2013 z pierwszego źródła RSSów z bazy.

Na razie możliwość dodawania nowych źródeł jest dostępna tylko dla uprzywilejowanych użytkowników. Jeżeli chcielibyście dodać dowolne źródło RSS do tego agregatora napiszcie mi maila lub podajcie adres źródła w komentarzach.

Ok, zobaczmy jak to narzędzie działa i jak z niego korzystać.

Agregator RSSów z portali informacyjnych

Mateusz Kula

Wstęp

Agregator RSS który napisaliśmy składa się z serwera, interfejsu użytkownika / administratora oraz bazy danych. Program pozwala na zapisanie listy kanałów RSS a następnie regularne odpytywanie. Serwisy RSS odpowiadają w postaci dokumentu XML bądź Atom, który jest parsowany, czyli wyodrębniane są konkretne pola, a następnie zapisywany jako encja w bazie danych. Agregator pozwala na pobranie poprzez przeglądarkę internetową przeparsowanych wiadomości w postaci pliku csv. Wiadomości mogą być pobrane w całości (może być to nawet kilkadziesiąt megabajtów w zależności od ilości feedów oraz czasu przez jaki są śledzone) bądź dla konkretnego feeda (poprzez podanie jego id) oraz z możliwością określenia przedziału czasowego z jakiego mają być pobrane dane.

Serwer

Serwer napisany jest w języku php, co umożliwia szybkie uruchomienie go na niemal dowolnym serwerze linuxowym. Do parsowania pobranych feedów użyliśmy bibliotekę lastRSS, dostępną pod tym adresem http://lastrss.oslab.net/. Jest ona nie tylko mała i łatwa w obsłudze ale posiada też mechanizm zapamiętywania pobranych danych dzięki czemu serwisy są odpytywane tylko celem pobrania nowych danych. Jeżeli na serwerze mamy zainstalowany php, pliki wystarczy skopiować do jakiegoś foldery w public_html i po drobnej konfiguracji są one gotowe do użycia. Aby agregator okresowo aktualizował dane z feedów należy do crona dodać wpis wywołujący skrypt pull_rss_cron.php. Do działania agregatora istotne jest umieszczenie pliku settings.php o dwa poziomy wyżej niż pozostałe. Plik settings.php powinien mieć następującą postać:

Zmienne należy ustawić odpowiednio do posiadanej przez siebie konfiguracji.

Interfejs użytkownika

Interfejs do agregatora napisany jest w javascript z użyciem biblioteki jQuery UI (http://jqueryui.com/) dzięki czemu szybko mogliśmy utworzyć ładnie i spójnie stylistycznie przyciski i okienko dialogowe. Abu zmodyfikować listę obserwowanych rssów należy udać się przeglądarką internetową do skryptu manage.php podmieniając w adresie odpowiednie dla swojej konfiguracji nazwę serwera i folder: http://smarterpoland.pl/materialy/rss/manage.php
Z poziomu skryptu manage.php można jedynie dodawać obserwowane rssy, nie można ich modyfikować ani usuwać co podyktowane jest tym iż jest to publicznie dostępny interfejs i chcieliśmy uniknąć utraty danych przez przypadek bądź złośliwą działalność. Oczywiście jest to marne zabezpieczenie ale wydaje się być adekwatne do ważności przechowywanych danych. W manage.php można odczytać istotną informację o id feeda co może być przydatne podczas pobierania danych.

Baza danych

Jako bazy danych zdecydowaliśmy się użyć MySql z dwoma tabelami. Jedna z nich (feeds) przechowuje listę feedów z ich nazwami i adresami, natomiast druga jest złączona z pierwszą poprzez pole feed_id i zawiera sparsowane encje zawierające link do artykułu, tytuł, opis, guid (indywidualny identyfikator jednoznacznie wyróżniający encję) oraz datę publikacji. MySql, podobnie jak php powinien być dostępny na większości serwerów linuxowych a jeżeli nie jest to bez względu na system można go bezpłatnie pobrać i szybko zainstalować.

Tabela feeds

 

Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
name varchar(128) NO NO NULL  
address varchar(256) NO NO NULL  

 

Tabela feeds_items

 

Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
feed_id int(11) NO MUL NULL  
link varchar(256) YES   NULL  
title varchar(256) YES   NULL  
description varchar(256) YES   NULL  
guid varchar(256) YES   NULL  
publication_date varchar(256) YES   NULL  

 

Pobieranie danych

Aby pobrać dane należy za pomocą przeglądarki internetowej pobrać następujący adres, podmieniając w zależności od swojej konfiguracji nazwę serwera oraz folderu w którym umieszczone są skrypty: http://smarterpoland.pl/materialy/rss/joined_data.php
W ten sposób pobrany będzie plik csv zawierający wszystkie zagregowane artykuły z feedów.

Aby ograniczyć pobierane dane można użyć dodatkowych parametrów zapytania:
• feedId – pobrane będą tylko dane zagregowane dla określonego feeda
• fromDate
• toDate

Nie ma konieczności stosowania wszystkich tych parametrów a więc można na przykład pobrać wszystkie encje dla konkretnego feeda podając tylko feedId bądź artykuły z wszystkich feedów które ukazały się nie później niż pewna data używając tylko parametru toDate. Daty mogą być dowolnymi ciągami, które MySql potrafi przetworzyć na datę, jedną z możliwości jest użycie formatu yyyymmdd oznaczający użycie czterech cyfr określających rok, następnie dwóch cyfr określających miesiąc i na koniec dwóch cyfr określających dzień miesiąca. W przypadku użycia nieprawidłowego formatu daty lub nieistniejącego id feeda w csv znajdziemy zamiast danych informację o błędzie.

Przykładowe zapytanie używające parametrów:
http://smarterpoland.pl/materialy/rss/joined_data.php?feedId=1&fromDate=20120101&toDate=20121212