Как парсить данные с сайта java
Для парсинга данных с веб-сайта в Java можно использовать библиотеку Jsoup .
- Добавьте зависимость в файл build.gradle :
dependencies implementation 'org.jsoup:jsoup:1.14.3' >
- Создайте экземпляр класса Document , передав в качестве параметра URL адрес страницы:
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.IOException; public class Main public static void main(String[] args) throws IOException Document doc = Jsoup.connect("https://www.example.com/").get(); System.out.println(doc.title()); > >
- Используйте методы класса Document для получения нужных элементов страницы, например:
// Получить все ссылки на странице Elements links = doc.select("a[href]"); for (Element link : links) System.out.println(link.attr("href")); > // Получить текст заголовка страницы String title = doc.title(); System.out.println(title);
Пример выше показывает, как получить все ссылки на странице и текст заголовка страницы. С помощью Jsoup вы также можете извлекать другие элементы страницы, такие как изображения, таблицы, формы и т. д.
Лёгкий парсинг HTML с помощью jsoup

Возможно, когда-нибудь вам будет необходимо получить информацию с какого-либо сайта либо HTML-документа в своем приложении, и я без лишних слов скажу, что использование библиотеки jsoup существенно упростит вашу задачу. Как говорится на wiki, jsoup — это Java-библиотека с открытым исходным кодом, предназначенная для анализа, извлечения и управления данными, хранящимися в документах HTML.
Быстрый старт
Библиотеку можно скачать в виде jar файла и поместить в проект, а также подключить с помощью Maven/Gradle. Ссылку на официальный сайт я оставлю в конце статьи: там вы сможете найти актуальную версию библиотеки. В примере будем использовать подключение через Maven. Добавим зависимость:
org.jsoup jsoup 1.11.3
Использование
Первым делом вам необходимо получить экземпляр класса Document из org.jsoup.nodes.Document с указанием на источник для разбора. Им может выступать как локальный файл, так и ссылка. Для примера, в данной статье мы будем использовать сайт yandex.ru и попытаемся получить их актуальную новостную ленту:
Document doc = Jsoup.connect("https://yandex.ru/") .userAgent("Chrome/4.0.249.0 Safari/532.5") .referrer("http://www.google.com") .get();

User Agent является идентификатором, который сообщается посещаемому сайту. На многих сайтах он является важнейшим критерием для антиспам фильтра. Referrer содержит URL источника запроса. Метод get() вызывает обрабатываемое исключение IOException, так что мы можем обернуть все в try/catch блок, либо просто перебросить его дальше с помощью throws . На данный момент мы получили исходный код данной страницы. При необходимости библиотека jsoup сама может восстановить поврежденные элементы. Теперь нам остается лишь сузить поиск до отдельного блока. Метод select() имеет большую выборку в использовании: он позволяет искать элементы по тегу, атрибутам, классу и другим параметрам. Почти все современные браузеры поддерживают возможность быстрого поиска исходного кода выбранного элемента. Нехитрыми манипуляциями, мы находим исходный код нужного нам элемента и получаем div блок с указанным классом, его мы и будем использовать для выборки. Воспользуемся классом Elements из org.jsoup.select.Elements, для выборки всех элементов из нашего выбранного блока.
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");

Сейчас мы имеем что то вроде этого: Теперь нам остается лишь использовать небольшой цикл для пробора всех элементов:
for (Element element : listNews.select("a")) System.out.println(element.text());

