Hurtownia Danych

Tworzenie archiwum kanałów RSS za pomocą pakietu SSIS

W swoim artykule Aleksandra Strusiewicz pokazuje jak zachować dane z kanałów RSS w bazie danych. Dzięki temu możliwe jest stworzenie repozytorium, które pozwoli na ich analizowanie w przyszłości – np. w celach porównawczych. Aby tego dokonać, posiłkuje się pakietem SSIS.  

W tym artykule chcę pokazać w jaki sposób można pobrać dane do bazy danych z kanału RSS za pomocą pakietu SSIS. Takie rozwiązanie jest proste do przygotowania, a także efektywne w działaniu.

Każdy, kto chce być na bieżąco z informacjami publikowanymi na jednym lub wielu serwisach internetowych zetknął się z pojęciem RSS (ang. Really Simple Syndication, czyli naprawdę prosta dystrybucja). Chodzi o to, żeby użytkownik mógł w jednym miejscu otrzymywać informacje o zmianach pojawiających się na śledzonych przez niego serwisach. Wystarczy tylko zasubskrybować odpowiedni kanał RSS (np. dodając go do dynamicznych zakładek w przeglądarce lub instalując w systemie operacyjnym odpowiednie oprogramowanie) i gotowe. Jednak w ten sposób można śledzić wyłącznie bieżące zmiany. A co w sytuacji, kiedy interesują nas informacje historyczne, np. sprzed miesiąca? Albo chcielibyśmy porównywać ze sobą kilka kanałów informacyjnych pod kątem ilości publikowanych wiadomości czy podobieństw i różnic w treści opisów tych samych zdarzeń. A może celem byłoby zebranie możliwie najpełniejszych danych o wszystkich ważnych wydarzeniach w wybranym miejscu z dokładnością do dnia? Wtedy z pomocą może nam przyjść pobieranie danych z kanałów RSS do bazy danych w celu ich archiwizowania i dalszej analizy, o ile dostawca kanału RSS dopuszcza taką możliwość.

Od czego zacząć? Oczywiście od przygotowania środowiska deweloperskiego, czyli:

  1. instalacji i uruchomienia programu SSDT-BI (SQL Server Data Tools for BI) w wybranej wersji (poniższy przykład przygotowano z użyciem dla wersji 2015),
  2. utworzenia projektu o typie „Integration Services Project” wraz z jednym, pustym pakietem o domyślnej nazwie „Package.dtsx”.

Będąc tak przygotowanym, można przystąpić do działania.

Krok 1:

Wstępna konfiguracja. W ramach tego etapu warto utworzyć zmienną typu tekstowego, w której będzie przechowywany adres interesującego nas kanału RSS, a także utworzyć połączenie (Connection Manager) do bazy danych, gdzie zostanie utworzona tabela docelowa o odpowiedniej strukturze. Takie podejście umożliwia także dynamiczne pobieranie danych z różnych serwisów (więcej na ten temat można przeczytać w artykule: Dynamiczne generowanie pakietów SSIS).

Krok 2:

Przygotowanie komponentu, ładującego dane (Data Flow Task).

Data Flow Task

Do przeprowadzenia procesu pobierania danych z kanału RSS do tabeli w bazie docelowej użyjemy komponentu „Data Flow Task”, gdzie źródłem będzie „Script Component”.

Select Script Component

W ramach edycji wspomnianego komponentu źródłowego należy wykonać następujące operacje:

  1. W sekcji „Script” dodać odwołanie do utworzonej wcześniej zmiennej

odwołanie do zmiennej

  1. W sekcji „Inputs and Outputs” utworzyć zestaw kolumn wynikowych, które powstaną w wyniku działania skryptu:
    Common Properties:NameData Type Properties: DataTypeData Type Properties: LengthTytulUnicode string [DT_WSTR]4000TrescUnicode text [DT_NTEXT]AutorUnicode string [DT_WSTR]4000DataModyfikacjiDatabase timestamp with timezone [DT_DBTIMESTAMPOFFSET]IdentyfikatorUnicode string [DT_WSTR]4000DataPublikacjiDatabase timestamp with timezone [DT_DBTIMESTAMPOFFSET]

Script Transformation Editor

  1. W sekcji „Script” kliknąć przycisk „Edit Script…” i w wywołanym w ten sposób nowym oknie dialogowym wstawić kod:


