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.
fromDate = "20120101" toDate = "20130601" feedId = 1 read.table(paste("http://smarterpoland.pl/materialy/rss/joined_data.php?feedId=", feedId, "&fromDate=", fromDate, "&toDate=", toDate, sep=""), sep=",", fill=T, h=T) |
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
Może to trochę temat z innej bajki, ale fajnie byłoby porównać zawartość RSS z Sejmu i tego jak to się przekłada na komunikaty w mediach. Poniżej dwa linki do RSS sejmowych
http://orka.sejm.gov.pl/rss.nsf/feed.xsp?symbol=NEWS
http://orka.sejm.gov.pl/rss.nsf/feed.xsp?symbol=ZAPISY
Dziękuję, ciekawy pomysł.
Dodałem oba źródła RSS do obserwacji. Jak tylko uzbiera się trochę danych, będzie można się im przyjrzeć.
Inne agregator wiadomości http://www.todaynews.info/gazeta.htm