Метод text() позволяет отбросить код разметки и оставляет лишь сочетание текста для всех входящих элементов. Результат выполнения будет таков: Нетрудно заметить, что реальное количество полученных строк не соответствует фактическому отображению на странице. В этом и заключаются подводные камни. Если посмотреть исходный код разметки, можно заметить, что последняя новость анимационно меняется с определенным интервалом времени. Часть таких «камней» решается дополнительной выборкой, ну и конечно тестами. Может оказаться так, что первые пять элементов будут содержать нужную нам информацию, а на шестом элементе будет лишь заскриптованная пустая строка. Бывает и такое, что блоки не будут обладать какими-либо идентификаторами, тогда есть возможностью прямо указать с помощью метода get(int index) на номер позиции рассматриваемого элемента.
System.out.println(listNews.select("a").get(2).text());
Заключение
В данном примере показана лишь малая часть того, на что способен jsoup. Не стоит отменять и тот факт, что сайты нередко обновляются, изменяя структуру кода разметки, так что при работе с парсингом нужно быть готовым адаптироваться к изменениям. Больше информации и актуальную версию вы можете получить на официальном сайте jsoup.org, более подробно почитать про классы и методы можно по ссылке o7planning.org. Оставлю ссылку на мой github, на момент написания статьи там находится несколько Telegram-ботов, которые используют Jsoup для получения и выдачи информации.
РЕАЛИЗАЦИЯ ПАРСИНГА СРЕДСТВАМИ JAVA Текст научной статьи по специальности «Компьютерные и информационные науки»
Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Цхошвили Д.З., Иванова Н.А.
В работе рассматривается использование средств парсинга в мобильных приложениях для автоматического обновления информации, а также описывается процесс разработки простого мобильного приложения, отображающего каталог сериалов, взятый с сайта.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Цхошвили Д.З., Иванова Н.А.
ИЗВЛЕЧЕНИЕ ДАННЫХ С ВЕБ-РЕСУРСОВ, СОДЕРЖАЩИХ РАЗНОРОДНУЮ ИНФОРМАЦИЮ
ВОЗМОЖНОСТИ СРЕДЫ ECLIPSE ДЛЯ РАЗРАБОТКИ ИНТЕРФЕЙСОВ МОБИЛЬНЫХ ПРИЛОЖЕНИЙ
Проектирование мобильного приложения для поиска междугородних рейсов автобусного транспорта с помощью API Яндекс. Расписания
Разработка системы оповещений студентов ВУЗа для мобильных устройств
РЕШЕНИЕ ПРОБЛЕМЫ АБСТРАГИРОВАНИЯ ОТ ПЛАТФОРМОЗАВИСИМОГО КОДА ДЛЯ ПРИЛОЖЕНИЙ IOS И ANDROID НА ПРИМЕРЕ ДВИЖКА SADLION ENGINE
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.
IMPLEMENTATION OF PARSING TOOLS JAVA
This paper considers the use of parsing in mobile applications to automatically update data, and describes the process of developing a simple mobile application that displays a catalog of series, taken from the site.
Текст научной работы на тему «РЕАЛИЗАЦИЯ ПАРСИНГА СРЕДСТВАМИ JAVA»
РЕАЛИЗАЦИЯ ПАРСИНГА СРЕДСТВАМИ JAVA
Д.З. Цхошвили, Н.А. Иванова
Брянский государственный университет имени академика И.Г. Петровского
В работе рассматривается использование средств парсинга в мобильных приложениях для автоматического обновления информации, а также описывается процесс разработки простого мобильного приложения, отображающего каталог сериалов, взятый с сайта.
Ключевые слова: Eclipse, мобильные приложения, парсинг, веб-страницы, среда разработки, адаптер.
Разработка мобильных приложений в настоящее время является довольно популярным направлением. Это не удивительно, ведь мобильные приложения сейчас очень распространены и выполняют множество различных функций.
При разработке простого мобильного приложения данные могут заноситься разработчиком вручную, но при большом объеме информации или часто меняющихся данных это весьма неудобно и занимает много времени. В этом случае можно воспользоваться возможностями парсинга.
Парсинг сайтов — это последовательный синтаксический анализ информации, размещённой на интернет-страницах [1]. В данной статье будет рассмотрен процесс разработки простого мобильного приложения, отображающего каталог сериалов, которые выходят на данный момент. Актуальная информация о сериалах будет извлекаться с сайта toramp.com [2]. На сайте можно посмотреть график выхода серий сериалов, добавить любимые сериалы в расписание и отслеживать даты выхода новых серий. Также можно почитать новости мирового кинематографа и статьи о лучших сериалах.
Для разработки мобильных приложений существует большое число сред разработки. Одной из самых популярных является Eclipse, базовым языком которой является Java. Достоинствами Eclipse по сравнению с другими средами разработки являются удобный и понятный интерфейс, кроссплатформенность, возможность установки дополнений, а также настройки среды.
Процесс разработки данного приложения можно разделить на несколько этапов: создание интерфейса, добавление библиотеки в проект и реализация функционала.
Для начала необходимо создать новый проект File/New/Project, задать имя и версию Android, остальные пункты оставить по умолчанию.
Затем на форму activity_main нужно добавить компонент ListView, служащий для отображения списков, можно также сразу пометать фон окна (рис.1).
Рис. 1. Конструктор формы.
Далее в папке layout необходимо создать второй файл list_item.xml и добавить на форму текстовое поле — элемент списка, в котором и будет выводиться информация с сайта. Задать его id, так же можно прописать стиль текста — «жирный» и сделать отступы (рис. 2).
|g| list_item.xml ¡3
1 ^ ?xrnl version=»2. в» encoding=»ut/-8″?>
android:layout_width=»match_parent» android: layout_height=»/r?atch_parent» android:orientations»vertical» >
11 android :textStyle=»f>otd»
Рис. 2. Редактирование list_item.xml.
На этом редактирование интерфейса приложения окончено.
Для взаимодействия с веб-страницами в Java существует несколько библиотек, в данной статье будет использована библиотека JSoup. Java-библиотека Jsoup предназначена для разбора HTML-страниц (парсинга), позволяет извлечь необходимые данные, используя DOM, CSS и методы в стиле jQuery.
Библиотека поддерживает спецификации HTML5 и позволяет разбирать страницы так же, как это делают современные браузеры. JSoup имеет функционал, состоящий из двух классов: Document — он позволяет получить нужную страницу, и Element — он позволяет получить нужный элемент.
На следующем шаге нужно добавить библиотеку JSoup. Для этого зайти на официальный сайт jsoup.org [3], скачать ее и скопировать в папку libs проекта.
Далее её следует подключить, щелкнув на ней правой кнопкой мыши и выбрав команды Build Path/Add to Build Path. Теперь библиотека отображается в папке Referenced Libraries проекта. Дерево проекта изображено на рисунке 3.
> gen [Generated Java Files]
> Bib Android Private Libraries v Hft Referenced Libraries
Рис. 3. Дерево проекта.
На следующем шаге требуется отредактировать файл MainActivityjava. Для заполнения элементов списка потребуется адаптер — шаблон проектирования, который используется для преобразования интерфейса таким образом, чтобы он мог работать с другим, несовместимым, интерфейсом [4]. Данные о сериалах, взятые с сайта, будут записываться в массив адаптера, назначенный элементу ListView (листинг 1).
lv = (ListView) findViewById(R.id.listViewl);
adapter = newArrayAdapter(this, R.layout.list item, R.id.pro item, titleList);
Также необходимо описать метод NewThread, выполняющий запросы в фоновом режиме, указать, какую страницу парсить и какие именно элементы (листинг 2).
Public class NewThread extends AsyncTask
protected String doInBackground (String. arg)
content = doc.select(«.title»); titleList.clear();
Через цикл for организовать захват элементов со страницы и их запись в массив значений элементов списка (листинг 3).
for (org.jsoup.nodes.Element contents: content)
> catch (IOException e)
После этого нужно отредактировать файл AndroidManifest, добавив разрешение приложению выходить в Интернет (листинг 4).
На этом разработка приложения закончена, и можно проверить его работоспособность на эмуляторе (рис.4). В качестве виртуального устройства использовался Nexus One с диагональю экрана 3,7 дюйма и разрешением экрана 480*800 пикселей. Версия Android -4.4.2. При запуске приложения на экран выводится список сериалов, информация о которых получена с сайта toramp.com.
I 5554:deuice __и
i|i WebParsing . 1
Теория большого взрыва
Две разорившиеся девочки
Рис. 4. Запуск проекта на эмуляторе.
Использование возможностей парсинга значительно облегчает разработку мобильных приложений, достаточно всего лишь указать веб-страницу и элементы, которые нужны в приложении. С сайтов можно брать различную информацию, которая меняется и не обновлять ее вручную, например курс валют или погоду. При подключении к интернету все данные обновляются в приложении автоматически.
1. Парсинг: что это такое и как он создается. [Электронный ресурс]. URL:http://fb.ru/ article/261908/parsing-chto-eto-takoe-i-kak-on-sozdaetsya. (Дата обращения: 22.01.2017).
2. Toramp.com. [Электронный ресурс]. URL:http://www.toramp.com. (Дата обращения: 23.01.2017).
3. Официальный сайт JSoup. [Электронный ресурс]. URL:https://jsoup.org. (Дата обращения: 21.01.2017).
4. IBM Developer Works. [Электронныйресурс]. URL: http://www.ibm.com/ developerworks/ru/library/j-ft11/index.html. (Дата обращения: 22.01.2017).
Сведения об авторах
Цхошвили Д.З. — магистрант направления подготовки «Прикладная математика и информатика», Брянский государственный университет имени академика И.Г. Петровского, darya9312@mail.ru.
Иванова Н.А. — кандидат технических наук, доцент кафедры информатики и прикладной математики, Брянский государственный университет имени академика И.Г. Петровского, ivanova_natala@mail.ru.
IMPLEMENTATION OF PARSING TOOLS JAVA
D.Z. Tskhoshvili, N.A. Ivanova
Bryansk State University named after Academician I. G. Petrovsky
This paper considers the use of parsing in mobile applications to automatically update data, and describes the process of developing a simple mobile application that displays a catalog of series, taken from the site. Keywords: Eclipse, mobile applications, parsing the web page, the IDE adapter.
1. Parsing: what it is and how it is created. [Electronic resource]. URL: http: //fb.ru/article/261908/parsing-chto-eto-takoe-i-kak-on-sozdaetsya. (Reference date: 01.22.2017).
2. Toramp.com. [Electronic resource]. URL: http: //www.toramp.com. (Reference date: 01.23.2017).
3. The official website JSoup. [Electronic resource]. URL: https: //jsoup.org. (Reference date: 01.21.2017).
4. IBM Developer Works. [Electronic resource]. URL: http://www.ibm.com/developerworks/ru/library/j-ft11/index.html. (Reference date: 01.22.2017).
Tskhoshvili D.Z. — graduate student, Department of applied mathematics and computer science, Bryansk State University named after Academician I. G. Petrovsky, darya9312@mail.ru.
Ivanova N.A. — Candidate of Physical and Mathematical Sciences, Associate Professor, Department of applied mathematics and computer science, Bryansk State University named after Academician I. G. Petrovsky, ivanova_natala@mail.ru.
Библиотека jsoup — Суп с котом

