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

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

В этой статье мы расскажем вам о процессе создания веб-сканера с использованием Java и Crawlbase.

Что вам понадобится

Обычно сканирование веб-данных включает создание скрипта, который отправляет запрос на целевую веб-страницу, обращается к ее базовому HTML-коду и извлекает необходимую информацию.

Для достижения этой цели вам понадобится следующее:

  • Среда разработки Java 11
  • Crawlbase

Прежде чем разрабатывать логику сканирования, давайте проясним, почему использование Crawlbase важен для веб-сканирования.

Зачем использовать Crawlbase для ползания

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

Вот несколько причин, по которым вам следует использовать его для сканирования онлайн-данных:

  • Простота Он поставляется с простым API, который вы можете быстро настроить без каких-либо препятствий в программировании. Всего с несколькими строками кода вы можете начать использовать API для сканирования веб-сайтов и извлечения их контента.

  • Поддерживает расширенное сканирование Crawlbase позволяет вам выполнять расширенное веб-сканирование и извлекать данные из сложных веб-сайтов. Поскольку он поддерживает рендеринг JavaScript, Crawlbase позволяет извлекать данные из динамических веб-сайтов. Он предлагает headless-браузер, который позволяет извлекать то, что реальные пользователи видят в своих веб-браузерах, даже если сайт создан с использованием современных фреймворков, таких как Angular или React.js.

  • Обход препятствий при ползании Crawlbase Может справиться со всеми ограничениями, часто связанными со сканированием онлайн-данных. Сервис располагает обширной сетью прокси-серверов и более чем 17 центрами обработки данных по всему миру. С его помощью можно обходить ограничения доступа, обходить CAPTCHA и другие меры защиты от парсинга, применяемые веб-приложениями. Более того, вы можете сканировать веб-сайты, сохраняя анонимность; вам не нужно беспокоиться о раскрытии вашей личности.

  • Бесплатная пробная учетная запись Вы можете проверить, как Crawlbase работает без предоставления платежных данных. Бесплатная учетная запись включает 1,000 кредитов для тестирования возможностей инструмента.

Как Crawlbase Работы

Crawlbase обеспечивает Crawling API для сканирования и извлечения данных с веб-сайтов. Вы можете легко интегрировать API в свой Java-разработка легко проецировать и извлекать информацию с веб-страниц.

Каждый запрос, сделанный в Crawling API начинается со следующей базовой части:

1
https://api.crawlbase.com

Также вам необходимо добавить в API следующие обязательные параметры:

  • Токен аутентификации
  • URL

Токен аутентификации — это уникальный токен, который разрешает вам использовать Crawling API. После того, как вы зарегистрируете учетную запись, Crawlbase выдаст вам два типа токенов:

  • Обычный токен Это необходимо для выполнения общих запросов на сканирование.
  • JavaScript-токен Это для сканирования динамических веб-сайтов. Он предоставляет вам возможности headless-браузера для сканирования веб-страниц, отрисованных с помощью JavaScript. Как указывалось ранее, это полезный способ сканирования сложных веб-сайтов.

Вот как добавить токен аутентификации в ваш запрос API:

1
https://api.crawlbase.com/?token=INSERT_TOKEN

Вторым обязательным параметром является URL для сканирования. Он должен начинаться с HTTP или HTTPS и быть полностью закодированным. Кодирование преобразует строку URL в формат, который может быть передан через Интернет корректно и легко.

Вот как вставить URL в ваш запрос API:

1
https://api.crawlbase.com/?token=INSERT_TOKEN&url=INSERT_URL

Если вы запустите указанную выше строку, например, на своем терминале с помощью cURL или вставите ее в адресную строку браузера, она выполнит запрос API и вернет весь исходный HTML-код целевой веб-страницы.

Это так легко и просто!

Если вы хотите выполнить расширенное сканирование, вы можете добавить другие параметры к API-запросу. Например, при использовании токена JavaScript можно добавить страница_ожидание параметр, указывающий браузеру ждать указанное количество миллисекунд перед захватом результирующего HTML-кода.

Вот пример:

1
https://api.crawlbase.com/?token=INSERT_TOKEN&page_wait=1000&url=INSERT_URL

Создание сети Crawler на Яве и Crawlbase

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

API HTTP-клиента

API HttpClient поддерживает как HTTP/1.1, так и HTTP/2. По умолчанию он использует протокол HTTP/2 для отправки запросов. Если запрос отправляется на сервер, который еще не поддерживает HTTP/2, он будет автоматически понижен до HTTP/1.

Более того, его запросы могут быть отправлены асинхронно или синхронно, он обрабатывает запросы и тела ответов как реактивные-потокии использует шаблон общего конструктора.

API состоит из трех основных классов:

  • HttpRequest
  • HttpClient
  • HttpResponse

Поговорим о каждом из них более подробно.

1. HttpRequest

HttpRequest, как следует из названия, является объектом, инкапсулирующим HTTP-запрос, который должен быть отправлен. Чтобы создать новые экземпляры HttpRequest, вызовите HttpRequest.newBuilder(). После создания запрос становится неизменным и может быть отправлен несколько раз.

