Pobieranie danych z kanałów RSS do bazy danych za pomocą pakietu SSIS

Aleksandra Strusiewicz

Pobieranie danych z kanałów RSS do bazy danych za pomocą pakietu SSIS
Październik 23, 2018 Katarzyna Sobczak
Aleksandra Strusiewicz SSIS

Pobieranie danych z kanałów RSS do bazy danych za pomocą pakietu 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:Name Data Type Properties: DataType Data Type Properties: Length
    Tytul Unicode string [DT_WSTR] 4000
    Tresc Unicode text [DT_NTEXT]
    Autor Unicode string [DT_WSTR] 4000
    DataModyfikacji Database timestamp with timezone [DT_DBTIMESTAMPOFFSET]
    Identyfikator Unicode string [DT_WSTR] 4000
    DataPublikacji Database 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.

Podziel się

Autor: Aleksandra Strusiewicz

Aleksandra Strusiewicz

Aleksandra Strusiewicz

Konsultant SQL Server. Od ponad 5 lat ściśle związana z technologiami Microsoft SQL Server. W trakcie swojej kariery zawodowej realizowała wiele projektów bazodanowych dla klientów z branży spożywczej, energetycznej, logistycznej, ubezpieczeniowej, budowlanej i bankowej. Znajomość specyfiki danej branży pozwala jej na szersze spojrzenie na wyzwania z którymi spotyka się u naszych klientów. Jako konsultant SQL wyspecjalizowała się w procesie ETL. Jest autorką innowacyjnych narzędzi APN BI Tools usprawniających prace programistyczne administratorów i deweloperów SQL oferowanych klientom APN Promise.

Zespół: Business Intelligence

Ostatnie artykuły autora

Pobieranie danych z kanałów RSS do bazy danych za pomocą pakietu SSIS

Pobieranie danych z kanałów RSS do bazy danych za pomocą pakietu SSIS

Aleksandra Strusiewicz pokazuje w jaki sposób pobrać do bazy danych dane z kanału RSS za pomocą pakietu SSIS. Takie rozwiązanie jest efektywne w działaniu i proste do przygotowania.

Dynamiczne generowanie pakietów SSIS

Dynamiczne generowanie pakietów SSIS

Obecnie prędzej czy później trzeba zmierzyć się z integracją danych – tak powstała koncepcja procesu ETL. Microsoft SQL Server Integration Services (SSIS) pozwala tworzyć pakiety wraz z odpowiednimi komponentami i przepływami. Artykuł pokazuje jak ręcznie utworzyć taki pakiet i jak zautomatyzować ten proces.

Skontaktuj się z Aleksandrą

Administratorem danych gromadzonych z wykorzystaniem formularza jest A.P.N. Promise S.A. Podane przez Ciebie dane będą przetwarzane w zakresie niezbędnym do podjęcia kontaktu lub realizacji określonego żądania zgodnie z art. 6 ust. 1 lit. b RODO przez okres niezbędny dla realizacji Twojego zgłoszenia. Wszelkie informacje w zakresie przetwarzania podanych przez Ciebie w formularzu danych oraz posiadanych uprawnieniach znajdziesz w Polityce prywatności. Kliknij i dowiedz się więcej jeżeli informacje podane powyżej nie są dostatecznie jasne!