Как написать парсер на java
Перейти к содержимому

Как написать парсер на java

  • автор:

Создаем парсер на Java

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

Обязательные условия

  • Базовые знания Java ;
  • Основы XPath .

Инструменты

Вам потребуется Java 8 и браузер HtmlUnit

 net.sourceforge.htmlunit htmlunit 2.19 

Если вы используете Eclipse , советую изменить максимальную длину в окне подробностей ( при нажатии на вкладку «Переменные» ), чтобы можно было видеть весь HTML-код веб-страницы.

Парсер на java: пример-получим данные из интернет-магазина

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

Сначала посмотрим, что происходит при поиске товара в магазине. Для этого откройте « Инструменты разработчика » в Chrome и перейдите на вкладку « Network »:

Также можно использовать

Теперь откройте среду разработки. Пришло время писать код. Для выполнения запроса в HtmlUnit нужен WebClient . Сначала нужно отключить JavaScript , так как в нашем примере он не нужен, и без него страница будет загружаться быстрее:

String searchQuery = "Iphone 6s" ; WebClient client = new WebClient(); client.getOptions().setCssEnabled(false); client.getOptions().setJavaScriptEnabled(false); try < String searchUrl https://newyork.craigslist.org/search/sss?sort=rel&query=" rel="nofollow noopener noreferrer" target="_blank">https://newyork.craigslist.org/search/sss?sort=rel&query=" + URLEncoder.encode(searchQuery, "UTF-8"); HtmlPage page = client.getPage(searchUrl); >catch(Exception e) < e.printStackTrace(); >>

В объекте HtmlPage будет HTML-код , доступ к которому можно получить с помощью метода asXml() . Вытянем с сайта названия, изображения и цены. Для этого нужно внимательно просмотреть структуру DOM :

Для парсинга страниц сайта есть несколько способов выбрать тег HTML , используя HtmlUnit :

  • getHtmlElementById(String id) ;
  • getFirstByXPath(String Xpath)-getByXPath(String XPath) , который возвращает список.

Поскольку мы не можем использовать ID , чтобы выбрать теги, нужно составить выражение Xpath .

XPath — это язык запросов для выбора элементов XML ( в нашем случае HTML ).

Сначала нужно выбрать все теги

