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 за замовчуванням використовує безголовий браузер, він працює без графічного інтерфейсу, що робить його швидшим і менш ресурсомістким.
Налаштування 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, але ви можете взяти будь-яку Java IDE, наприклад IntelliJ IDEA або Eclipse. Переконайтеся, що ваша IDE налаштована на використання JDK 11 або новішого, оскільки це потрібно Jvppeteer.
Крок 3: Створіть свій вебскрапер
Тепер напишімо простий вебскрапер на Jvppeteer. Наведений нижче Java-код демонструє, як запустити браузер Chrome у безголовому режимі, перейти на цільову вебсторінку та отримати HTML-вміст:
package com.example;
import com.ruiyun.jvppeteer.api.core.Browser;
import com.ruiyun.jvppeteer.api.core.Page;
import com.ruiyun.jvppeteer.cdp.core.Puppeteer;
import com.ruiyun.jvppeteer.cdp.entities.LaunchOptions;
public class Main {
public static void main(String[] args) {
System.out.println("Запуск браузера…");
// Initialize launch options
LaunchOptions launchOptions = LaunchOptions.builder()
.headless(true) // Run in headless mode
.build();
try (Browser cdpBrowser = Puppeteer.launch(launchOptions)) {
// Open a new page
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);
} catch (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:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Main {
public static void main(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 document = Jsoup.parse(pageContent);
Elements products = document.select(".product"); // Select product elements
// Extract data
for (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("Product Name: " name);
System.out.println("Ціна: " price);
System.out.println("URL зображення: " image);
System.out.println(" - - - - - - - - - - - ");
}
}
}
Крок 5: Експортуйте дані у CSV-файл
Після того як ви зберете й розберете дані, може виникнути потреба експортувати їх у CSV-файл для зручного аналізу. Використайте вбудований у Java клас FileWriter, щоб зберегти дані в CSV-файл.
Ось як можна змінити ваш код, щоб експортувати дані у CSV-файл:
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Main {
private static List<String[]> productData = new ArrayList<>();
public static void main(String[] args) {
// Scrape and parse data (same as before)
// Store the product details
productData.add(new String[]{name, price, image});
// Export data to CSV
exportDataToCsv("products.csv");
}
private static void exportDataToCsv(String filePath) {
try (FileWriter writer = new FileWriter(filePath)) {
writer.append("Product Name,Price,Image URLn");
// Write data rows
for (String[] row : productData) {
writer.append(String.join(",", row));
writer.append("n");
}
System.out.println("Дані збережено в " filePath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Крок 6: Обробка динамічного вмісту та нескінченного прокручування
Багато сучасних вебсайтів використовують нескінченну прокрутку для динамічного завантаження вмісту під час прокручування сторінки вниз. Щоб збирати дані з таких сторінок, потрібно імітувати прокручування до самого низу сторінки, щоб завантажити весь вміст.
Наведений нижче код демонструє, як обробляти нескінченну прокрутку за допомогою Puppeteer у Java:
long lastHeight = ((Number) page.evaluate("() => document.body.scrollHeight")).longValue();
while (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();
if (newHeight == lastHeight) {
break; // 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 = new 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 challenge:
String apiUrl = "https://api.brightdata.com/v1/?apikey=&url=https%3A%2F%2Fwww.scrapingcourse.com%2Fantibot-challenge&js_render=true&premium_proxy=true";
String response = Request.get(apiUrl)
.execute().returnContent().asString();
System.out.println(response);
Conclusion
Puppeteer на Java — потужний інструмент для вебскрапінгу, особливо в поєднанні з Jvppeteer. Незалежно від того, чи потрібно вам збирати статичні дані, чи працювати з динамічним вмістом, Puppeteer пропонує гнучке й ефективне рішення. Дотримуючись кроків цього посібника, ви зможете створити повноцінний вебскрапер, працювати з нескінченною прокруткою, робити скріншоти та уникати блокування під час вебскрапінгу.

