Android studio парсинг ajax

Как я делал парсинг расписания

Дорогой читатель! Если тебя интересует парсинг html и разработка под Android, то эта статья для тебя. Надеюсь ты найдешь в ней много интересного и полезного. В ней я хочу поделиться своим опытом в данной сфере.

Описание проблемы

Немного обо мне. Я студент третьего курса ИТА ЮФУ. Также как и всем студентам, мне нужно каждый день смотреть расписание занятий. Причём мне нужно знать расписание не только на следующий день, но и на одну-две недели вперёд.

Казалось бы, почему нельзя просто сохранить расписание и пользоваться им? К сожалению, есть ряд причин, которые этому препятствуют, а именно:

  • Расписание на одну неделю может сильно отличаться от расписания на другую
  • Расписание не постоянно и может меняться

Конечно, есть сайт с расписанием, но он не очень удобен, так как на нём выводится просто сырая таблица с расписанием на 20 недель. Студенту приходится листать большую страницу, в поисках расписания на нужный день. Кроме того, в оффлайн режиме расписание становится недоступным.
Я решил сделать небольшое приложение, которое могло бы парсить сайт с расписанием моего института, и обладало бы следующим набором плюшек:

  • Отображение: номера текущей недели, даты, дня недели и расписания на этот день
  • Возможность перелистывать расписание кнопками «назад» и «далее»
  • При отсутствии интернета показывать последнюю загруженную оффлайн версию расписания

Приступим к экзекуции

Итак, закатав рукава, я приступил к работе. Начать необходимо с малого. А именно — с редактирования файла манифеста. Стоит помнить, что наше приложение будет работать с интернетом и нам очень важно получить соответствующее разрешение:

Идём в manifests->AndroidManifest.xml. Добавляем permission. В итоге получается что-то типа этого:

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

Теперь начнём писать парсинг. Тут нам поможет замечательный парсер с открытым исходным кодом Jsoup. Вариант с использованием WebView я сразу отмёл, так как я посчитал этот способ крайне неудобным. К тому же мне не очень хотелось использовать лишний виджет, без которого легко можно обойтись.

Добавляем зависимость в build.gradle:

Не стоит забывать, что работа с web для Android — это тяжёлая задача. Чтобы приложение не висло, нужно чтобы работа с web располагалась вне потока UI. Поэтому будем использовать класс AsyncTask. В него мы и заложим основной функционал, а потом просто передадим данные в UI-поток.

Для тех, кто не знаком с AsyncTask, хочу сказать, что данный класс должен располагаться внутри класса вашего activity. Сам класс приведён ниже.

В итоге мы получим данные вот в таком виде:

Разберём методы, которые мы использовали:

Создаём элемент типа Document

Теперь достаём содержимое тега body

В Jsoup также можно получить содержимое других основных тегов. Например можно получить заголовок страницы, используя метод title() и т.д. Метод html() Возвращает html код, а text() — обычный текст без html тегов.

Получив html код, можно преобразовать его в обычный текст, убрав все теги. Это можно сделать с помощью parse(htmlcode).text():

Хотелось бы поделиться ещё полезными методами Jsoup, которые не были использованы:

На картинке в спойлере выше приведён пример расписания на одну неделю. В действительности нам будет возвращено 20 таких недель. Теперь наша задача найти в этом наборе данных сегодняшний день и вывести его.

Читайте также:  Квест для андроид рейтинг

Доведение до ума

Итак, что мы имеем? Мы научились приводить html код страницы в строку, которую можно легко распарсить. Это легко можно сделать используя строковые методы .split() и .replace().

В общем случае алгоритм будет выглядеть так.

Сначала получаем нужную дату от Android. Потом делаем два цикла, один вложенный в другой. Первый цикл проходит по неделям, второй, который внутри него, пробегает по дням недели. Если дата данного дня совпадает с датой, полученной от Android, то выводим расписание этого дня в текстовое поле. Однако каждый может написать этот алгоритм по своему. Я прикрепил свою версию его реализации.

выборка расписания происходит в методе formating(). Подав на вход методу дату, мы получим расписание на данный день. Так мы легко можем реализовать код для кнопок «назад» и «далее»

Код кнопки «Далее»:

С помощью Calendar мы получаем сегодняшнюю дату. С помощью метода add мы прибавляем к сегодняшней дате количество дней, записанных в count. Код кнопки «назад» будет аналогичен, только из count нужно будет убавлять значение.

