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.