с классом ` result-info . Затем выполнить итерацию в списке, и для каждого предмета выбрать название, цену и URL , а также вывести на экран.

List items = (List) page.getByXPath("//p[@class='result-info']" ; if(items.isEmpty())< System.out.println("No items found !"); >else < for(HtmlElement item : items)< HtmlAnchor itemAnchor = ((HtmlAnchor) htmlItem.getFirstByXPath(".//a")); String itemName = itemAnchor.asText(); String itemUrl = itemAnchor.getHrefAttribute() ; HtmlElement spanPrice =((HtmlElement) htmlItem.getFirstByXPath(".//span[@class='result-price']")) ; // Возможно, что для товара не установлена цена String itemPrice = spanPrice == null ? "no price" : spanPrice.asText() ; System.out.println( String.format("Name : %s Url : %s Price : %s", itemName, itemPrice, itemUrl)); >>

Затем сохраним данные в формате JSON , используя библиотеку Jackson. Для представления элементов, полученных при парсинге email адресов с сайта , нам понадобится POJO ( объект языка Java ).

public class Item < private String title ; private BigDecimal price ; private String url ; // геттеры и сеттеры >

Затем добавим это в файл pom.xml :

 com.fasterxml.jackson.core jackson-databind 2.7.0 

Теперь нужно создать элемент, задать атрибуты, конвертировать в строку или файл JSON и немного адаптировать предыдущий код парсинга данных с сайта :

for(HtmlElement htmlItem : items)< HtmlAnchor itemAnchor = ((HtmlAnchor) htmlItem.getFirstByXPath(".//span[@class='txt']/span[@class='pl']/a")); HtmlElement spanPrice = ((HtmlElement) htmlItem.getFirstByXPath(".//span[@class='txt']/span[@class='l2']/span[@class='price']")) ; // Возможно, для товара не установлена цена, в этом случае мы обозначаем ее как 0.0 String itemPrice = spanPrice == null ? "0.0" : spanPrice.asText() ; Item item = new Item(); item.setTitle(itemAnchor.asText()); item.setUrl( baseUrl + itemAnchor.getHrefAttribute()); item.setPrice(new BigDecimal(itemPrice.replace("$", ""))); ObjectMapper mapper = new ObjectMapper(); String jsonString = mapper.writeValueAsString(item) ; System.out.println(jsonString); >

Не останавливайтесь

Этот пример парсинга другого сайта не идеален, многое можно улучшить:

  • Поиск по городам;
  • Обработка пагинации;
  • Поиск по нескольким критериям.

Код примера находится здесь.

Пример парсинга сайта с помощью Java

Не так давно работал над одним интересным заказом. Если вкратце, то необходимо было написать mp3 плеер на java, который бы мог не только воспроизводить музыку, писать в плейлисты (что делают обычные плееры), но и сам искать (и качать) песни в интернете. В этой статье мы научимся парсить сайты с помощью Java.

Для начала на потребуется сторонняя библиотека – не будем же мы разбирать страницу с помощью регулярных выражений, верно? Я выбрал jsoup Java HTML Parser Нам нужен jar-ник – на время написания статьи последний был 1.11.3. Подключаем его к нашему проекту, а в основном файле подключаем уже пространства имен:

import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements;

В качестве подопытного кролика выбран сайт mp3party.net – там все просто, поиск идет с помощью get запросов, нет защиты – в общем, идеальный пациент. Создаем кнопку и в обработчик её помещаем следующий код:

Button btnFind = new Button(); btnFind.setText("Найти песню"); btnFind.setOnAction(new EventHandler() < @Override public void handle(ActionEvent event) < //получаем строку запроса String query = textBox.getText(); name = ""; lbFind.setText("Подождите, идет поиск. "); //парсим страницу запроса try < doc = Jsoup.connect("http://mp3party.net/search?q="+query).get(); >catch (IOException ex) < Logger.getLogger(FindListen.class.getName()).log(Level.SEVERE, null, ex); >Elements newsHeadlines = doc.select(".song-item a"); int i = -1; for (Element headline : newsHeadlines) < i++; if (i==0) < sst = headline.absUrl("href"); name = headline.ownText(); >> if (name!="") < lbFind.setText("Найдено: "+name); btnDounload.setVisible(true); muss = "mp3/"+name+".mp3"; >else < lbFind.setText("Ничего не найдено!"); >> >);

Обратите внимание, что помимо кнопки в окне должно быть как минимум два элемента: текстбокс, откуда берется то, что надо искать (название песни) и метка (lbFind), в которую мы выводим полученный результат.

По сути дела здесь мы просто выполняем get-запрос к сайту и в ответе на странице ищем то, что идет после .song-item a. Затем в цикле все перебираем и запоминаем первый результат. В итоге мы получаем два результата: адрес страницы с песней (sst) и её название. Теперь уже можно парсить саму страницу с музыкой и затем её качать. Но это уже в следующей статье.

Если вам что-то непонятно, требуется помощь по Java, то вы можете написать мне на почту up777up@yandex.ru – за разумную плату я вам с удовольствием помогу.

Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

заметки, java, парсинг, примеры кода

Как парсить в java

Парсинг (анализ) данных в Java подразумевает чтение структурированной информации из файлов, строк, потоков или сети и преобразование этой информации в объекты Java . Для парсинга используются различные библиотеки, такие как Jackson , Gson , XMLPullParser , Jsoup и т.д.

Для примера рассмотрим парсинг данных в формате JSON в Java с использованием библиотеки Jackson с помощью Gradle :

  • Добавьте зависимость Jackson в файл build.gradle :
dependencies  implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.5' > 
  • Создайте POJO-класс , который соответствует структуре JSON-файла . Например, если ваш JSON-файл имеет следующую структуру:
 "id": 1, "name": "John Doe", "email": "johndoe@example.com" > 

то класс может выглядеть следующим образом:

public class User  private int id; private String name; private String email; // Геттеры и сеттеры public int getId()  return id; > public void setId(int id)  this.id = id; > public String getName()  return name; > public void setName(String name)  this.name = name; > public String getEmail()  return email; > public void setEmail(String email)  this.email = email; > > 
  • Создайте объект ObjectMapper , который является основным классом для обработки JSON-данных в Jackson :
ObjectMapper objectMapper = new ObjectMapper(); 
  • Используйте метод readValue() для чтения JSON-файла и преобразования его в объект Java :
File file = new File("user.json"); User user = objectMapper.readValue(file, User.class); 

Метод readValue() принимает два параметра: File и класс, в который должны быть преобразованы данные из JSON-файла

Теперь вы можете использовать объект user , чтобы получить доступ к данным из JSON-файла

Как написать парсер на java

Для написания парсера на Java можно использовать различные инструменты и библиотеки, в зависимости от типа данных, которые нужно распарсить.

Вот некоторые шаги и подходы, которые могут помочь в написании парсера на Java :

  • Определить формат данных, которые нужно распарсить. Например, это может быть формат JSON , XML , CSV или другой формат.
  • Использовать соответствующие библиотеки для парсинга данных. Например, для парсинга JSON-данных можно использовать библиотеку Jackson или Gson , для парсинга XML-данных можно использовать библиотеку JAXB или DOM , для парсинга CSV-данных можно использовать библиотеку OpenCSV и т.д.
  • Определить структуру данных, в которую будут сохраняться распарсенные данные. Например, для JSON-данных это может быть объект класса, для XML-данных это может быть DOM-дерево или объекты, сгенерированные из схемы XML , для CSV-данных это может быть список объектов.
  • Написать код, который будет использовать выбранную библиотеку для чтения данных из файла или другого источника, и сохранять их в соответствующую структуру данных.

Например, вот пример кода для чтения и распарсивания JSON-данных с помощью библиотеки Jackson :

ObjectMapper objectMapper = new ObjectMapper(); File file = new File("data.json"); MyDataObject myDataObject = objectMapper.readValue(file, MyDataObject.class); 

Здесь MyDataObject — это класс, который соответствует структуре JSON-данных . Метод readValue() преобразует данные из файла в объект класса MyDataObject

Вот еще пример кода для чтения и распарсивания XML-данных с помощью библиотеки JAXB :

JAXBContext jaxbContext = JAXBContext.newInstance(MyDataObject.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); File file = new File("data.xml"); MyDataObject myDataObject = (MyDataObject) unmarshaller.unmarshal(file); 

Здесь MyDataObject — это класс, который соответствует структуре XML-данных . Метод unmarshal() преобразует данные из файла в объект класса MyDataObject

Надеюсь, эти примеры помогут вам начать работу с написанием парсера на Java !

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *