@t55fr656tg7773

Как зайти во внутреннию сылку сайта и парсить от туда данные?

мне нужно взять карточки товара сайта (цена, фотографии,описание и тд) чтобы забрать все карточки товара я должен подключиться к сайту (я сделал).Теперь вопрос как мне переходить по всем сылкам сайта и забирать только информацию товара ? Смотрел как работает рекурсия но никак не могу понять как брать только карточки товара
мой код
import java.io.IOException;
    import java.util.HashSet;
    import java.util.Set;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.select.Elements;
    
    public class readAllLinks {
    
        public static Set<String> uniqueURL = new HashSet<String>();
        public static String my_site;
    
        public static void main(String[] args) {
    
            readAllLinks obj = new readAllLinks();
            my_site = "al-style.kz";
            obj.get_links("https://al-style.kz/");
        }
    
        private void get_links(String url) {
            try {
                Document doc = Jsoup.connect(url).userAgent("Mozilla").get();
                Elements links = doc.select("a");

                if (links.isEmpty()) {
                   return;
                }

                links.stream().map((link) -> link.attr("abs:href")).forEachOrdered((this_url) -> {
                    boolean add = uniqueURL.add(this_url);
                    if (add && this_url.contains(my_site)) {
                        System.out.println(this_url);
                        get_links(this_url);
                    }
                });
    
            } catch (IOException ex) {
    
            }
    
        }
    }

Не очень понимаю всю логику кода ибо иногда выдает какуето дичь
Есть еще один код но он без рекурсии (работает более логично но выдает только первые сылки каталогов)
Кто то может помочь либо объяснить как работает рекурсия в коде
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
@azerphoenix
public class readAllLinks {
Названия классов должны начинаться с заглавной буквы. Прочитайте про name convention

Что касается вашего кода, то есть много нюансов.
мне нужно взять карточки товара сайта (цена, фотографии,описание и тд) чтобы забрать все карточки товара я должен подключиться к сайту (я сделал)

Вы просто открыли главную страницу сайта и выбрали ВСЕ ссылки (тег а).
Elements links = doc.select("a");

Теперь вопрос как мне переходить по всем ссылкам сайта и забирать только информацию товара?

Я бы сделал следующим образом. Вместо того, чтобы собирать все ссылки, я бы собрал ссылки на разделы (категории).

5f7f96bf48139905711369.png
Вот, селектор
#categories .sub-menu-item .sub-menu-link
Далее собираете их в какой-нибудь List

Далее итерируете по этому списку и переходите по ссылке, также как и здесь
doc = Jsoup.connect(url).userAgent("Mozilla").get();

вместо url будет ссылка из листа спарсенная из меню (картинка выше)

Страница каталога товаров имеет пагинацию.
Например, https://al-style.kz/catalog/mobilnye_telefony/
5f7f97fc965ae322761133.png

Смотрим, как работает пагинация
https://al-style.kz/catalog/mobilnye_telefony/
https://al-style.kz/catalog/mobilnye_telefony/?PAGEN_1=2
?PAGEN_1={pageNum}

По факту к урл добавляется query param, который инкрементируется, а значит после того, как мы перешли на страницу категории, мы для каждой категории добавляем этот параметр и инкрементируем его значение до тех пор, пока страницы не закончатся. В зависимости от сайта можно по-разному проверять есть ли страница или нет.
Например, проверить просматривется ли или существует ли тот или иной блок.

Далее на каждой странице находим блоки (карточки товара).
Вот, селектор:
.elements .element
5f7f99505660f300295427.png

Находим селектор ссылки и сохраняем тоже в отдельный List
.elements .element .link
После того, как постранично прошлись по категории и собрали список всех ссылок карточек товара итерируем по этому списку и также открываем эти ссылки.

Т.е. страницу самого товара - например, https://al-style.kz/catalog/mobilnye_telefony/mobi...

Ну а дальше остается собрать данные при помощи в селекторов, сохранить в pojo (например, Product ) и экспортировать куда-нибудь.

Для экспорта в xlsx можно использовать Apache POI
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
XCritical Software Санкт-Петербург
До 370 000 ₽
от 150 000 до 200 000 ₽
ENRSOFT Екатеринбург
от 50 000 ₽