Scala Web Scraping

Вебскрапінг на Scala: покроковий посібник 2026

У цьому посібнику ви дізнаєтеся, як налаштувати свій Scala середовище, витягувати дані зі статичних вебсторінок, обробляти пагінований контент і виконувати вебскрапінг динамічних сайтів за допомогою таких інструментів, як Selenium. Наприкінці ви матимете міцне розуміння технік вебскрапінгу на Scala.

Чому варто обрати Scala для вебскрапінгу?

Scala є практичним вибором для вебскрапінгу завдяки:

  • Простий і виразний синтаксис: Її лаконічний синтаксис робить код легким для читання та підтримки.
  • Interoperability: Scala може використовувати Java-бібліотеки, як-от Jsoup, Selenium і HtmlUnit.
  • Функціональні можливості: Вона підтримує парадигми функціонального програмування, що спрощують завдання з обробки даних.

While Python and Node.js є популярнішими для вебскрапінгу, Scala пропонує унікальний баланс між продуктивністю та гнучкістю.

Вебскрапінг без коду

Якщо ви хочете скрапити сайти без написання коду, раджу звернути увагу на такі платформи:

  1. Bright Data — скрапер корпоративного рівня з високою масштабованістю та автоматизацією.
  2. Octoparse — Зручне, гнучке вилучення даних із плануванням.
  3. ParseHub — Інтуїтивний скрапер із керуванням через натискання для структурованих даних.
  4. Apify — Хмарний вебскрапінг із попередньо готовими шаблонами та API.
  5. Вебскрапер — Розширення для браузера для швидкого й простого вебскрапінгу.

Хочете дізнатися більше? Перегляньте повну стаття про no-code вебскрапери. Я не пов’язаний із жодним із провайдерів!

Передумови та налаштування середовища

Щоб почати вебскрапінг у Scala, потрібно підготувати середовище.

Встановіть Java та Scala

  1. Java: Для Scala потрібен Java Development Kit (JDK). Завантажте найновішу LTS-версію JDK, якщо вона ще не встановлена.
  2. Scala: Завантажте та встановіть Scala 3.x за допомогою Coursier менеджер пакетів.
  3. SBT: The Scala Build Tool (sbt) є необхідним для керування проєктом. Він постачається разом з інсталятором Scala.

Налаштування вашого проєкту Scala

Створіть новий проєкт Scala, виконавши такі кроки:

  1. Перейдіть до каталогу, де хочете створити свій проєкт.
  2. Запустіть таку команду, щоб згенерувати новий шаблон проєкту:
sbt new scala/scala3.g8

Введіть назву проєкту, коли буде запит. Наприклад, назвіть його scala-web-scraper.

Перейдіть до папки проєкту:

cd scala-web-scraper

Import the project into your preferred IDE (e.g., IntelliJ IDEA or Visual Studio Code).

Створення вашого першого вебскрапера

Ми використаємо популярну бібліотеку Scala scala-scraper, щоб створити наш вебскрапер.

Крок 1: Додайте залежності

Edit the build.sbt file and add the following dependency:

libraryDependencies  = "net.ruippeixotog" %% "scala-scraper" % "3.1.1"

Запустіть команду оновлення, щоб установити бібліотеку:

sbt update

Крок 2: Підключення до вебсторінки

In src/main/scala/Main.scala, create a Scala object that retrieves HTML from a webpage.

import net.ruippeixotog.scalascraper.browser.JsoupBrowser
object ScalaScraper {
def main(args: Array[String]): Unit = {
// Initialize the browser
val browser = JsoupBrowser()
// Connect to the webpage
val doc = browser.get("https://www.scrapingcourse.com/ecommerce/")
// Extract and print the HTML source
val html = doc.toHtml
println(html)
}
}

Запустіть проєкт за допомогою:

sbt run

Цей скрипт підключається до сторінки й виводить її HTML-вміст.

Витягування даних із HTML-елементів

To scrape specific elements from the webpage, you can use CSS selectors. Add these imports to your Main.scala file:

import net.ruippeixotog.scalascraper.dsl.DSL._
import net.ruippeixotog.scalascraper.dsl.DSL.Extract._
import net.ruippeixotog.scalascraper.dsl.DSL.Parse._