Команда строитель класс поставляется с различными методами для настройки запроса.

Вот наиболее распространённые методы:

  • Метод URI
  • Метод запроса
  • Метод версии протокола
  • Метод тайм-аута

Поговорим о каждом из них более подробно.

а) Метод URI

Первое, что нужно сделать при настройке запроса, это задать URL для сканирования. Мы можем сделать это, вызвав uri() метод на строитель пример. Мы также будем использовать URI.создать() метод создания URI путем анализа строки URL, которую мы собираемся сканировать.

Вот код:

1
2
3
4
5
6
7
строка URL =
URLEncoder.кодировать("https://www.forextradingbig.com/7-reasons-why-you-should
-бросить-торговлю-на-форексе/", StandardCharsets.UTF_8.name());

HttpRequest запросить = HttpRequest.newBuilder()
.uri(URI.создать("https://api.crawlbase.com/?token=INSERT_TOKEN&url="
+ ссылка))

Обратите внимание, что мы предоставили строку URL с помощью Crawlbaseнастройки. Это веб-страницу, содержимое которой мы намерены извлечь.

Мы также закодировали URL с помощью Класс Java URLEncoder. Как уже упоминалось ранее, Crawlbase требует кодирования URL-адресов.

б) Метод запроса

Следующее, что нужно сделать, это указать HTTP-метод, который будет использоваться для выполнения запроса. Мы можем вызвать любой из следующих методов из строитель:

  • ПОЛУЧАТЬ()
  • ПОЧТА()
  • ПОМЕЩАТЬ()
  • УДАЛИТЬ()

В этом случае, поскольку мы хотим запросить данные с целевой веб-страницы, мы будем использовать ПОЛУЧАТЬ() метод.

Вот код:

1
2
HttpRequest запросить = HttpRequest.newBuilder()
.ПОЛУЧАТЬ()

Пока что HttpRequest имеет все параметры, которые должны быть переданы HttpClient. Однако вам может потребоваться включить другие параметры, такие как версия протокола HTTP и тайм-аут.

Давайте посмотрим, как можно добавить дополнительные параметры.

в) Метод версии протокола

Как упоминалось ранее, API HttpClient по умолчанию использует протокол HTTP/2. Тем не менее, вы можете указать версию протокола HTTP, которую хотите использовать.

Вот код:

1
2
HttpRequest запросить = HttpRequest.newBuilder()
.version(HttpClient.Version.HTTP_2)

г) Метод тайм-аута

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

Вы можете определить таймаут, вызвав метод timeout() на экземпляре строителя. Вам также нужно будет передать Длительность объект для указания времени ожидания.

Вот код:

1
2
HttpRequest запросить = HttpRequest.newBuilder()
.timeout(Длительность.секунд(20))

2. HttpКлиент

Класс HttpClient является основной точкой входа API — он действует как контейнер для деталей конфигурации, общих для нескольких запросов. Это HTTP-клиент, используемый для отправки запросов и получения ответов.

Вы можете позвонить либо HttpClient.newBuilder() или HttpClient.newHttpClient() метод для его создания. После создания экземпляра HttpClient он становится неизменяемым.

Класс HttpClient предлагает несколько полезных и самоописываемых методов, которые можно использовать при работе с запросами и ответами.

Вот некоторые вещи, которые вы можете сделать:

  • Установить версию протокола
  • Установить политику перенаправления
  • Отправлять синхронные и асинхронные запросы

Поговорим о каждом из них более подробно.

а) Установить версию протокола

Как упоминалось ранее, класс HttpClient по умолчанию использует протокол HTTP/2. Однако вы можете установить предпочтительную версию протокола: HTTP/1.1 или HTTP/2.

Вот пример:

1
2
HttpClient клиент = HttpClient.newBuilder()
.version(Версия.HTTP_1_1)

б) Установить политику перенаправления

Если целевая веб-страница переместилась на другой адрес, вы получите код статуса HTTP 3xx. Поскольку адрес нового URI обычно предоставляется с информацией о коде статуса, настройка правильной политики перенаправления может заставить HttpClient автоматически пересылать запрос на новое место.

Вы можете установить его с помощью followRedirects() метод на строитель пример.

Вот пример:

1
2
HttpClient клиент = HttpClient.newBuilder()
.followRedirects(Перенаправление.НОРМАЛЬНОЕ)

в) Отправлять синхронные и асинхронные запросы

HttpClient поддерживает два способа отправки запросов:

  • Синхронно с помощью Отправить() Метод. Это блокирует клиента до тех пор, пока не будет получен ответ, прежде чем продолжить выполнение оставшейся части.

Вот пример:

1
2
HttpОтвет ответ = клиент.отправить(запрос,
BodyHandlers.ofString());

Обратите внимание, что мы использовали BodyHandlers и позвонил ofString() метод для возврата HTML-ответа в виде строки.

  • Асинхронно с помощью sendAsync() Метод. Он не ждет получения ответа; он неблокируемый. После того, как sendAsync() вызывается метод, он мгновенно возвращается с CompletableFuture< HttpResponse >, который завершается после получения ответа. Возвращенный CompletableБудущее могут быть объединены с использованием различных методов для определения зависимостей между различными асинхронными задачами.

