Рубрики
Без рубрики

Обход и анализ веб-сайта на Java с помощью JSoup

Существует множество сценариев, в которых вам потребуется проанализировать содержимое веб-сайта для извлечения данных…. С тегами java, jsoup, синтаксический анализатор.

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

Статья, первоначально опубликованная на моем личном веб-сайте в разделе Как проанализировать веб-сайт на Java

Создание всего синтаксического анализатора довольно сложно, но, к счастью, уже существует библиотека, которая выполняет сложные части за нас: JSoup. Он предоставляет все необходимые инструменты и API для анализа и извлечения данных веб-сайта. Он довольно прост в использовании и освоении, что делает его идеальным для большинства подобных приложений.

Установление соединения с помощью JSoup

Для примеров я буду использовать свой собственный веб-сайт. Итак, давайте начнем. Во-первых, мы должны установить соединение с веб-сайтом и получить HTML-документ. Вот как мы подключаемся к сайту и анализируем DOM с помощью JSoup.

Connection connection = Jsoup.connect("https://petrepopescu.tech");
Document document = connection.execute().parse();

Мы могли бы использовать упрощенную версию, используя только Jsoup.connect(” https://petrepopescu.tech “).get( ), но я выбрал более сложную версию, чтобы показать шаги, которые выполняет библиотека. Кроме того, мы можем легко использовать дополнительные функции, такие как настройка агента пользователя (Jsoup.connect(url).UserAgent(агент)) или прокси-сервера (connection.proxy(хост, порт)), функции, которые очень удобны при выполнении полного анализа сайта, потому что это сводит к минимуму вероятность блокировки вашего приложения их брандмауэром.

Анализ элементов веб-сайта

Теперь, когда мы успешно установили соединение и JSoup проанализировал страницу, давайте попробуем идентифицировать элементы на странице и получить их содержимое. В первом примере я буду извлекать категории и ссылки на конкретные страницы. Используя инспектор браузера, мы можем видеть, что категории представлены в виде элементов списка, которые находятся внутри div с идентификатором категории 3.

Такой же подход можно применить практически к любому веб-сайту и элементу на странице, чтобы определить необходимые критерии идентификации.

Если возможно, всегда используйте идентификаторы, так как они уникальны на странице или, по крайней мере, должны быть уникальными. Если этого недостаточно, вы можете сделать выбор по классу, типу и простой навигации в структуре страницы, чтобы получить именно тот элемент, который вам нужен. Это именно то, что мы собираемся сделать сейчас, чтобы найти все ссылки на категории и названия категорий.

Сначала мы найдем элемент с идентификатором категории-3, а затем мы будем искать элементы списка, выполняя поиск элементов с тегом li. из этих элементов мы получаем атрибут href и текст. Наконец, мы печатаем товары.

Element categoriesMenu = document.getElementById("categories-3");
List categories = categoriesMenu.getElementsByTag("li");

Map categoriesLinks = new HashMap<>();
for (Element category:categories) {
    Element link = category.getElementsByTag("a").get(0);
    String url = link.attr("href");
    String categoryName = link.text();

    categoriesLinks.put(categoryName, url);
}

for (Map.Entry category:categoriesLinks.entrySet()) {
    System.out.println(category.getKey() + " - " + category.getValue());
}

Использование селектора в JSoup для извлечения элемента

Иногда бывает не так просто получить именно тот элемент, который вы хотите. У него нет идентификатора, или несколько элементов имеют один и тот же идентификатор, или, возможно, идентификатор является динамическим. Например, статьи, представленные на первой странице, имеют уникальный идентификатор, который создается для каждой отдельной статьи следующим образом: “post-“. Что, если вы хотите получить отрывок для каждого из них? Именно здесь в игру вступает метод select из JSoup. Вы можете написать сложный селектор, который поможет с идентификацией и извлечением нужного вам элемента.

Например, это один из способов получить выдержки с первой страницы.

Elements contentElements = document.select("article");
Map articles = new HashMap<>();
for (Element element:contentElements) {
    Elements postTextElements = element.getElementsByClass("entry excerpt entry-summary");
    if (postTextElements.size() == 1) {
        articles.put(element.attr("id"), postTextElements.get(0).text());
    }
}

for (Map.Entry article:articles.entrySet()) {
    System.out.println(article.getKey() + " - " + article.getValue());
}

Если мы хотим быть еще более конкретными, мы можем получить все элементы типа article с идентификатором, как описано выше, используя более сложный селектор. Поскольку это занимает немного больше времени из-за регулярного выражения, мы можем немного оптимизировать его, выполнив поиск только внутри div с фактическим содержимым, а не на всей странице. Для этого мы просто заменим первую строку следующей: Elements.getElementById (“сетка-оболочка”).select(“статья[идентификатор~=сообщение-*]”);

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

Выводы

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

И, как всегда, вы можете скачать полный исходный код с моего сайта

Статья, первоначально опубликованная на моем личном веб-сайте в разделе Как проанализировать веб-сайт на Java

Оригинал: “https://dev.to/pazvanti/crawling-and-parsing-a-website-in-java-using-jsoup-ifa”