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

Вот где в игру вступает искусство парсинга веб-страниц. Вот о чем эта статья…

Извлечь 10 лучших результатов поиска Google

Мы собираемся создать простой веб-скребок, который сможет извлекать заголовок и URL-адрес из 10 лучших результатов поиска Google для любого заданного термина.

Давайте испачкаем руки

Для сборки нашего парсера мы используем Java и библиотеку Jsoup.

Jsoup — это библиотека Java для работы с реальным HTML. Он предоставляет очень удобный API для извлечения данных и управления ими с использованием лучших методов DOM, CSS и jquery.

— С веб-сайта Jsoup

Почему Ява?

Мы используем Java в этом примере, чтобы показать, что на этом языке очень просто написать парсер. Большинство людей думают о Java с большим количеством конфигураций и сложностей по сравнению с чем-то вроде NodeJ.

Получить селектор CSS для извлечения данных

Мы хотим извлечь заголовок и URL-адрес со страницы результатов поиска. Итак, запустите инструменты разработчика вашего браузера и получите нужный нам CSS-селектор…

Приходится наводить курсор на интересующие нас элементы и анализировать структуру html. На скриншоте мы видим внешний контейнер div#res, содержащий все результаты.

Каждый результат поиска заключен в div.g, а HTML-код выглядит так:

<div class="g">  
   <div class="rc" data-hveid="27">
      <h3 class="r">
        <a href="http://www.speedtest.net/">
          Speedtest.net by Ookla - The Global Broadband Speed Test
        </a>
      </h3>
      <div class="s">
         ...
      </div>
   </div>
</div>

Таким образом, значение, которое мы хотим получить, находится в теге a внутри файла h3.

После некоторых экспериментов мы используем минимальный конечный селектор: h3.r a

Напишите актуальный код

Код состоит всего из нескольких строк, и они хорошо прокомментированы, поэтому я просто публикую их здесь…

package de.mphweb;
import org.jsoup.Jsoup;  
import org.jsoup.nodes.Document;  
import org.jsoup.nodes.Element;
public class App {
    //We need a real browser user agent or Google will block our request with a 403 - Forbidden
    public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36";
    public static void main(String[] args) throws Exception {
        //Fetch the page
        final Document doc = Jsoup.connect("https://google.com/search?q=test").userAgent(USER_AGENT).get();
        //Traverse the results
        for (Element result : doc.select("h3.r a")){
            final String title = result.text();
            final String url = result.attr("href");
            //Now do something with the results (maybe something more useful than just printing to console)
            System.out.println(title + " -> " + url);
        }
    }
}

Скачать код

Как обычно, вы можете найти работающий проект Maven на Github.

Хотите узнать больше?
Я только что создал новый онлайн-видеокурс на Udemy и предлагаю скидку постоянным читателям моего…

Java In-Depth: станьте полноценным Java-инженером!

Java Maven: 101 Хватит создавать Java-программы с трудом!

Основы Hibernate и Java Persistence API (JPA)