Вот пример:

1
2
CompletableБудущее  > ответ = HttpClient.newBuilder()
.sendAsync(запрос, HttpResponse.BodyHandler.ofString());

3. HTTP-ответ

HttpResponse, как следует из названия, представляет собой ответ, полученный после отправки HttpRequest. HttpResponse предлагает различные полезные методы для обработки полученного ответа.

Вот наиболее важные методы:

  • statusCode() Этот метод возвращает код статуса ответа. Он имеет Int напишите
  • Тело() Этот метод возвращает тело ответа. Тип возвращаемого значения зависит от типа ответа. BodyHandler параметр, который передается в Отправить() метод.

Вот пример:

1
2
3
4
5
6
7
8
9
// Обработка тела ответа как строки
HttpОтвет ответ = клиент
.отправить(запрос, BodyHandlers.ofString());

// Печать тела ответа
System.out.println(response.body());

// Печать кода статуса
System.out.println(response.statusCode());
1
2
3
// Обработка тела ответа как файла
HttpОтвет ответ = клиент
.отправить(запрос, BodyHandlers.ofFile(Paths.получить("мойпример.html")));

Синхронный пример

Вот пример, который использует синхронный метод HttpClient для сканирования веб-страницы и вывода ее содержимого:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
пакет javaHttpClient;

Импортировать java.io.IOException;
Импортировать java.net.URI;
Импортировать java.net.URLEncoder;
Импортировать java.net.http.HttpClient;
Импортировать java.net.http.HttpRequest;
Импортировать java.net.http.HttpResponse;
Импортировать java.net.http.HttpResponse.BodyHandlers;
Импортировать java.nio.charset.StandardCharsets;

что такое варган? класс СинхронизацияПример {

что такое варган? статический аннулировать main(Строка[] аргументы) бросает IOException, InterruptedException {

// Кодирование URL
строка URL = URLEncoder.кодировать("https://www.forextradingbig.com/7-причин-почему-вам-следует-бросить-forex-торговлю/", StandardCharsets.UTF_8.name());

// Создание экземпляра HttpClient
HttpClient клиент = HttpClient.newHttpClient();

// Настройка HttpRequest
HttpRequest запросить = HttpRequest.newBuilder()
.ПОЛУЧАТЬ()
.uri(URI.создать("https://api.crawlbase.com/?token=INSERT_TOKEN&url=" + ссылка))
.строить();

// Обработка ответа
HttpОтвет ответ = клиент.отправить(запрос, BodyHandlers.ofString());
System.out.println(response.body());
}

}

Вот вывод (для краткости он усечен):

Вывод кода

Асинхронный пример

При использовании асинхронного метода HttpClient для сканирования веб-страницы sendAsync() метод вызывается вместо отправлять().

Вот пример:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
пакет javaHttpClient;

Импортировать java.io.IOException;
Импортировать java.net.URI;
Импортировать java.net.URLEncoder;
Импортировать java.net.http.HttpClient;
Импортировать java.net.http.HttpRequest;
Импортировать java.net.http.HttpResponse;
Импортировать java.nio.charset.StandardCharsets;
Импортировать java.util.concurrent.CompletableFuture;
Импортировать java.util.concurrent.ExecutionException;
Импортировать java.util.concurrent.TimeUnit;
Импортировать java.util.concurrent.TimeoutException;

что такое варган? класс AsyncExample {


что такое варган? статический аннулировать main(Строка[] аргументы) бросает IOException, InterruptedException, ExecutionException, TimeoutException {

// Кодирование URL
строка URL = URLEncoder.кодировать("https://www.forextradingbig.com/7-причин-почему-вам-следует-бросить-forex-торговлю/", StandardCharsets.UTF_8.name());

// Создание экземпляра HttpClient
HttpClient клиент = HttpClient.newHttpClient();

// Настройка HttpRequest
HttpRequest запросить = HttpRequest.newBuilder()
.ПОЛУЧАТЬ()
.version(HttpClient.Version.HTTP_2)
.uri(URI.создать("https://api.crawlbase.com/?token=INSERT_TOKEN&url=" + ссылка))
.строить();

// Обработка ответа
CompletableБудущее > ответ =
клиент.sendAsync(запрос, HttpResponse.BodyHandlers.ofString());

строка результат = response.thenApply(HttpResponse::body).get(5, Единица Времени.СЕКУНДЫ);

System.out.println(результат);

}

}

Заключение

Вот как создать веб-сканер на Java. API HttpClient, представленный в Java 11, упрощает отправку и обработку ответов с сервера.

А если API объединить с таким универсальным инструментом, как Crawlbase, он может сделать задачи веб-сканирования простыми и полезными.

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

Это инструмент, который вам нужен, чтобы вывести свои усилия по сканированию на новый уровень.

Нажмите здесь, чтобы создать бесплатно Crawlbase счет.

Удачного соскабливания!