Kiedyś korzystałem z JSoupa do jakiegoś prostego pobierania i parsowania danych ze stronek. Z tego co pamiętam, JSoup nie operuje na strumieniach, tylko od razu wczytuje całą zawartość, ale w przypadku stron internetowych, to nie powinien być problem. Jego jQuery'owe selectory bardzo ułatwiały pracę z drzewem DOM i do takich zadań używało mi się go naprawdę wygodnie.
Ale większy problem jaki mam to jak to zrobić skoro są osobne linki do wszystkiego np:
UFC Heavyweight Rankings (265 lbs.)
Na Twoim miejscu, podzieliłbym to w ten sposób:
- Zadanie per kategoria - jakiś worker, który parsuje poszczególny rodzaj rankingu (jeśli sposób parsowania podobny, to może być to jedna implementacja tylko zmienia się kategoria parsowanego rankingu, a wraz z nią URL).
- Zadanie pobierające z głównego linka i generujące podzadania parsowania per kategoria (mogłoby np. wrzucać na jakąś kolejkę parametry do parsowania - URL, typ rankingu - a tamte podzadania uruchamiane byłyby z wykorzystaniem listenera nasłuchującego na tej kolejce)
Ja bym osobiście tam dodał jakąś wielowątkowość (np. pulę 4 wątków) z ExecutorService i CompletableFuture lub robił to z wykorzystaniem RxJava / ProjectReactor, ale w Twoim przypadku, to tylko po to, żeby się pobawić tymi frameworkami, bo zadania parsowania będą trwać dość krótko i jest ich bardzo mało.
Odnośnie modelu danych - na razie zastanów się, jak wygodnie będzie Ci te dane zapisywać w postaci POJO - ranking, zawodnik, jakie są między nimi relacje, czy ranking ma jakąś datę pobrania, czy wersjonujesz rankingi itd.
Jak już ogarniesz samo parsowanie do obiektów Java, to potem zajmij się warstwą persystencij. Wg mnie, nie ma co sobie głowy tym zaprzątać, na ten moment. ;)