Заключение

Конечно, можно поработать над дизайном, но это уже другая тема. Я лишь хотел поделиться основными технологиями. В спойлерах ниже я прикрепил скриншоты с улучшенным дизайном. Также я добавил несколько функций, например: настройки, возможность выбрать учебную группу и т.д. Само приложение можно будет посмотреть чуть позже, как только доведу его до ума.

Источник

Android programmers blog

Simply about difficult

Поиск по этому блогу

пятница, 29 ноября 2013 г.

Парсинг сайта в Android

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

На главном сайте этой библиотеки есть пример работы, но не каждый будет читать что та написано, поэтому я решил что я напишу у себя как это сделать, заодно заметка будет что бы не забыть на будущее (:.

В общем все как по старинке, запускаем Eclipse, создаем проект. Значит парсить мы будем freehabr.ru, стырим у них название поста чисто для примера.

И так для начала скачивайте библиотеку с сайта jsoup.org , дальше добавляйте ее в папку libs/ которая есть в вашем проекте.

Дальше открывайте файл MainActivity.java или как он там у вас называется и удаляем все. Наша программа будет состоять из двух классов, первый будет у нас главным, это собственно наш MainActivity, а второй будет внутренний, который будет выполнять запросы на сайт который мы хотим парсить, в нем будет происходит парсинг и разбор данных.

Давайте я привелу код нашего класса с комментариями, я думаю там будет все понятно.

Из комментариев ясно что и как тут работает, надеюсь.

Далее нам нужно создать разметку, она у нас будет простая, всего лишь один листвью в который мы будем выводить весь текст который спарсим.

И нам нужно не забыть добавить разрешение приложению выходить в интернет для этого нам нужно прописать в AndroidManifest.xml две строки чуть выше :

Все теперь все должно работать и при запуске приложения вы должны видеть примерно вот такую картинку.

Источник

Android and Jsoup. Парсим вебсайт на вордпрессе. Расписание уроков — часть 3

Приветствую читателей и гостей сайта Компьютерапия. Сегодня в который раз мы продолжим «мучать» по многочисленным просьбам наше приложение для android — расписание уроков для 11-6 классов.

Читайте также:  Gps receiver для android

Некоторое время тому назад я опубликовал статью и видео о преимуществах регистратора доменных имен Reg.ru и наглядно показал как сделать перенос WordPress сайта с локального компьютера на хостинг reg.ru.

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

Проект в Android Studio

И сразу, пока не забыли, давайте в файл AndroidManifest.xml внесем пользовательские разрешения для работы с интернетом,

иначе наше приложение и не стоит и пытаться написать.)))

В Android Studio будем использовать проект из предыдущего урока, полностью код с нуля писать не будем, сохраните проект под другим именем.

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

Если вы не знаете или забыли, как работать с фрагментами, то прочтите статью Создание фрагментов и использование вкладок для Android.

По сравнению с прошлым проектом, в первой активности изменений нет, единственное, что я изменил, это имя вызываемой через Intent второй активности. Во второй активности — в конструкции switch-case вписал полное имя пакета перед классом фрагмента. Почему? Потому-что Android Studio 3.0.1, капризная как не знаю кто. )))

Во фрагментах убраны переменные и классы, относящиеся к DatabaseHelper, и добавлены новые переменные

Переменная private ListView mList будет использоваться из прошлого урока, так как она связана с элементом ListView android:id=»@+id/android:list» в каждом фрагменте, для отображения текста в TextView uroki файла item.xml.

Фрагмент получает параметр classId, который участвует в формировании и отображении данных. Как вы помните, fragment_main11 отвечает за данные понедельников, а classId отфильтровывает данные для каждого класса.

В onActivityCreated добавьте следующий код

(это асинхронный поток и текстовый адаптер, для связи со списком уроков) и под ней новый класс, действующий в фоновом режиме

Подключаем библиотеку JSoup

В этом классе мы обращаемся к jar библиотеке JSoup, которую нужно скачать и добавить в папку libs вашего проекта. В любом поисковике наберите “jsoup for android”, скачайте по ссылке и поместите в проект. После этого библиотека будет видна в Android Studio. В зависимости в файле build.gradle добавлять ее не нужно, так как запись

уже сама добавит любой jar файл в проект из папки libs.

