Parsujemy dane z olx

Wstęp

Jsoup to biblioteka Java. Pozwala w szybki i przyjemny sposób przeparsować dokument HTML i wyciągnąć z niego interesujące nas dane. Używając gotowego parsera zamiast np wyrażeń regularnych. JSoup umożliwia klasyczne przechodzenie po drzewie ( children <> parent), jak i wyszukiwanie węzłów po:
  • html’owym id
  • dowolnych atrybutach
  • html’owych class
  • html’owym tagu (czyli nazwie znacznika)
  • selektorze css (tak, jak w arkuszu styli / jQuery)
Przejdźmy więc do działania. Zrealizujmy przeparsowanie danych z serwisu olx z zakresu rzeszowskiego rynku nieruchomości, z uwzględnieniem odpowiedniego filtrowania.
1. Tworzymy projekt ( IntelliJ IDEA )
2. Dołączamy bibliotekę jsoup

Zanim zaczniemy korzystać z Jsoup musimy dołączyć bibliotekę do naszego projektu. W tym celu przechodzimy do Maven repository. Wybierając wersję ( w moim przypadku 1.12.1 ) kopiujemy odniesienie do POM w naszym projekcie. Linkuję również dla zainteresowanych dokumentacje techniczną.

3. Rozpoczynamy zabawę

Jsoup łączy pobieranie danych jak i możliwość ich późniejszej modyfikacji. W celu pobrania źródła dowolnej strony www wystarczy wywołać jedną statyczną metodę Jsoup.connect() przekazując jej adres URL w postaci Stringa. W wyniku otrzymamy obiekt typu Connection, na którym możemy wywołać metodę get() lub post() odpowiadającym odpowiednim metodom HTTP i zwracającym obiekt typu Document, który reprezentuje dokument DOM. Metody get(), czy post() mogą rzucić wyjątek typu IOException (np. brak połączenia z internetem), który musimy obsłużyć lub zadeklarować go w sygnaturze metody.

4. Filtrujemy to co nas interesuje –  olx

Interesują nas wyłącznie mieszkania od 300 000 zł do 500 000 zł o metrażu od 80m2 na pierwszym piętrze o dowolnej zabudowie. ( kopiujemy sobie gdzieś do notatnika tak przygotowany URL  )

5. Badamy element strony HTML

Klikamy ppm na jednym z elementów wybierając „zbadaj element”

6. Poniżej możecie zauważyć drzewo

Poszukujemy zawartości wszystkich tagów <strong> które znajdują się poniżej tagu <td> zawierającego klasę title-cell. Zapytanie css dla takich znaczników wygląda następująco td.title-cell strong

7. Realizujemy kod
public class App
{
    public static void main( String[] args ) throws IOException {
        Document doc = Jsoup
                .connect("https://www.olx.pl/nieruchomosci/mieszkania/sprzedaz/rzeszow/?search%5Bfilter_float_price%3Afrom%5D=300000&search%5Bfilter_float_price%3Ato%5D=500000&search%5Bfilter_enum_floor_select%5D%5B0%5D=floor_1&search%5Bfilter_float_m%3Afrom%5D=80")
                .followRedirects(true)
                .get();
        Elements el = doc.select("td.title-cell strong");
        for(Element element : el) {
            System.out.println(element.text());
        }
    }
}

metoda select() zwróci nam obiekt typu Elements, który jest kolekcją obiektów Element

8. Efekt w konsoli

Jak widzicie, w konsoli mamy sparsowane wszystkie, wcześniej przefiltrowane rekordy naszych ogłoszeń, a raczej ich tytuły(nie musimy ograniczać się tylko do nich). Nasze działanie może mieć różne zastosowanie jak np. zrealizowanie aplikacji, która będzie nas natychmiast informowała o pojawieniu się nowego ogłoszenia.

W kolejnym artykule rozbudujemy ten wątek o zapis do bazy danych z wykorzystaniem biblioteki Hibernate.
W pilnych sprawach zachęcamy do kontaktu telefonicznego