Первоначально статья писалась, когда деревья были большими, коты были котятами, Android был версии 2.3, а библиотека jsoup была версии 1.6.1.
С тех пор утекло много воды. Хорошая новость — библиотека подросла до версии 1.13.1, стала чуть меньше размером, стала быстрее работать (почти в два раза). Плохая новость — мои примеры, связанные с интернетом, перестали работать в Android 4.0, так как теперь явно запретили использовать сетевые операции в основном потоке.
Я оставлю старую версию статьи здесь. Если вы пишете программы под старые устройства, то всё остаётся без изменений. Примеры под новые устройства находятся в закрытой зоне 4 курса.
Общая информация
Рассмотрим примеры работы с библиотекой jsoup. Java-библиотека jsoup предназначена для разбора HTML-страниц (парсинг), позволяя извлечь необходимые данные, используя DOM, CSS и методы в стиле jQuery.
Библиотека поддерживает спецификации HTML5 и позволяет парсить страницы, как это делают современные браузеры.
Библиотеке можно подсунуть для анализа URL, файл или строку.
Подключаем библиотеку
В Android Studio пропишите в файле build.gradle строку в блоке зависимостей.
implementation 'org.jsoup:jsoup:1.13.1'
Создаём новый проект JsoupDemo. Добавляем на форму кнопку и TextView.
После установки библиотеки вам нужно получить документ для разбора текста. Это может быть страница на сайте или локальный файл на устройстве. Таким образом вам надо подключиться к нужной странице и получить объект класса Document. При импортировании обращайте внимание на полное название класса org.jsoup.nodes.Document, так как многие пакеты имеют в своём составе одноимённый класс.
Document doc = Jsoup.connect(URL).get();
Получив документ в своё распоряжение, вы можете извлекать требуемую информацию. Например, вы можете получить все теги meta:
Elements metaElements = doc.select("meta");
Метод select() позволяет получить нужные теги.
Если нужно получить атрибут тега, то используйте метод attr():
String name = metaElement.attr("name");
Можно выбрать теги с заданным классом. Например, на странице встречается тег типа
Elements mainHeaderElements = doc.select("h2.main");
Первый пример для знакомства
Для первого знакомства разберём простой пример. А потом будем его усложнять. Создадим переменную, содержащий html-текст. Далее вызываем библиотеку jsoup и смотрим на результат.
// Kotlin // Если этот код работает, его написал Александр Климов, // а если нет, то не знаю, кто его писал. package ru.alexanderklimov.jsoupdemo import android.os.Bundle import android.widget.Button import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import org.jsoup.Jsoup class MainActivity : AppCompatActivity() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView: TextView = findViewById(R.id.textView) val button: Button = findViewById(R.id.button) button.setOnClickListener < val html = ("Коты учатся кодить " + "Коты умеют шкодить.
Они великие программисты." + "
А еще они умеют мяукать.
" + "Подробности здесь" + "") val doc = Jsoup.parse(html) textView.text = doc.html() > > >
// Java package ru.alexanderklimov.jsoupdemo; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class JsoupDemoActivity extends Activity < @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button button = findViewById(R.id.button); final TextView txtView = findViewById(R.id.textView); button.setOnClickListener(new OnClickListener() < @Override public void onClick(View v) < String html = "Коты учатся кодить " + "Коты умеют шкодить.
Они великие программисты." + "
А еще они умеют мяукать.
" + "Подробности здесь" + ""; Document doc = Jsoup.parse(html); textView.setText(doc.html()); > >); > >
Запустите проект и нажмите на кнопку. На экране отобразится наш текст. Но если вы присмотритесь внимательнее, то заметите некоторые отличия (скорее всего вы и не заметили). Я намеренно сделал две «ошибки». Во-первых, я не закрыл тег , а также не закрыл тег у первого параграфа. Однако библиотека сама подставила недостающие элементы. Именно так поступают и браузеры, если веб-мастер по невнимательности забывает ставить закрывающие парные теги.