А во фрагменте переменная doc типа Document, Jsoup делает подключение connect к адресу страницы, которую необходимо спарсить и в content из doc методом select выбирается класс poned элемента ul списка li. Для фрагмента, отвечающего за вторник в методе select будет такая запись: «.vtorn >li».

Наш тестовый сайт на WordPress

Для наглядности перейдем на сайт и посмотрим, как организовать страницы в WordPress. Надеюсь вы уже зарегистрировались в Reg.ru, купили домен и хостинг, установили на него WordPress, сделали свой сайт, и теперь нужно создать шесть страниц(11 класс, 10 класс и т.д.) для парсинга, со списком уроков по дням.

HTML код страниц

В html коде список выглядит вот так, h2 — заголовок дня на странице ul с классом дня недели и строки списка li.

Наше приложение будет ориентироваться на класс элемента ul, и во фрагмент будет загружаться только нужная информация.

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

Вернемся в Android Studio, и я хочу напомнить что в пятом фрагменте будет использоваться класс «pyatn», отвечающий за пятничное расписание. Вы спросите, почему в адресе страницы два раза стоит classId?

Читайте также:  Ежедневник для андроида планшета

Потому что адрес страниц в WordPress и поддкатегорий содержит номер класса, меняя этот параметр, мы меняем адрес страницы, в зависимости от нажатой кнопки.

Если не создавать подкаталог для класса, а в sitewordpress.maxfad.ru /raspisanie-urokov/ поместить страницы сразу то запись можно было сократить. Так же в моем случае имя страницы получилось без расширения .html и заканчивается слешем «/». Если вы захотите использовать этот пример под свои нужды, то обратите на это внимание.

Далее происходит очищение titleList и в цикле происходит перебор элементов li, за конкретный день, и все они добавляются в titleList

и через onPostExecute данные попадают в адаптер а затем в ListView во фрагменте.

Тест приложения в эмуляторе

Запустим наше приложение в эмуляторе, и нажав на любую кнопку класса (11-6) будет открыто расписание уроков по дням для данного класса. Нажимая на вкладки и меняя тем самым день недели, информация будет парситься с нашего тестового сайта.

Давайте проведем маленький эксперимент и выберем, например 9-класс, вторник и на сайте отредактируем страницу, что бы увидеть как будут происходить изменения в приложении. Изменим первый урок Математика, сделав два урока 2*Математика. ))) Нажмем на кнопку Обновить и перейдем на страницу сайта, обновив и там.

Выберем другой день недели в приложении и снова вернемся во Вторник(ВТ). Информация, увы не обновилась, или нужно больше времени, хотя если закрыть этот фрагмент и нажать на кнопку 9 класс, то во вторнике данные обновятся. Напишите в комментариях как можно улучшить код, что бы обновление происходило «на лету». Исправим текст как было раньше, Обновимся, в приложении выйдем и зайдем снова в 9 класс и данные опять совпадут с сайтом.

Еще раз покажу как устроены наши странички, делал html код в excel таблице, ссылка на скачивание «генератора расписания уроков» и архива с проектом будет доступна на сайте. Я создавал шесть страниц, на каждой странице по шесть уроков каждый день, с понедельника по пятницу включительно. Для каждого класса и каждого дня уроки отличаются, хотя и кое где повторяются. Но ведь это всего лишь пример!)))

Возможное развитие проекта

Однако, учитель, классный руководитель или директор школы, обладая простейшим навыком работы с компьютером, и умея работать с WordPress, может за 5 минут, с администраторской учеткой, внести необходимые изменения на странице, и в приложении расписание уроков будет централизованно обновлено.

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

А что бы сделать такое приложение, нужно всего лишь зарегистрироваться на сайте Reg.ru, купить домен и хостинг, создать свой сайт, написать приложение в Android Studio. и поделиться этим видео и статьей с друзьями)))

Архив с проектом приложения и Excel генератор кода расписания уроков в HTML можно скачать по этой ссылке.

Благодарю всех за поддержку, пишите в комментариях, что бы на ваш взгляд, можно было добавить или изменить в этом приложении, как еще можно использовать подобный пример, так же подписывайтесь на канал в YouTube, ставьте лайки, классы и до скорых встреч.

В этом видео показано как парсить вебсайт на вордпрессе с помощью Android Studio и Jsoup:

Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в YouTube, там Вы найдете много интересного видео, которое выходит достаточно часто. Приятного просмотра!

Источник

Оцените статью