В этом руководстве по веб-скрапингу Java мы рассмотрим глубокий краул: продвинутую форму веб-скрапинга. Это всеобъемлющее руководство по веб-скрапингу в Java будет использовать глубокий краулинг с Java Spring Boot для скрапинга веба.

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

Что еще более примечательно, мы не просто говорим о теории — мы покажем вам, как это сделать. Java-спринг-бут и Crawlbase Библиотека Java, мы научим вас, как сделать глубокий просмотр реальностью. Мы поможем вам настроить инструменты, объясним разницу между поверхностным и глубоким просмотром (это не так сложно, как кажется!), и покажем, как извлекать информацию с разных страниц веб-сайта и хранить ее на своей стороне.

Чтобы понять часть кодирования веб-скрапинга Java, вы должны иметь базовые знания Java Spring Boot и базы данных MySQL. Давайте начнем с того, как создать веб-скрапер на Java.

Содержание:

  1. Понимание глубокого сканирования: шлюз к веб-данным
  2. Зачем вам нужно создать Java Web Scraper
  3. Как выполнить веб-скрапинг в Java
  4. Подготовка сцены: подготовка вашей среды
  5. Упростите настройку проекта Spring Boot с помощью Spring Initializr
  6. Импорт стартового проекта в Spring Tool Suite
  7. Понимание плана вашего проекта: взгляд на структуру проекта
  8. Начало пути кодирования
  9. Запуск проекта и начало глубокого сканирования
  10. Анализ вывода в базе данных
  11. Заключение
  12. FAQ

Deep Crawling на Яве.

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

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

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

Различие между поверхностным и глубоким ползанием

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

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

Мелкий и глубокий кроль

Изучение масштаба и значения глубокого ползания

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

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

В этом уроке мы подробно рассмотрим веб-скрапинг на Java.

Зачем вам нужно создать Java Web Scraper

Вам нужен Java-скрепер для сбора и использования информации с веб-сайта. Один из таких скреперов — Crawlbase Crawler, но что именно Crawlbase Crawler, и как он творит свое волшебство?

Что Crawlbase Crawler?

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

Рабочий процесс: как Crawlbase Crawler Функционирует

Crawlbase Crawler работает на основе бесперебойного и эффективного рабочего процесса, который можно обобщить в несколько ключевых этапов:

  1. Отправка URL-адресов: Как пользователь, вы инициируете процесс, отправляя URL-адреса в Crawlbase Crawler используя Crawling API.
  2. Обработка запроса: The Crawler получает эти запросы и обрабатывает их асинхронно. Это означает, что он может обрабатывать несколько запросов одновременно без какого-либо ручного вмешательства.
  3. Извлечение данных: The Crawler посещает указанные URL-адреса, извлекает запрошенные данные и упаковывает их для доставки.
  4. Интеграция вебхука: Crawlbase Crawler интегрируется с webhook вместо необходимости ручного опроса. Этот webhook служит в качестве мессенджера, который доставляет извлеченные данные непосредственно на конечную точку вашего сервера в режиме реального времени.
  5. Доставка в реальном времени: Извлеченные данные доставляются на конечную точку веб-перехватчика вашего сервера сразу же после их появления, что обеспечивает немедленный доступ без задержек.
  6. Свежая информация: Получая данные в режиме реального времени, вы получаете конкурентное преимущество, принимая обоснованные решения на основе новейшего веб-контента.

Преимущества: почему стоит выбрать Crawlbase Crawler

Хотя сканер позволяет мгновенно выполнять веб-скрапинг с помощью Java, у него есть и другие преимущества:

  1. Эффективность: Асинхронная обработка устраняет необходимость в постоянном мониторинге, освобождая ресурсы для других задач.
  2. Информация в реальном времени: Получайте данные сразу же по мере их поступления, что позволит вам оставаться в курсе тенденций и изменений.
  3. Оптимизированный рабочий процесс: Интеграция Webhook заменяет ручной опрос, упрощая процесс доставки данных.
  4. Своевременное принятие решений: Мгновенный доступ к свежеизвлеченным данным позволяет принимать своевременные и обоснованные решения.

Для доступа Java-веб-сканер, вы должны создать его в пределах вашего Crawlbase панель управления аккаунтом. Вы можете выбрать TCP или JavaScript. Crawler на основе ваших конкретных потребностей. TCP Crawler идеально подходит для статических страниц, в то время как JavaScript Crawler подходит для контента, созданного с помощью JavaScript, как на страницах, созданных с помощью JavaScript, или динамически отображаемого контента браузера. Читайте здесь, чтобы узнать больше о Crawlbase Crawler.

Во время создания он попросит вас указать адрес вашего вебхука. Поэтому мы создадим его после того, как успешно создадим вебхук в нашем проекте Spring Boot. В следующем разделе мы углубимся в кодирование и разработаем необходимый компонент для завершения нашего проекта.

Как выполнить веб-скрапинг в Java

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

Подготовка сцены: подготовка вашей среды

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

Установка Java на Ubuntu и Windows

Java — это основа нашего процесса разработки, и мы должны убедиться, что она доступна в нашей системе. Если в вашей системе не установлена ​​Java, вы можете выполнить следующие шаги в соответствии с вашей операционной системой.

Установка Java в Ubuntu:

  1. Откройте Терминал, нажав Ctrl + Alt + T.
  2. Выполните следующую команду, чтобы обновить список пакетов:
1
Sudo склонное обновление
  1. Установите Java Development Kit (JDK), выполнив:
1
Sudo apt install default-jdk
  1. Проверьте установку JDK, введя:
1
java -version

Установка Java на Windows:

  1. Посетите официального Oracle веб-сайт и загрузите последнюю версию Java Development Kit (JDK).
  2. Следуйте указаниям мастера установки для завершения установки. После установки вы можете проверить ее, открыв командную строку и введя:
1
java -version

Установка Spring Tool Suite (STS) на Ubuntu и Windows:

Spring Tool Suite (STS) — это интегрированная среда разработки (IDE), специально разработанная для разработки приложений с использованием Spring Framework, популярного фреймворка Java для создания приложений корпоративного уровня. STS предоставляет инструменты, функции и плагины, которые улучшают процесс разработки при работе с проектами на основе Spring; для их установки выполните следующие действия.

  1. Посетите официальный сайт Spring Tool Suite по адресу spring.io/инструменты.
  2. Загрузите соответствующую версию Spring Tool Suite для вашей операционной системы (Ubuntu или Windows).

В Ubuntu:

  1. После загрузки перейдите в Терминале в каталог, где находится загруженный файл.
  2. Извлечь загруженный архив:
1
2
# Заменять и согласно названию архива
tar -xvf spring-tool-suite- - .tar.gz
  1. Переместите извлеченный каталог в любое место по вашему выбору:
1
2
# Заменять в соответствии с извлеченным именем папки
mv sts- /путь_вашего_желания/

В Windows:

  1. Запустите загруженный установщик и следуйте инструкциям на экране для завершения установки.

Установка MySQL на Ubuntu и Windows

Настройка надежной системы управления базами данных имеет первостепенное значение для начала вашего пути к глубокому краулингу и извлечению веб-данных. MySQL, популярная реляционная база данных с открытым исходным кодом, обеспечивает основу для безопасного хранения и управления данными, которые вы соберете в ходе своих усилий по краулингу. Вот пошаговое руководство по установке MySQL на платформах Ubuntu и Windows:

Установка MySQL на Ubuntu:

  1. Откройте терминал и выполните следующие команды, чтобы убедиться, что ваша система обновлена:
1
2
Sudo склонное обновление
Sudo модернизация
  1. Выполните следующую команду для установки пакета сервера MySQL:
1
Sudo установить MySQL-сервер
  1. После установки запустите службу MySQL:
1
Sudo systemctl запустить mysql.service
  1. Проверьте, запущен ли MySQL, с помощью команды:
1
Sudo Статус systemctl mysql

Установка MySQL в Windows:

  1. Посетите официального Сайт MySQL и загрузите установщик MySQL для Windows.
  2. Запустите загруженный установщик и выберите тип установки «Developer Default». Это установит MySQL Server и другие сопутствующие инструменты.
  3. Во время установки вам будет предложено настроить MySQL Server. Установите надежный пароль root и запомните его.
  4. Для завершения установки следуйте инструкциям установщика.
  5. После установки MySQL должен запуститься автоматически. Вы также можете запустить его вручную из приложения «Службы» Windows.

Проверка установки MySQL:

Независимо от вашей платформы, вы можете проверить установку MySQL, открыв терминал или командную строку и введя следующую команду:

1
mysql -u root -p

Вам будет предложено ввести пароль root MySQL, который вы установили во время установки. Если подключение прошло успешно, вас встретит интерфейс командной строки MySQL.

Теперь, когда у вас есть Java и STS, вы полностью готовы к следующему этапу вашего приключения в глубоком ползании. На следующем этапе мы проведем вас через создание стартового проекта Spring Boot, подготовив почву для ваших начинаний в глубоком ползании. Давайте погрузимся в этот захватывающий этап путешествия!

Упростите настройку проекта Spring Boot с помощью Spring Initializr

Представьте себе, что настройка проекта Spring Boot похожа на навигацию по сложному лабиринту настроек. Но не волнуйтесь, Весенний инициализр здесь, чтобы помочь! Это как иметь умного помощника онлайн, который делает процесс намного проще. Вы можете сделать это вручную, но это как головоломка, которая занимает много времени. Spring Initializr приходит на помощь, делая все более плавным с самого начала. Выполните следующие шаги, чтобы создать проект Spring Boot с помощью Spring Initializr.

  1. Перейти на сайт Spring Initializr

Откройте веб-браузер и перейдите на сайт Spring Initializr. Вы можете найти его по адресу старт.весна.io.

  1. Выберите детали вашего проекта

Здесь вы делаете важные выборы для своего проекта. Вам нужно выбрать тип проекта и язык, который вы собираетесь использовать. Нам нужно выбрать Специалист как тип проекта и JAVA в качестве языка. Для версии Spring Boot выберите стабильную (например, 3.1.2). Затем добавьте сведения о вашем проекте, например, его название и о чем он. Это просто — просто следуйте примеру на картинке.

  1. Добавьте что-нибудь интересное

Время добавить специальные функции в ваш проект! Это как дать ему суперспособности. Включите Spring Web (это важно для проектов Spring Boot), Spring Data JPA и MySQL Driver, если вы собираетесь использовать базу данных. Не забудьте Lombok — это как волшебный инструмент, который экономит время. Мы поговорим об этом подробнее в следующих частях блога.

  1. Получите свой проект

После выбора всего хорошего нажмите «СГЕНЕРИРОВАТЬ». Ваш стартовый проект будет загружен в виде zip-файла. После того, как все будет готово, откройте zip-файл, чтобы увидеть начало вашего проекта.

Настройки Spring Initializr

Выполняя эти шаги, вы гарантируете, что ваше приключение глубокого ползания начнется гладко. Spring Initializr — это как надежный гид, который поможет вам настроиться. В следующем разделе мы проведем вас через импорт вашего проекта в установленный вами Spring Tool Suite. Приготовьтесь начать эту захватывающую фазу вашего путешествия глубокого ползания!

Импорт стартового проекта в Spring Tool Suite

Хорошо, теперь, когда ваш стартовый проект Spring Boot полностью настроен и готов к запуску, следующим шагом будет импорт его в Spring Tool Suite (STS). Это как пригласить ваш проект в уютное рабочее пространство, где вы можете творить магию. Вот как это сделать:

  1. Открытый набор инструментов Spring (STS)

Первым делом запустите Spring Tool Suite. Это ваш творческий центр, где будет происходить все кодирование и создание.

  1. Импортировать проект

Перейдите в меню «Файл» и выберите «Импорт». Появится окно с различными вариантами — выберите «Существующие проекты Maven» и нажмите «Далее».

  1. Выберите каталог проекта

Нажмите кнопку «Обзор» и найдите каталог, в который вы распаковали свой проект Starter. Выберите корневой каталог проекта и нажмите «Готово».

  1. Наблюдайте за магией

Spring Tool Suite совершит свое волшебство и импортирует ваш проект. Он появится в «Project Explorer» в левой части вашего рабочего пространства.

  1. Готов к ролику

Вот и все! Ваш проект Starter теперь удобно размещен в Spring Tool Suite. Все готово для начала сборки, кодирования и исследования.

Импорт в STS

Перенос вашего проекта в Spring Tool Suite — это как открытие двери к бесконечным возможностям. Теперь у вас есть инструменты и пространство, чтобы сделать ваш проект потрясающим. В следующем разделе мы углубимся в структуру проекта, сняв слои, чтобы раскрыть его компоненты и внутреннюю работу. Приготовьтесь отправиться в путешествие открытий, пока мы распутываем то, что находится внутри!

Понимание плана вашего проекта: взгляд на структуру проекта

Теперь, когда ваш стартовый проект Spring Boot удобно разместился в Spring Tool Suite (STS), давайте пройдемся по его внутренним механизмам. Это как изучить планировку вашего нового дома, прежде чем начать его украшать.

Maven и pom.xml

В основе вашего проекта лежит мощный инструмент под названием Maven. Думайте о Maven как о организаторе вашего проекта — он управляет библиотеками, зависимостями и сборками. Файл с именем pom.xml — это то место, где происходит вся магия, связанная с проектом. Это как план, который сообщает Maven, что делать и что нужно вашему проекту. Как и в нашем случае, в настоящее время, у нас это будет в проекте pom.xml.

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?xml версия="1.0" кодирующих ="UTF-8"?>
<Проект XMLNS="http://maven.apache.org/POM/4.0.0" xmlns: xsi="http://www.w3.org/2001/XMLSchema-экземпляр"
xsi: schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<модельВерсия>4.0.0</модельВерсия>
<родителя>
<идентификатор_группы>org.springframework.boot</идентификатор_группы>
<артефакта>весна-загрузка-стартер-родитель</артефакта>
<версия>3.1.2</версия>
<относительныйпуть/>
</родителя>
<идентификатор_группы>com.пример</идентификатор_группы>
<артефакта>база сканирования</артефакта>
<версия>0.0.1-СНАПШОТ</версия>
<имя>Crawlbase Crawler С пружинным ботинком</имя>
<описание>Демонстрация использования Crawlbase Crawler с Spring Boot и как выполнять Deep Crawling</описание>
<свойствами>
<java.версия>17</java.версия>
</свойствами>
<Зависимости>
<зависимость>
<идентификатор_группы>org.springframework.boot</идентификатор_группы>
<артефакта>spring-boot-starter-data-jpa</артефакта>
</зависимость>
<зависимость>
<идентификатор_группы>org.springframework.boot</идентификатор_группы>
<артефакта>Spring-Boot-Starter-Web</артефакта>
</зависимость>
<зависимость>
<идентификатор_группы>com.mysql</идентификатор_группы>
<артефакта>mysql-коннектор-j</артефакта>
<сфера>время выполнения</сфера>
</зависимость>
<зависимость>
<идентификатор_группы>org.projectlombok</идентификатор_группы>
<артефакта>Ломбок</артефакта>
<необязательный>правда</необязательный>
</зависимость>
<зависимость>
<идентификатор_группы>org.springframework.boot</идентификатор_группы>
<артефакта>весенний пусковой тест</артефакта>
<сфера>тест</сфера>
</зависимость>
</Зависимости>

<строить>
<плагины>
<плагин>
<идентификатор_группы>org.springframework.boot</идентификатор_группы>
<артефакта>Spring-boot-maven-плагин</артефакта>
<конфигурация>
<исключает>
<исключать>
<идентификатор_группы>org.projectlombok</идентификатор_группы>
<артефакта>Ломбок</артефакта>
</исключать>
</исключает>
</конфигурация>
</плагин>
</плагины>
</строить>
</Проект>

Библиотеки Java

Помните те специальные функции, которые вы добавили при создании проекта? Они называются зависимостями, как магические инструменты, которые делают ваш проект более мощным. На самом деле вы добавляли эти библиотеки, когда включали Spring Web, Spring Data JPA, MySQL Driver и Lombok из Spring Initializr. Вы можете увидеть их в pom.xml выше. Они добавляют готовые функции в ваш проект, экономя ваше время и усилия.

  • Весенняя паутина: Эта библиотека — ваш билет в создание веб-приложений Spring Boot. Она помогает в таких вещах, как обработка запросов и создание веб-контроллеров.
  • Spring Data JPA: Эта библиотека — ваш союзник, если вы имеете дело с базами данных. Она упрощает взаимодействие и управление базами данных, позволяя вам сосредоточиться на логике вашего проекта.
  • Драйвер MySQL: Если вы используете MySQL в качестве базы данных, этот драйвер помогает вашему проекту эффективно взаимодействовать с базой данных.
  • Ломбок: Попрощайтесь с повторяющимся кодом! Lombok сокращает шаблонный код, который вам обычно приходится писать, делая ваш проект более чистым и лаконичным.

Понять структуру проекта

Когда вы исследуете папки вашего проекта, вы заметите, как все аккуратно организовано. Ваш код Java помещается в каталог src/main/java, а ресурсы, такие как файлы конфигурации и статические ресурсы, находятся в каталоге src/main/resources. Здесь вы также найдете файл application.properties — это своего рода центр управления вашим проектом, где вы можете настраивать параметры.

Структура проекта

В src/main/java каталоге мы найдем пакет, содержащий Java Class с функцией main. Этот файл выступает в качестве отправной точки при выполнении Spring Boot Project. В нашем случае мы будем иметь CrawlbaseApplication.java файл со следующим кодом.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
пакет com.example.crawlbase;

Импортировать org.springframework.boot.SpringApplication;
Импортировать org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
// Добавьте это, чтобы включить асинхронность в проекте
@ВключитьАсинхронность
что такое варган? класс CrawlbaseЗаполнитель {

что такое варган? статический аннулировать main(Строка[] аргументы) {
SpringApplication.запустить(CrawlbaseПриложение.класс, аргументы);
}

}

Теперь, когда вы знакомы с основами, вы можете уверенно ориентироваться в ландшафте вашего проекта. Прежде чем начать кодирование, мы погрузимся в Crawlbase и попытаемся понять, как это работает и как мы можем использовать это в нашем проекте. Итак, будьте готовы раскрыть истинную силу краулера.

Начинаем путь кодирования в Java-скрейпинге

Теперь, когда у вас есть Java web scraping framework, Java web scraping library и Java web scraper, пришло время погрузиться в кодирование руководства Java web scraping. В этом разделе описываются основные шаги по созданию контроллеров, служб, репозиториев и обновлению файлов свойств. Прежде чем приступить к мельчайшим деталям кодирования, нам нужно заложить основу и ввести ключевые зависимости, которые расширят возможности нашего проекта.

Так как мы используем Crawlbase Crawler, важно убедиться, что мы можем легко использовать его в нашем проекте Java. К счастью, Crawlbase предоставляет библиотеку Java, которая упрощает этот процесс интеграции. Чтобы добавить его в наш проект, нам просто нужно включить соответствующую зависимость Maven в файл pom.xml проекта.

1
2
3
4
5
<зависимость>
<идентификатор_группы>com.crawlbase</идентификатор_группы>
<артефакта>crawlbase-java-sdk-pom</артефакта>
<версия>1.0</версия>
</зависимость>

После добавления этой зависимости быстрая установка Maven обеспечит Crawlbase Библиотека Java загружена из репозитория Maven и готова к использованию.

Интеграция зависимости JSoup