#region Namespacesusing System;using System.Data;using Microsoft.SqlServer.Dts.Pipeline.Wrapper;using Microsoft.SqlServer.Dts.Runtime.Wrapper;using System.ServiceModel.Syndication;using System.Xml;using System.Text;#endregion
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
private string rssUrl = string.Empty;
private SyndicationFeed rssFeed = null;
private XmlReader xmlReader = null;
public override void PreExecute()
{
base.PreExecute();
//Konfiguracja polaczenia do kanalu RSS
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
xmlReaderSettings.DtdProcessing = DtdProcessing.Parse;
xmlReaderSettings.MaxCharactersFromEntities = 1024;
rssUrl = ReadOnlyVariables["User::URL"].Value.ToString();
xmlReader = XmlReader.Create(rssUrl, xmlReaderSettings);
rssFeed = SyndicationFeed.Load(xmlReader);
}
public override void PostExecute()
{
base.PostExecute();
//Zamkniecie polaczenia do kanalu RSS
xmlReader.Close();
}
public override void CreateNewOutputRows()
{
if (rssFeed != null)
{
foreach (var rssItem in rssFeed.Items)
{
Output0Buffer.AddRow();
//Wybranie tytulu
Output0Buffer.Tytul = rssItem.Title.Text;
//Wybranie tresci
Output0Buffer.Tresc.AddBlobData(ConvertToBytes(rssItem.Summary));
//Wybranie tylko pierwszego autora
string authorName = string.Empty;
if (rssItem.Authors.Count > 0)
{
authorName = rssItem.Authors[0].Name;
}
Output0Buffer.Autor = authorName;
//Wybranie daty modyfikacji
Output0Buffer.DataModyfikacji = rssItem.LastUpdatedTime;
//Wybranie identyfikatora
Output0Buffer.Identyfikator = rssItem.Id;
//Wybranie daty publikacji
Output0Buffer.DataPublikacji = rssItem.PublishDate;
}
Output0Buffer.SetEndOfRowset();
}
}
private byte[] ConvertToBytes(TextSyndicationContent rssContent)
{
if (rssContent != null && !string.IsNullOrEmpty(rssContent.Text))
{
var rssEncoding = new UnicodeEncoding();
return rssEncoding.GetBytes(rssContent.Text);
}
return new byte[0];
}
}

  1. We właściwościach skryptu sprawdzić wersję .NET Framework. Jest to ważne, bo klasa SyndicationFeed wymaga co najmniej wersji 3.5 dla .NET Framework.

sprawdzenie wersji .NET Framework

Po przygotowaniu komponentu źródłowego wystarczy już tylko wskazać miejsce, gdzie mają zostać załadowane dane. W tym wypadku będzie to nowa tabela w bazie Microsoft SQL Server, więc wykorzystamy komponent „Ole Destination”, w którym należy:

  • W sekcji „Source” wybrać zdefiniowane wcześniej połączenie do bazy (Connection Manager) oraz istniejącą tabelę (lub utworzyć nową) o strukturze sugerowanej przez narzędzie. W tym wypadku skorzystamy z opcji utworzenia tabeli, naciskając przycisk „New…” i po zmianie nazwy naciskając przycisk „Ok”

OLE DB Destination Editor

  • W sekcji „Mappings” upewnić się, że wszystkie kolumny z komponentu źródłowego zostały odpowiednio połączone z kolumnami tabeli docelowej

OLE DB Destination Editor

Po uruchomieniu tak przygotowanego pakietu wystarczy już tylko sprawdzić, czy w tabeli docelowej pojawiły się dane:

sprawdzenie danych w tabeli docelowej

Jak widać, przygotowanie i wdrożenie powyższego rozwiązania nie jest czasochłonne ani nie wymaga zaawansowanej wiedzy programistycznej. Co ważne, można w łatwy sposób rozbudować je o dodatkowe operacje, umożliwiające:

  • pobieranie danych z wielu kanałów RSS w ramach działania jednego procesu,
  • logowanie informacji podczas wykonywania procesu wraz z obsługą błędów,
  • uwzględnianie aktualizacji informacji już opublikowanych w kanale,
  • cykliczne wykonywanie procesu pobierania zgodnie z przyjętym harmonogramem.

Biogram autora zostanie zaktualizowany niebawem.
Zobacz profil
×
Biogram autora zostanie zaktualizowany niebawem.
Zobacz profil
Latest Posts
  • zapis RSS do bazy
  • Dynamiczne generowanie pakietów SSIS