Вебскрапінг на Scala: покроковий посібник 2026
У цьому посібнику ви дізнаєтеся, як налаштувати свій Scala середовище, витягувати дані зі статичних вебсторінок, обробляти пагінований контент і виконувати вебскрапінг динамічних сайтів за допомогою таких інструментів, як Selenium. Наприкінці ви матимете міцне розуміння технік вебскрапінгу на Scala.
Чому варто обрати Scala для вебскрапінгу?
Scala є практичним вибором для вебскрапінгу завдяки:
- Простий і виразний синтаксис: Її лаконічний синтаксис робить код легким для читання та підтримки.
- Interoperability: Scala може використовувати Java-бібліотеки, як-от Jsoup, Selenium і HtmlUnit.
- Функціональні можливості: Вона підтримує парадигми функціонального програмування, що спрощують завдання з обробки даних.
While Python and Node.js є популярнішими для вебскрапінгу, Scala пропонує унікальний баланс між продуктивністю та гнучкістю.
Вебскрапінг без коду
Якщо ви хочете скрапити сайти без написання коду, раджу звернути увагу на такі платформи:
- Bright Data — скрапер корпоративного рівня з високою масштабованістю та автоматизацією.
- Octoparse — Зручне, гнучке вилучення даних із плануванням.
- ParseHub — Інтуїтивний скрапер із керуванням через натискання для структурованих даних.
- Apify — Хмарний вебскрапінг із попередньо готовими шаблонами та API.
- Вебскрапер — Розширення для браузера для швидкого й простого вебскрапінгу.
Хочете дізнатися більше? Перегляньте повну стаття про no-code вебскрапери. Я не пов’язаний із жодним із провайдерів!
Передумови та налаштування середовища
Щоб почати вебскрапінг у Scala, потрібно підготувати середовище.
Встановіть Java та Scala
- Java: Для Scala потрібен Java Development Kit (JDK). Завантажте найновішу LTS-версію JDK, якщо вона ще не встановлена.
- Scala: Завантажте та встановіть Scala 3.x за допомогою Coursier менеджер пакетів.
- SBT: The Scala Build Tool (sbt) є необхідним для керування проєктом. Він постачається разом з інсталятором Scala.
Налаштування вашого проєкту Scala
Створіть новий проєкт Scala, виконавши такі кроки:
- Перейдіть до каталогу, де хочете створити свій проєкт.
- Запустіть таку команду, щоб згенерувати новий шаблон проєкту:
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
Щоб уникнути блокування:
- Встановіть реальний User-Agent.
- Використовуйте ротаційні проксі разом з інструментами на кшталт Bright Data.
val browser = JsoupBrowser("Mozilla/5.0", Proxy("your-proxy-ip", 8080))
Conclusion
Вітаємо! Ви навчилися виконувати вебскрапінг у Scala, охопивши статичний і динамічний контент. Після цього підручника ви вже розумієте, як налаштувати середовище, витягувати дані, обробляти пагінацію та експортувати результати в CSV. Продовжуйте експериментувати, щоб удосконалювати навички та створювати більш просунуті вебскрапери!