Учитывая, что мы будем глубоко погружаться в HTML-контент, наличие мощного HTML-парсера в нашем распоряжении имеет решающее значение. Встречайте JSoup, надежный и универсальный HTML-парсер для Java. Он предлагает удобные методы навигации и управления HTML-структурами. Чтобы использовать его возможности, нам нужно включить библиотеку JSoup в наш проект через другую зависимость Maven:

1
2
3
4
5
<зависимость>
<идентификатор_группы>org.jsoup</идентификатор_группы>
<артефакта>суп</артефакта>
<версия>1.16.1</версия>
</зависимость>

Настройка базы данных

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

  1. Откройте консоль MySQL: Если вы используете Ubuntu, запустите окно терминала. В Windows откройте MySQL Command Line Client или MySQL Shell.
  2. Войти в MySQL: Введите следующую команду и при появлении соответствующего запроса введите пароль root для MySQL:
1
mysql -u root -p
  1. Создайте новую базу данных: После входа в систему создайте новую базу данных с желаемым именем:
1
2
# Замените database_name на выбранное вами имя
СОЗДАТЬ БАЗУ ДАННЫХ имя_базы_данных;

Планирование моделей

Прежде чем погрузиться с головой в планирование модели, давайте разберемся, что возвращает краулер, когда ему отправляются URL-адреса, и какой ответ мы получаем на нашем веб-хуке. Когда мы отправляем URL-адреса краулеру, он отвечает идентификатором запроса, например:

1
{ "избавлять": "1e92e8bff32c31c2728714d4" }

После того, как краулер эффективно просканировал HTML-контент, он пересылает вывод в наш вебхук. Ответ будет выглядеть следующим образом:

1
2
3
4
5
6
7
8
9
10
11
12
Заголовки:
"Тип содержимого" => "текст/обычный"
«Контент-кодирование» => "gzip"
«Исходный-Статус» => 200
"PC-Статус" => 200
"избавлять" => «RID, который вы получили в push-вызове»
"URL" => "URL, который был просканирован"

Тело:
HTML-код страницы

// Тело будет закодировано gzip

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

Схема базы данных

Нам не нужно создавать таблицы базы данных напрямую, так как мы заставим наш проект Spring Boot автоматически инициализировать таблицы при запуске. Мы сделаем Режим гибернации сделать это для нас.

Проектирование файлов модели

С учетом фундамента, заложенного в предыдущем разделе, давайте углубимся в создание наших файлов модели. com.example.crawlbase.models В рамках пакета мы создадим две основные модели: CrawlerRequest.java и CrawlerResponse.java. Эти модели инкапсулируют структуру таблиц нашей базы данных, и для обеспечения эффективности мы будем использовать Lombok для сокращения шаблонного кода.

CrawlerЗапрос модели:

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
пакет com.example.crawlbase.models;

Импортировать jakarta.persistence.CascadeType;
Импортировать jakarta.persistence.Entity;
Импортировать jakarta.persistence.FetchType;
Импортировать jakarta.persistence.GeneratedValue;
Импортировать jakarta.persistence.Id;
Импортировать jakarta.persistence.OneToOne;
Импортировать lombok.AllArgsConstructor;
Импортировать Ломбок.Строитель;
Импортировать lombok.Данные;
Импортировать lombok.NoArgsConstructor;

