Puppeteer для веб-скрапинга на Java
В этой статье я покажу, как настроить и использовать Puppeteer для веб-скрапинга на Java. Я также поделюсь полезными советами, которые помогут сделать процесс скрапинга более удобным и эффективным. Давайте сразу начнем!
Что такое Puppeteer?
Puppeteer is a Node.js library that provides a high-level API to control headless Chrome or Chromium browsers using the Chrome DevTools Protocol. Headless means that the browser operates without a графический пользовательский интерфейс (GUI), делая его быстрее и эффективнее для автоматизированных задач. Puppeteer позволяет разработчикам автоматизировать действия в браузере, такие как переход по страницам, отправка форм, создание скриншотов и даже веб-скрапинг.
Though Puppeteer is designed for Node.js, you can also use it in Java with the help of Jvppeteer, a Java wrapper for Puppeteer. Jvppeteer позволяет взаимодействовать с браузерами без графического интерфейса на Java, предоставляя аналогичные возможности Puppeteer в экосистеме Java.
Прежде чем продолжить, рекомендую прочитать мою статью о Лучшие Java-библиотеки для веб-скрапинга.
Зачем использовать Puppeteer для веб-скрейпинга?
Есть несколько причин, по которым Puppeteer хорошо подходит для веб-скрапинга:
- JavaScript Rendering: Многие современные сайты сильно зависят от JavaScript для динамической загрузки контента. Puppeteer позволяет выполнять JavaScript в браузере и получать данные, которые могут быть недоступны в исходном HTML.
- Page Interaction: Puppeteer позволяет взаимодействовать с веб-страницами, нажимать кнопки, заполнять формы и выполнять другие действия, имитирующие поведение реального пользователя.
- Снимки экрана и PDF-файлы: Puppeteer может делать скриншоты и создавать PDF-файлы веб-страниц, что полезно для архивирования или захвата визуального контента.
- Headless Browser: Поскольку Puppeteer по умолчанию использует headless-браузер, он работает без графического интерфейса, что делает его быстрее и менее ресурсоёмким.
Настройка Jvppeteer для веб-скрапинга на Java
Поскольку Puppeteer недоступен в Java из коробки, вам понадобится Jvppeteer, Java-обертка для Puppeteer. Выполните следующие шаги, чтобы настроить Jvppeteer для веб-скрапинга:
Шаг 1: Установка зависимости Jvppeteer
The first step is to add the Jvppeteer dependency to your Java project. If you’re using Maven, add the following snippet to the pom.xml file:
<dependency>
<groupId>io.github.fanyong920</groupId>
<artifactId>jvppeteer</artifactId>
<version>3.3.2</version>
</dependency>
Убедитесь, что вы используете последнюю версию Jvppeteer, проверив официальный репозиторий на GitHub.
Шаг 2: Создание Java-проекта
Далее создайте Java-проект в предпочитаемой IDE. В этом руководстве мы будем использовать Visual Studio Code, но вы можете использовать любую IDE для Java, например IntelliJ IDEA или Eclipse. Убедитесь, что IDE настроена на JDK 11 или новее, поскольку этого требует Jvppeteer.
Шаг 3: Создайте свой веб-скрапер
Теперь давайте напишем простой веб-скрапер с помощью Jvppeteer. Следующий Java-код показывает, как запустить Chrome в headless-режиме, перейти на целевую веб-страницу и получить HTML-контент:
package com.example;
импорт com.ruiyun.jvppeteer.api.core.Browser;
импорт com.ruiyun.jvppeteer.api.core.Page;
импорт com.ruiyun.jvppeteer.cdp.core.Puppeteer;
импорт com.ruiyun.jvppeteer.cdp.entities.LaunchOptions;
public класс Main {
public static void главная(String[] args) {
System.out.println("Launching browser…");
// Initialize launch options
LaunchOptions launchOptions = LaunchOptions.builder()
.headless(true) // Run in headless mode
.build();
попробуйте (Browser cdpBrowser = Puppeteer.launch(launchOptions)) {
// Open a new page
Page страница = cdpBrowser.newPage();
// Navigate to the target URL
page.goTo("https://www.example.com");
// Retrieve the page's HTML content
String pageContent = page.content();
System.out.println(pageContent);
} поймать (Exception e) {
e.printStackTrace();
}
}
}
Шаг 4: Извлеките данные со страницы
Теперь, когда вы уже извлекли HTML-контент страницы, вы можете распарсить его, чтобы получить нужные данные. В этом руководстве мы используем JSoup, Java-библиотеку для парсинга HTML, чтобы извлечь требуемые данные.
Add JSoup to your pom.xml file:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.18.3</version>
</dependency>
Next, modify your Main.java file to parse the HTML content and extract product names, prices, and image URLs:
импорт org.jsoup.Jsoup;
импорт org.jsoup.nodes.Document;
импорт org.jsoup.nodes.Element;
импорт org.jsoup.select.Elements;
public класс Main {
public static void главная(String[] args) {
// Launch Puppeteer browser and scrape the HTML content (same as before)
String pageContent = …; // Assuming pageContent is obtained from Puppeteer
// Parse HTML using JSoup
Document документ = Jsoup.parse(pageContent);
Elements продукция = document.select(".product"); // Select product elements
// Extract data
для (Element product : products) {
String name = product.select(".product-name").text();
String price = product.select(".product-price").text();
String image = product.select(".product-image").attr("src");
System.out.println("Название продукта: " name);
System.out.println("Price: " price);
System.out.println("Image URL: " image);
System.out.println(" - - - - - - - - - - - ");
}
}
}
Шаг 5: Экспортируйте данные в CSV-файл
После того как вы извлекли и распарсили данные, их можно экспортировать в CSV-файл для удобного анализа. Используйте встроенный класс FileWriter в Java, чтобы сохранить данные в CSV-файл.
Вот как можно изменить код, чтобы экспортировать данные в CSV-файл:
импорт java.io.FileWriter;
импорт java.io.IOException;
импорт java.util.ArrayList;
импорт java.util.List;
public класс Main {
private static List<String[]> productData = новый ArrayList<>();
public static void главная(String[] args) {
// Scrape and parse data (same as before)
// Store the product details
productData.add(новый String[]{name, price, image});
// Export data to CSV
exportDataToCsv("products.csv");
}
private static void exportDataToCsv(String filePath) {
попробуйте (FileWriter writer = новый FileWriter(filePath)) {
writer.append("Product Name,Price,Image URLn");
// Write data rows
для (String[] row : productData) {
writer.append(String.join(",", row));
writer.append("n");
}
System.out.println("Данные сохранены в " filePath);
} поймать (IOException e) {
e.printStackTrace();
}
}
}
Шаг 6: Обработка динамического контента и бесконечной прокрутки
Многие современные сайты используют бесконечную прокрутку, чтобы динамически подгружать контент по мере прокрутки страницы. Чтобы скрейпить такие страницы, нужно имитировать прокрутку до нижней части страницы, чтобы загрузить весь контент.
Следующий код показывает, как обрабатывать бесконечную прокрутку с помощью Puppeteer на Java:
long lastHeight = ((Number) page.evaluate("() => document.body.scrollHeight")).longValue();
в то время как (true) {
// Scroll down
page.evaluate("window.scrollTo(0, document.body.scrollHeight)");
// Wait for new content to load
Thread.sleep(3000);
// Get new scroll height
long newHeight = ((Number) page.evaluate("() => document.body.scrollHeight")).longValue();
если (newHeight == lastHeight) {
перерыв; // Stop scrolling if there is no more new content
}
lastHeight = newHeight;
}
Шаг 7: Создание скриншотов
Иногда во время скрейпинга стоит снимать скриншоты веб-страниц. Puppeteer позволяет снимать скриншоты разными способами:
- Full Page Screenshot: Захватывает всю страницу, включая части, требующие прокрутки.
- Visible Area Screenshot: Захватывает только видимую часть веб-страницы.
- Element Screenshot: Снимает скриншот конкретного HTML-элемента.
Вот как можно сделать снимок всей страницы с помощью Puppeteer:
ScreenshotOptions screenshotOptions = новый ScreenshotOptions();
screenshotOptions.setPath("full_page.png");
screenshotOptions.setOmitBackground(true);
screenshotOptions.setFullPage(true);
page.screenshot(screenshotOptions);
Шаг 8: Как избежать блокировок
Одна из распространённых проблем при скрейпинге сайтов — блокировка. Многие сайты используют антибот-механизмы, чтобы обнаруживать и блокировать скрейперы. Чтобы избежать блокировки:
- Use Proxies: Ротация прокси может помочь скрыть ваш реальный IP-адрес.
- Set User Agents: Установите пользовательский заголовок User-Agent, чтобы имитировать реальный браузер.
- Используйте Bright Data API: Bright Data предлагает API, который обходит антибот-ограничения и позволяет скрапить без ограничений.
Вот пример использования Bright Data для обхода AntiBot-проверки:
String apiUrl = "https://api.brightdata.com/v1/?apikey=&url=https%3A%2F%2Fwww.scrapingcourse.com%2Fantibot-challenge&js_render=true&premium_proxy=true";
String ответ = Request.get(apiUrl)
.execute().returnContent().asString();
System.out.println(response);
Заключение
Puppeteer в Java — мощный инструмент для веб-скрейпинга, особенно в связке с Jvppeteer. Нужен ли вам сбор статических данных или обработка динамического контента, Puppeteer предлагает гибкое и эффективное решение. Следуя шагам из этого руководства, вы сможете создать полностью функциональный веб-скрейпер, обрабатывать бесконечную прокрутку, делать скриншоты и избегать блокировок во время скрейпинга.