Тепер зберіть дані про товари з цільової сторінки.

val htmlProductElement = doc >> element("li.product")
val name = htmlProductElement >> text("h2")
val url = htmlProductElement >> element("a") >> attr("href")
val image = htmlProductElement >> element("img") >> attr("src")
val price = htmlProductElement >> text("span")
println(s"Ім’я: $name")
println(s"URL: $url")
println(s"Зображення: $image")
println(s"Ціна: $price")

Scraping Multiple Items

Let’s extract all product elements on the page.

val htmlProductElements = doc >> elementList("li.product")
val products = htmlProductElements.map { element =>
val name = element >> text("h2")
val url = element >> element("a") >> attr("href")
val image = element >> element("img") >> attr("src")
val price = element >> text("span")
Product(name, url, image, price)
}
products.foreach(println)

Оголосіть `Product` case class для зберігання даних:

case class Product(name: String, url: String, image: String, price: String)

Експорт даних у CSV

Щоб зберегти зібрані дані, використайте бібліотеку scala-csv.

Крок 1: Додайте залежність

Add the following to build.sbt:

libraryDependencies  = "com.github.tototoshi" %% "scala-csv" % "1.3.10"

Крок 2: Запис даних до CSV

Використайте CSV writer, щоб експортувати товари:

Implementing Web Crawling

Щоб виконати вебскрапінг кількох сторінок, потрібно переходити за посиланнями пагінації.

Додайте колекції Scala для керування сторінками:

import scala.collection.mutable._
val pagesToScrape = Queue("https://www.scrapingcourse.com/ecommerce/page/1/")
val pagesDiscovered = Set(pagesToScrape.head)
val products = ListBuffer[Product]()

Реалізуйте логіку обходу:

while (pagesToScrape.nonEmpty) {
val page = pagesToScrape.dequeue()
val doc = browser.get(page)
// Extract products from the page
val productElements = doc >> elementList("li.product")
productElements.foreach { element =>
val name = element >> text("h2")
val url = element >> element("a") >> attr("href")
val image = element >> element("img") >> attr("src")
val price = element >> text("span")
products  = Product(name, url, image, price)
}
// Discover new pages
val paginationLinks = doc >> elementList("a.page-numbers")
paginationLinks.foreach { link =>
val nextPage = link >> attr("href")
if (!pagesDiscovered.contains(nextPage)) {
pagesDiscovered  = nextPage
pagesToScrape.enqueue(nextPage)
}
}
}

Вебскрапінг сторінок, згенерованих JavaScript, за допомогою Selenium

Для динамічних сторінок можна використати Selenium для керування headless browser.

Крок 1: Додайте залежність Selenium

Завантажте Selenium і ChromeDriver. Налаштуйте їх у своєму середовищі.

Крок 2: Збирання динамічного контенту

import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
import org.openqa.selenium.By
import scala.jdk.CollectionConverters._
object SeleniumScraper {
def main(args: Array[String]): Unit = {
val options = new ChromeOptions()
options.addArguments(" - headless")
val driver = new ChromeDriver(options)
driver.get("https://scrapingclub.com/exercise/list_infinite_scroll/")
val products = driver.findElements(By.cssSelector(".post")).asScala.map { element =>
val name = element.findElement(By.cssSelector("h4")).getText
val url = element.findElement(By.cssSelector("a")).getAttribute("href")
val image = element.findElement(By.cssSelector("img")).getAttribute("src")
val price = element.findElement(By.cssSelector("h5")).getText
Product(name, url, image, price)
}
products.foreach(println)
driver.quit()
}
}

Avoiding Anti-Bot Measures

Щоб уникнути блокування:

  1. Встановіть реальний User-Agent.
  2. Використовуйте ротаційні проксі разом з інструментами на кшталт Bright Data.
val browser = JsoupBrowser("Mozilla/5.0", Proxy("your-proxy-ip", 8080))

Conclusion

Вітаємо! Ви навчилися виконувати вебскрапінг у Scala, охопивши статичний і динамічний контент. Після цього підручника ви вже розумієте, як налаштувати середовище, витягувати дані, обробляти пагінацію та експортувати результати в CSV. Продовжуйте експериментувати, щоб удосконалювати навички та створювати більш просунуті вебскрапери!

Схожі записи