@Сущность
@Данные
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
что такое варган? класс CrawlerЗапрос {

@Идентификатор
@СгенерированноеЗначение
частная Длинный идентификатор;

частная Строка URL;
частная Тип строки;
частная Целочисленный статус;
частная Избавление от веревки;

@OneToOne(mappedBy = "crawlerRequest", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
частная CrawlerОтвет краулераОтвет;

}

CrawlerМодель ответа:

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
пакет com.example.crawlbase.models;

Импортировать jakarta.persistence.Столбец;
Импортировать jakarta.persistence.Entity;
Импортировать jakarta.persistence.GeneratedValue;
Импортировать jakarta.persistence.Id;
Импортировать Джакарта.persistence.JoinColumn;
Импортировать jakarta.persistence.OneToOne;
Импортировать lombok.AllArgsConstructor;
Импортировать Ломбок.Строитель;
Импортировать lombok.Данные;
Импортировать lombok.NoArgsConstructor;

@Сущность
@Данные
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
что такое варган? класс CrawlerРежимы секции мощности {

@Идентификатор
@СгенерированноеЗначение
частная Длинный идентификатор;

частная Целое число pcStatus;
частная Целое число originalStatus;

@Column(columnDefinition = "ДЛИННЫЙ ТЕКСТ")
частная Строка pageHtml;

@ОдинКОдному
@JoinColumn(имя = "request_id")
частная CrawlerЗапрос crawlerRequest;

}

Создание репозиториев для обеих моделей

После создания наших моделей следующим шагом будет создание репозиториев для бесшовного взаимодействия между нашим проектом и базой данных. Эти интерфейсы репозиториев служат важными соединителями, используя интерфейс JpaRepository для предоставления основных функций доступа к данным. Hibernate, мощный инструмент ORM, обрабатывает базовое отображение между объектами Java и таблицами базы данных.

Создать пакет com.example.crawlbase.repositories и внутри него создать два интерфейса репозитория, CrawlerRequestRepository.java и CrawlerResponseRepository.java.

CrawlerИнтерфейс RequestRepository:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
пакет com.example.crawlbase.repositories;

Импортировать java.util.List;
Импортировать org.springframework.data.jpa.repository.JpaRepository;
Импортировать org.springframework.data.jpa.repository.Query;
Импортировать org.springframework.data.repository.query.Param;

Импортировать com.example.crawlbase.models.CrawlerЗапрос;

что такое варган? интерфейс CrawlerЗапросРепозитория продолжается JpaRepository<CrawlerЗапрос, длинный> {

// Найти по имени столбца и значению
СписокCrawlerЗапрос> findByRid(Строковое значение);
}

CrawlerИнтерфейс ResponseRepository:

1
2
3
4
5
6
7
8
пакет com.example.crawlbase.repositories;

Импортировать org.springframework.data.jpa.repository.JpaRepository;
Импортировать com.example.crawlbase.models.CrawlerОтвет;

что такое варган? интерфейс CrawlerОтветРепозиторий продолжается JpaRepository<CrawlerОтвет, длинный> {

}

API планирования и классы отображения тела запроса

Использование Crawlbase Crawler включает в себя проектирование двух важных API: один для передачи URL-адресов краулеру, а другой служит в качестве веб-хука. Для начала давайте спланируем структуры тела запроса для этих API.

Текст запроса Push URL:

1
2
3
4
5
6
{
"url-адреса": [
"http://www.3bfluidpower.com/",
.....
]
}

Что касается тела запроса API веб-перехватчика, оно должно соответствовать CrawlerСтруктура ответа, как обсуждалось ранее. Вы можете прочитать больше об этом здесь.

В соответствии с этим планированием мы создадим два класса отображения запросов в com.example.crawlbase.requests пакет:

CrawlerКласс WebhookRequest:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
пакет com.example.crawlbase.requests;

Импортировать Ломбок.Строитель;
Импортировать lombok.Данные;

@Данные
@Строитель
что такое варган? класс CrawlerWebhookRequest {

частная Целое число pc_status;
частная Целое число original_status;
частная Избавление от веревки;
частная Строка URL;
частная Корпус струны;

}

Класс ScrapeUrlRequest:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
пакет com.example.crawlbase.requests;

Импортировать Ломбок.Строитель;
Импортировать lombok.Данные;

@Данные
@Строитель
что такое варган? класс CrawlerWebhookRequest {

частная Целое число pc_status;
частная Целое число original_status;
частная Избавление от веревки;
частная Строка URL;
частная Корпус струны;

}

Создание ThreadPool для оптимизации веб-перехватчика

Если мы не оптимизируем наш вебхук для обработки большого количества запросов, это вызовет скрытые проблемы. Вот где мы можем использовать многопоточность. В JAVA ThreadPoolTaskExecutor используется для управления пулом рабочих потоков для одновременного выполнения асинхронных задач. Это особенно полезно, когда у вас есть задачи, которые могут выполняться независимо и параллельно.

Создать новый пакет com.example.crawlbase.config и создать ThreadPoolTaskExecutorConfig.java файл в нем.

Класс ThreadPoolTaskExecutorConfig:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
пакет com.example.crawlbase.config;

Импортировать org.springframework.context.annotation.Bean;
Импортировать org.springframework.context.annotation.Конфигурация;
Импортировать org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Конфигурация
что такое варган? класс ThreadPoolTaskExecutorConfig {

@Bean(имя = "taskExecutor")
что такое варган? ThreadPoolTaskExecutor taskExecutor() {
Int цвета = Runtime.getRuntime().availableProcessors();
ThreadPoolTaskExecutor исполнитель = новый ThreadPoolTaskExecutor();
executor.setCorePoolSize(ядра);
executor.setMaxPoolSize(ядра);
executor.setQueueCapacity(Integer.MAX_VALUE);
executor.setThreadNamePrefix("Асинхронный-");
исполнитель.инициализация();
возвращают исполнитель;
}
}

Создание Контроллеров и их Служб

Поскольку нам нужны два API и их бизнес-логика сильно отличается, мы реализуем их в отдельных контроллерах. Отдельные контроллеры означают, что у нас будут отдельные сервисы. Давайте сначала создадим MainController.java и его обслуживание как MainService.java. Мы реализуем API, который вы отправляете URL на Crawler в этом контроллере.

Создать новый пакет com.example.crawlbase.controllers для контроллеров и com.example.crawlbase.services за услуги в проекте.

Класс MainController:

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
пакет com.example.crawlbase.controllers;

Импортировать org.springframework.beans.factory.annotation.Autowired;
Импортировать org.springframework.http.HttpStatus;
Импортировать org.springframework.http.ResponseEntity;
Импортировать org.springframework.web.bind.annotation.PostMapping;
Импортировать org.springframework.web.bind.annotation.RequestBody;
Импортировать org.springframework.web.bind.annotation.RequestMapping;
Импортировать org.springframework.web.bind.annotation.RestController;

Импортировать com.example.crawlbase.requests.ScrapeUrlRequest;
Импортировать com.example.crawlbase.services.MainService;

Импортировать ломбок.внеш.slf4j.Slf4j;

@RestController
@RequestMapping("/scrape")
@ Slf4j
что такое варган? класс ГлавныйКонтроллер {

@Autowired
частная MainService mainService;

@PostMapping("/push-urls")
что такое варган? ОтветEntity pushUrlsToCawler(@RequestBody Запрос ScrapeUrlRequest) {
стараться {
if(!request.getUrls().isEmpty()) {
// Асинхронная обработка запроса
mainService.pushUrlsToCrawler(request.getUrls(), "родитель");
}
возвращают ResponseEntity.status(HttpStatus.OK).build();
} поймать (Исключение е) {
ошибка журнала(«Ошибка в pushUrlsToCrawler функция: " + e.getMessage());
возвращают ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
}
}

}

Как вы можете видеть выше, мы создали RESTful API «@POST /scrape/push-urls», который будет отвечать за обработку запросов на отправку URL-адресов в Crawler.

Основной класс обслуживания:

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
пакет com.example.crawlbase.services;

Импортировать Java.утилита.*;
Импортировать com.crawlbase.*;
Импортировать com.example.crawlbase.models.CrawlerЗапрос;
Импортировать com.example.crawlbase.repositories.CrawlerЗапросРепозитория;
Импортировать com.fasterxml.jackson.databind.JsonNode;
Импортировать com.fasterxml.jackson.databind.ObjectMapper;

Импортировать ломбок.внеш.slf4j.Slf4j;

Импортировать org.springframework.beans.factory.annotation.Autowired;
Импортировать org.springframework.beans.factory.annotation.Значение;
Импортировать org.springframework.scheduling.annotation.Async;
Импортировать org.springframework.stereotype.Service;

@ Slf4j
@Обслуживание
что такое варган? класс MainService {

@Autowired
частная CrawlerЗапросРепозитория crawlerRequestRepository;

// Вставляем значения из файла свойств
@Value("${crawlbase.token}")
частная Строка crawlbaseToken;
@Value("${crawlbase.crawler}")
частная Строка CrawlBaseCrawlerИмя;

частная окончательный Объектомаппер objectMapper = новый Объектомаппер();

@Асинхронный
что такое варган? аннулировать pushUrlsToCrawler(Список URL-адреса, тип строки) {
HashMap варианты = новый Хэшмап();
параметры.put("перезвонить", "True");
параметры.put("гусеничный", база данныхCrawlerИмя);
параметры.put("callback_headers", "тип:" + тип);

API API = нуль;
CrawlerЗапрос REQ = нуль;
JsonNode jsonNode = нуль;
строка избавиться = нуль;

для(Строка URL: URL-адреса) {
стараться {
API = новый API(crawlbaseToken);
api.get(url, параметры);
jsonNode = objectMapper.readTree(api.getBody());
рид = jsonNode.получить("избавлять").asText();
if(избавиться != нуль) {
требование = CrawlerЗапрос.builder().url(url).type(тип).
статус(api.getStatusCode()).rid(rid).build();
crawlerRequestRepository.save(req);
}
} поймать(Исключение е) {
ошибка журнала(«Ошибка в pushUrlsToCrawler функция: " + e.getMessage());
}
}
}

}

В указанной выше службе мы создали метод Async для асинхронной обработки запроса. pushUrlsToCrawler функция использует Crawlbase библиотека для отправки URL-адресов в Crawler и затем сохранить полученный RID и другие атрибуты в таблице crawler_request. Для отправки URL-адресов в Crawler, мы должны использовать параметры «crawler» и «callback». Мы также используем «callback_headers» для отправки пользовательского заголовка «type», который мы будем использовать, чтобы узнать, является ли URL тем, который мы указали, или он был извлечен во время глубокого сканирования. Вы можете прочитать больше об этих параметрах и многих других здесь.

Теперь нам нужно реализовать API, мы будем использовать вебхук. Для этого создайте WebhookController.java в com.example.crawlbase.controllers пакет и WebhookService.java в com.example.crawlbase.services пакет.

Класс WebhookController:

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
пакет com.example.crawlbase.controllers;

Импортировать org.springframework.beans.factory.annotation.Autowired;
Импортировать org.springframework.http.HttpHeaders;
Импортировать org.springframework.http.HttpStatus;
Импортировать org.springframework.http.ResponseEntity;
Импортировать org.springframework.web.bind.annotation.PostMapping;
Импортировать org.springframework.web.bind.annotation.RequestBody;
Импортировать org.springframework.web.bind.annotation.RequestHeader;
Импортировать org.springframework.web.bind.annotation.RequestMapping;
Импортировать org.springframework.web.bind.annotation.RestController;

Импортировать com.example.crawlbase.services.WebhookService;

Импортировать ломбок.внеш.slf4j.Slf4j;

@RestController
@RequestMapping("/вебхук")
@ Slf4j
что такое варган? класс WebHookController {

@Autowired
частная WebhookService вебхукСервис;

@PostMapping("/crawlbase")
что такое варган? ОтветEntity база сканированияCrawlerРежимы секции мощности(@ЗаголовокЗапроса заголовки HttpHeaders, @RequestBody байт[] сжатое тело) {
стараться {
if(!headers.getFirst(HttpHeaders.USER_AGENT).equalsIgnoreCase("Crawlbase Бот мониторинга 1.0") &&
"gzip".equalsIgnoreCase(headers.getFirst(HttpHeaders.CONTENT_ENCODING)) &&
заголовки.getFirst("статус_ПК").равно("200")) {
// Асинхронная обработка запроса
webhookService.handleWebhookResponse(заголовки, сжатое тело);
}
возвращают ResponseEntity.status(HttpStatus.OK).build();
} поймать (Исключение е) {
ошибка журнала(«Ошибка в базе данных сканированияCrawlerФункция ответа: " + e.getMessage());
возвращают ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
}
}

}

В приведенном выше коде вы можете видеть, что мы создали RESTful API, «@POST /webhook/crawlbase», который будет отвечать за получение ответа на выходной запрос от Crawler. Вы можете заметить в коде, что мы игнорируем вызовы с USER_AGENT как «Crawlbase Мониторинговый бот 1.0», потому что Crawler Бот мониторинга запрашивает этот пользовательский агент для проверки того, является ли обратный вызов живым и доступным. Поэтому нет необходимости обрабатывать этот запрос. Просто верните успешный ответ на Crawler.

Во время работы с Crawlbase Crawler, Ваш серверный вебхук должен…

  • Быть доступным для общественности Crawlbase серверы
  • Будьте готовы принимать вызовы POST и отвечать в течение 200 мс.
  • Ответьте в течение 200 мс кодом статуса 200, 201 или 204 без содержания

Класс WebhookService:

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
пакет com.example.crawlbase.services;

Импортировать java.io.ByteArrayInputStream;
Импортировать java.io.InputStreamReader;
Импортировать java.net.URI;
Импортировать java.net.URISyntaxException;
Импортировать java.util.ArrayList;
Импортировать java.util.List;
Импортировать java.util.Объекты;
Импортировать java.util.regex.Matcher;
Импортировать java.util.regex.Pattern;
Импортировать java.util.zip.GZIPInputStream;

Импортировать org.jsoup.Jsoup;
Импортировать org.jsoup.nodes.Документ;
Импортировать org.jsoup.nodes.Элемент;
Импортировать org.jsoup.select.Элементы;
Импортировать org.springframework.beans.factory.annotation.Autowired;
Импортировать org.springframework.http.HttpHeaders;
Импортировать org.springframework.scheduling.annotation.Async;
Импортировать org.springframework.stereotype.Service;

Импортировать com.example.crawlbase.models.CrawlerЗапрос;
Импортировать com.example.crawlbase.models.CrawlerОтвет;
Импортировать com.example.crawlbase.repositories.CrawlerЗапросРепозитория;
Импортировать com.example.crawlbase.repositories.CrawlerРепозиторийОтветов;
Импортировать com.example.crawlbase.requests.CrawlerWebhookRequest;

Импортировать ломбок.внеш.slf4j.Slf4j;

@ Slf4j
@Обслуживание
что такое варган? класс WebHookService {

@Autowired
частная CrawlerЗапросРепозитория crawlerRequestRepository;
@Autowired
частная CrawlerResponseRepository краулерResponseRepository;
@Autowired
частная MainService mainService;

@Async("taskExecutor")
что такое варган? аннулировать handleWebhookResponse(заголовки HttpHeaders, байт[] сжатое тело) {
стараться {
// Распаковываем сжатое gzip-файлом тело
GZIPInputStream gzipInputStream = новый GZIPInputStream(новый БайтмассивInputStream(сжатое тело));
ИнпутStreamReader читатель = новый ИнпутStreamReader(gzipInputStream);

// Обработка несжатого HTML-контента
Строитель строк htmlКонтент = новый Строитель строк();
колесница[] буфер = новый колесница[1024];
Int байтыПрочитаны;
в то время как ((bytesRead = reader.read(буфер)) != -1) {
htmlContent.append(буфер, 0, байтыRead);
}

// HTML-строка
строка htmlСтрока = htmlContent.toString();

// Создать объект запроса
CrawlerWebhookRequest запросить = CrawlerWebhookRequest.builder()
.original_status(Integer.valueOf(headers.getFirst("исходный_статус")))
.pc_status(Integer.valueOf(headers.getFirst("статус_ПК")))
.rid(заголовки.getFirst("избавлять"))
.url(заголовки.getFirst("URL"))
.body(htmlString).build();

// Сохранять CrawlerМодель ответа
СписокCrawlerЗапрос> результаты = crawlerRequestRepository.findByRid(request.getRid());
CrawlerЗапрос crawlerRequest = !results.isEmpty() ? results.get(0): нуль;
if(crawlerRequest != нуль) {
// Строить CrawlerМодель ответа
CrawlerРежимы секции мощности гусеничный ответ = CrawlerОтвет.builder().pcStatus(request.getPc_status())
.originalStatus(request.getOriginal_status()).pageHtml(request.getBody()).crawlerRequest(crawlerRequest).build();
crawlerResponseRepository.save(crawlerResponse);
}

// Только родительский URL глубокого сканирования
if(headers.getFirst("тип").equalsIgnoreCase("родитель")) {
deepCrawlParentResponse(request.getBody(), request.getUrl());
}
} поймать (Исключение е) {
ошибка журнала(«Ошибка в функции handleWebhookResponse:» + e.getMessage());
}

}

частная аннулировать deepCrawlParentResponse(Строка html, Строка baseUrl) {
Документ документ = Jsoup.parse(html);
Elements гиперссылки = документ.getElementsByTag(«А»);
Список ссылки = новый ArrayList();

строка URL = нуль;
для (Элемент гиперссылки : гиперссылки) {
url = processUrl(гиперссылка.attr(href), baseUrl);
if(url != нуль) {
ссылки.добавить(url);
}
}

mainService.pushUrlsToCrawler(ссылки, "ребенок");
}

частная строка процессUrl(Строка href, Строка baseUrl) {
стараться {
if (href != нуль && !href.isEmpty()) {
baseUrl = normalizeUrl(baseUrl);
строка обработанныйUrl = нормализоватьUrl(href.startsWith("/") ? baseUrl + href : href);
if (isValidUrl(обработанныйUrl) &&
!обработанныйUrl.заменить("http: //", "").заменять("https://", "").equals(baseUrl.replace("http: //", "").заменять("https://", "")) &&
// Рассматриваются только URL-адреса с одинаковым именем хоста
Объекты.равны(новый URI(обработанныйUrl).getHost(), новый URI(baseUrl).getHost())) {

возвращают обработанныйUrl;
}
}
} поймать (Исключение е) {
ошибка журнала("Ошибка в функции processUrl: " + e.getMessage());
}
возвращают нуль;
}

частная логический isValidUrl(Строка, строка) {
строка urlRegex = "((http|https)://)(www.)?"
+ "[a-zA-Z0-9@:%._\\+~#?&//=]"
+ "{2,256}\\.[az]"
+ "{2,6}\\b([-a-zA-Z0-9@:%"
+ "._\\+~#?&//=]*)";
шаблон описания = Шаблон.компиляция(urlRegex);
Матчер согласовани = шаблон.сопоставитель(строка);
возвращают сопоставитель.совпадения();
}

частная строка нормализоватьUrl(Строка URL) бросает URISyntaxException {
url = url.заменить("//www.", "//");
url = url.split("#")[0];
url = url.endsWith("/") ? url.подстрока(0, url.длина() - 1) : URL-адрес;
возвращают URL-адрес;
}
}

Класс WebhookService играет важную роль в эффективной обработке ответов webhook и организации процесса глубокого сканирования. Когда получен ответ webhook, метод handleWebhookResponse вызывается асинхронно из crawlbase WebhookControllerCrawlerФункция ответа. Этот метод начинается с распаковки сжатого HTML-контента и извлечения необходимых метаданных и HTML-данных. Извлеченные данные затем используются для построения CrawlerОбъект WebhookRequest, содержащий такие данные, как статус, идентификатор запроса (rid), URL и HTML-содержимое.

Далее служба проверяет, существует ли CrawlerЗапрос, связанный с идентификатором запроса. Если найден, он создает CrawlerОбъект ответа для инкапсуляции соответствующих деталей ответа. Это CrawlerЭкземпляр ответа затем сохраняется в базе данных через CrawlerРепозиторийОтветов.

Однако эта служба отличается своей способностью облегчать глубокое сканирование. Если тип ответа webhook указывает на «родительский» URL, служба вызывает метод deepCrawlParentResponse. В этом методе HTML-контент анализируется с использованием библиотеки Jsoup для определения гиперссылок на странице. Эти гиперссылки, представляющие дочерние URL, обрабатываются и проверяются. Сохраняются только URL, принадлежащие одному и тому же имени хоста и соответствующие определенному формату.

Затем MainService используется для помещения этих допустимых дочерних URL-адресов в конвейер сканирования, используя тип «дочерний» в качестве флага. Это инициирует рекурсивный процесс глубокого сканирования, в ходе которого дочерние URL-адреса дополнительно сканируются, расширяя исследование до нескольких уровней взаимосвязанных страниц. По сути, WebhookService координирует сложный танец обработки ответов веб-перехватчиков, сбора и сохранения соответствующих данных и организации сложного процесса глубокого сканирования путем разумной идентификации и навигации по родительским и дочерним URL-адресам.

Обновление файла application.properties

На последнем этапе мы настроим файл application.properties, чтобы определить основные свойства и настройки для нашего проекта. Этот файл служит центральным узлом для настройки различных аспектов нашего приложения. Здесь нам нужно указать свойства, связанные с базой данных, настройки Hibernate, Crawlbase детали интеграции и настройки ведения журнала.

Убедитесь, что ваш файл application.properties включает следующие свойства:

1
2
3
4
5
6
7
8
9
10
11
12
13
# Конфигурация базы данных
spring.datasource.url=jdbc:mysql://localhost:3306/
spring.datasource.имя_пользователя=
spring.datasource.password=

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=обновление

# Crawlbase Crawler интеграцию
crawlbase.токен=Crawlbase_Обычный_токен>
crawlbase.crawler=Crawler_Имя>

имя.файла.журнала=logs/ .журнал

Вы можете найти свой Crawlbase TCP (обычный) токен здесь. Не забудьте заменить заполнители в коде выше на ваши фактические значения, как определено в предыдущих разделах. Эта конфигурация имеет решающее значение для установления соединений с базой данных, синхронизации операций Hibernate, интеграции с Crawlbase API и управление ведением журнала для вашего приложения. Тщательно настраивая эти свойства, вы обеспечите бесперебойную связь между различными компонентами и службами в вашем проекте.

Запуск проекта и начало глубокого сканирования

После завершения фазы кодирования следующим шагом будет запуск проекта. Spring Boot, по своей сути, использует встроенную сборку Apache Tomcat, которая обеспечивает плавный переход от разработки к производству и легко интегрируется с известными платформами как услугой. Выполнение проекта в Spring Tool Suite (STS) включает в себя простой процесс:

  • Щелкните правой кнопкой мыши по проекту в дереве структуры проекта STS.
  • Перейдите в меню «Запуск от имени». и
  • Выберите «Приложение Spring Boot».

Это действие запускает проект на локальном хосте, порт 8080.

Работа сервера Spring Boot

Сделать Webhook общедоступным

Поскольку вебхук, который мы установили, находится локально в нашей системе на localhost, порт 8080, нам нужно предоставить ему публичный доступ. Войти Нгрок, инструмент, который создает защищенные туннели, предоставляя удаленный доступ без необходимости манипулировать сетевыми настройками или портами маршрутизатора. Ngrok выполняется на порту 8080, чтобы сделать наш вебхук общедоступным.

Сервер Ngrok

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

Создание Crawlbase Crawler

Вспомним наше предыдущее обсуждение Crawlbase Crawler создание через Crawlbase приборная панель. Вооружившись общедоступным вебхуком через Ngrok, создание краулера становится простым.

Создать новый Crawler

В изображенном примере URL-адрес пересылки ngrok взаимодействует с адресом веб-перехватчика «/webhook/crawlbase» в качестве обратного вызова. Это слияние дает полностью публичный адрес веб-перехватчика. Мы окрестили наш краулер «test-crawler», это имя будет включено в файл application.properties проекта. Выбор TCP Crawler совпадает с нашим выбором. При нажатии на «Создать Crawler” кнопка, сканер приобретает форму, настроенную в соответствии с указанными параметрами.

Инициирование Глубокое Crawling путем проталкивания URL-адресов

После создания краулера и включения его имени в файл application.properties мы готовы взаимодействовать с API «@POST /scrape/push-urls». Через этот API мы отправляем URL-адреса краулеру, запуская процесс глубокого сканирования. Давайте проиллюстрируем это, отправив URL-адрес http://www.3bfluidpower.com/.

Запрос почтальона

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

Анализ вывода в базе данных

При инициировании URL-адреса нажмите на Crawlerвозвращается идентификатор запроса (RID) — концепция, подробно рассмотренная в предыдущих обсуждениях — отмечая начало процесса сканирования страницы на Crawler's end. Этот стратегический подход исключает время ожидания, обычно связанное с процессом сканирования, повышая эффективность и результативность сбора данных. После того, как Crawler завершает сканирование, он плавно передает вывод в наш вебхук.

Параметр Custom Headers, в частности параметр «type», играет важную роль в наших усилиях. Его наличие позволяет нам различать URL-адреса, которые мы протолкнули, и те, которые были обнаружены во время глубокого сканирования. Когда тип обозначен как «родительский», URL-адрес вытекает из нашего представления, побуждая нас извлекать новые URL-адреса из просканированного HTML-кода и затем возвращать их обратно в Crawler— на этот раз классифицированный как «дочерний». Эта стратегия гарантирует, что только введенные нами URL-адреса будут подвергнуты глубокому сканированию, что упрощает процесс.

В нашем текущем сценарии, рассматривая отправку отдельного URL-адреса в Crawler, рабочий процесс разворачивается следующим образом: получив просканированный HTML, служба webhook сохраняет его в таблице crawler_response. Затем происходит глубокое сканирование этого HTML, что приводит к обнаружению новых URL-адресов, которые затем передаются в Crawler.

Таблица crawler_request:

Crawler Запросить таблицу

Как вы можете видеть выше, в нашей службе вебхуков мы обнаружили 16 новых URL-адресов из HTML-кода страницы, URL-адрес которой мы передаем на Crawler в предыдущем разделе, который мы сохраняем в базе данных с «type: parent». Мы передаем все новые найденные URL-адреса в сканер для глубокого сканирования указанного URL-адреса. Crawler просканирует их все и отправит вывод на наш вебхук. Мы сохраняем просканированный HTML в таблице crawler_response.

Таблица crawler_response:

Crawler Таблица ответов

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

Заключение

В ходе этого исследования веб-скрапинга с помощью Java и Spring Boot мы прошли через критические этапы настройки среды Java, адаптированной для веб-скрапинга, выбора соответствующих библиотек и выполнения как простых, так и сложных проектов веб-скрапинга. Этот путь подчеркивает универсальность и надежность Java в извлечении данных из Интернета, выделяя такие инструменты, как JSoup, Selenium и HtmlUnit, за их уникальные сильные стороны в обработке как статического, так и динамического веб-контента. Предоставляя читателям знания, необходимые для адаптации их усилий по веб-скрапингу к требованиям конкретного проекта, эта статья служит всеобъемлющим руководством по сложностям и возможностям веб-скрапинга с помощью Java.

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

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

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

Сканирование веб-сайтов электронной коммерции

Веб-скрейпинг Expedia

Веб-скрапинг Booking.com

Как извлечь отзывы о продуктах G2

Веб-скрапинг драматурга

Скрап Yahoo Finance

FAQ

В: Нужно ли мне использовать JAVA для использования Crawler?

Нет, вам не обязательно использовать исключительно JAVA, чтобы использовать Crawlbase Crawler, Crawler предоставляет несколько библиотек для различных языков программирования, позволяя пользователям взаимодействовать с ним, используя предпочитаемый ими язык. Независимо от того, насколько вам комфортно работать с Python, JavaScript, Java, Ruby или другими языками программирования, Crawlbase вы охвачены. Кроме того, Crawlbase предлагает API, которые позволяют пользователям получать доступ к CrawlerВозможности , не полагаясь на определенные библиотеки, что делает его доступным для широкого круга разработчиков с различными языковыми предпочтениями и техническим опытом. Эта гибкость гарантирует, что вы можете легко интегрировать Crawler в ваши проекты и рабочие процессы, используя язык, который лучше всего соответствует вашим потребностям.

В: Можно ли использовать Java для веб-скрапинга?

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

В: Какая библиотека Java наиболее эффективна для веб-скрапинга?

Для веб-скрапинга в Java наиболее рекомендуемыми библиотеками являются JSoup, HtmlUnit и Selenium WebDriver. JSoup особенно полезен для извлечения данных из статических HTML-страниц. Для динамических веб-сайтов, использующих JavaScript, лучше подходят HtmlUnit и Selenium WebDriver.

В: Какой язык больше подходит для веб-скрапинга — Java или Python?

Python обычно предпочитают для веб-скрапинга, а не Java. Это предпочтение обусловлено простотой Python и его богатой экосистемой библиотек, таких как BeautifulSoup, которая упрощает парсинг и навигацию по документам HTML и XML.

В: Какой язык программирования считается лучшим для веб-скрапинга?

Python считается лучшим языком программирования для задач веб-скрапинга. Он предлагает полный набор библиотек и инструментов, таких как BeautifulSoup и Scrapy, которые разработаны для облегчения эффективного и действенного веб-скрапинга.