Что мы сделали? Мы передали нужный html-текст библиотеке Jsoup и попросили его осуществить его разбор (метод parse()). В результате мы получаем экземпляр класса Document, из которого с помощью метода html() извлекаем уже обработанный текст, с которым можно работать дальше.
Если у вас всё получилось, то можно перейти к более сложным примерам. Подробная документация по методам и свойствам есть на сайте библиотеки. Вам нужно только пробовать.
Извлекаем заголовок страницы
Заголовок страницы находится в теге . Чтобы получить текст заголовка, воспользуемся методом Document.title():
// Kotlin textView.text = doc.title()
// Java textView.setText(doc.title()); // вернёт строку "Коты учатся кодить"
Извлекаем ссылки
Теперь попробуем поработать с ссылками. В нашем тексте есть ссылка, которую можно разбить на несколько логических элементов: адрес, на который ведёт ссылка, текст в ссылке и полная ссылка, которая объединяет оба элемента.
Начнём с адреса ссылки:
// Kotlin val doc = Jsoup.parse(html) val link = doc.select("a").first() val linkHref = link.attr("href") textView.text = linkHref
// Java Document doc = Jsoup.parse(html); Element link = doc.select("a").first(); String linkHref = link.attr("href"); textView.setText(linkHref); //http://developer.alexanderklimov.ru
Чтобы получить текст ссылки:
// Kotlin val linkInnerH = link.html() textView.text = linkInnerH
// Java String linkInnerH = link.html(); textView.setText(linkInnerH); //Подробности здесь
И, наконец, общий вариант:
// Kotlin val linkOuterH = link.outerHtml() textView.text = linkOuterH
// Java String linkOuterH = link.outerHtml(); tvInfo.setText(linkOuterH);
Разбор текста с сайта
Этот пример не работает на новых устройствах, так как запрещено работать с сетью в общем потоке!
Некоторые несознательные граждане могут меня обвинить в том, что я использовал синтетический пример, специально подготовленный для демонстрации. И хотят видеть пример с использованием ваших тырнетов. Ну что ж, вот вам пример.
Document doc = null; try < doc = Jsoup.connect("http://developer.alexanderklimov.ru/android/").get(); >catch (IOException e) < e.printStackTrace(); >String title = doc.title(); textView.setText(title);
Я подключаюсь к самой известной странице в мире http://developer.alexanderklimov.ru/android/ и получаю его заголовок.
Не забудьте установить разрешение на подключение к Интернету вашей программе. Я сам сначала долго тупил, не понимая, почему моя программа вылетала с ошибкой. Но, посмотрев в честные глаза своего кота, я понял в чем моя ошибка и исправил ее. Коты рулят.
Разбор текста из файла
Последний пример, который мы не разобрали — это разбор текста из файла. В этом случае используется метод Jsoup.parse(File in, String charsetName, String baseUri):
File input = new File("/tmp/input.html"); Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
Попробуйте самостоятельно. Удачи в программировании! Да пребудет с вами кот!
