Parsujemy strony internetowe – import listy filmów dokumentalnych

UWAGA, ruszył Humble Book Bundle: DevOps - jak zwykle pierwszy próg 5 książek od $1, cały komplet od $15.

movie

Istnieje w polskim internecie strona internetowa katalogująca filmy dokumentalne: www.filmydokumentalne.eu.
Właściciele wordpressowej strony twierdzą, że nie naruszają prawa udostępniając nielegalnie umieszczonych w sieci filmów. Myślę więc, że sami również nie będą mieli nic przeciwko abym wykonał import całego ich katalogu odnośników 🙂

Zadanie na dziś

Wykonanie programu którego celem jest wygenerowanie listy odnośników do filmów dokumentalnych umieszczonych na stronie www.filmydokumentalne.eu.

Żeby nie zostać posądzony o kradzież danych, nie będę zapisywał żadnych wartości tekstowych charakteryzujących dany film (jak np. tytuł i opis), lecz pobiorę tylko i wyłącznie odnośniki.

Realizacja

Przygotowując się do parsowania zewnętrznych portali internetowych trzeba zrobić krótkie rozeznanie w celu wyszukania możliwości automatycznego pobierania podstron. Na ogół rozwiązania są dwa:

  1. Portal udostępnia podstrony według identyfikatorów w postaci liczby naturalnej.
    W tym przypadku startujemy od liczby jeden i próbujemy pobrać kolejne podstrony inkrementując identyfikator.
  2. Portal udostępnia na jednej podstronie listę wszystkich podstron.
    W tym przypadku pobieramy podstronę z listą i tworzymy bazę odnośników które należy odwiedzić.

W przypadku naszego serwisu możemy z menu wywołać: Strony->Spis od A do Z i widzimy że mamy gotowy zbiór wszystkich filmów.

Kolejną kwestią jest sposób parsowania danych i znowu mamy dwa rozwiązania:

  1. Odczyt elementów strony przez DOM.
  2. Parsowanie za pomocą wyrażeń regularnych.

Strony internetowe często zawierają błędy w składni, przez co się nie walidują i są problemy z odczytem za pomocą DOM. Postanowiłem w tym przypadku wykorzystać wyrażenia regularne do wyszukiwania interesujących mnie informacji.

No to zaczynamy.

Przygotowanie projektu

Tworzę nowy projekt mavenowy dołączając bibliotekę httpclient-4.1.4

Krok pierwszy – import spisu

Na początek tworzę prostą klasę która pobierze zawartość strony na podstawie przesłanego odnośnika:

 

Krok drugi – wyszukanie wszystkich odnośników do podstron

W tym miejscu posłużę się interfejsami utworzonymi we wcześniejszym wpisie:

  • ITextContentFinder – do wyszukiwania wartości w źródłowym tekście
  • ITextContentReceiver – do odbioru wyszukanych wartości
  • UniqueTextContentReceiver – implementacja odbierania unikalnych wartości
  • StringValidator – do walidowania tekstów

I dodaję klasę implementującą ITextContentFinder do wyszukiwania odnośników:

oraz klasę walidującą odnośniki w obrębie jednej domeny:

Ok. wywołując poniższy kawałek kodu:

otrzymuję listę odnośników:

Jak widać w wyniku zostały uwzględnione linki które nas nie interesują (np. z menu). Trzeba obciąć początkowy fragment. Przeglądam źródło i próbuję znaleźć unikalny zestaw znaków znajdujący się blisko nagłówka listy „Spis od A do Z”. Znajduję fragment według którego można podzielić stronę:

Dodaję wycięcie początkowego fragmentu strony:

i początek listy odnośników jest prawidłowy. Jest jeszcze problem z jej końcem, gdzie zawarte są odnośniki ze stopki. Należy postąpić tak samo – wyszukać unikalny ciąg znaków oddzielający listę od reszty strony i obciąć odpowiedni fragment. W tym przypadku może to być fragment:

Dodaję wycięcie końcowego fragmentu strony:

Nasza lista jest kompletna i nie zawiera żadnych zbędnych odnośników.

Przy okazji można zauważyć, że strona ma problem z ustawieniem kodowania znaków w bazie danych / wywołującego skryptu, ponieważ na samym końcu listy są filmy zaczynające się od litery „Ł” zamiast „Ż”.

Ok. mamy już sporo wykonane – pobraliśmy zawartość spisu strony i wyszukaliśmy wszystkie odnośniki. Czas na przygotowanie wyszukiwania odnośników do filmów w każdej podstronie.

 

Krok trzeci – wywołanie odnośnika do podstrony i wyszukanie źródła filmu

Wszystkie filmy osadzane są w tagach „iframe”, a ich źródłem jest odnośnik zapisany w atrybucie „src”. Przygotowuję klasę wyszukującą takie wzorce:

Krok czwarty – zapis odnośnika do filmu

W tym celu dodaję klasę zapisującą wyszukane odnośniki do pliku w formacie CSV:

Koniec

Nasze zadanie kończy wywołanie importu następującym fragmentem kodu:

Fragment danych zapisanych w pliku csv wygląda następująco:

 

Podsumowanie

Tym sposobem zdobyłem bazę 4952 odnośników do filmów dokumentalnych.
Pytanie teraz jaki będzie temat następnego wpisu? Jak wykonać importy danych wykorzystując kilka wątków? Czy może jak postawić stronę z katalogiem filmów dokumentalnych w godzinę? 🙂

 

 

 

UWAGA, ruszył Humble Book Bundle: DevOps - jak zwykle pierwszy próg 5 książek od $1, cały komplet od $15.

To również może Cię zainteresować:

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *