Scala Web Scraping

Веб-скрапинг на Scala: пошаговое руководство 2026

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

Почему стоит выбрать Scala для веб-скрапинга?

Scala — практичный выбор для веб-скрейпинга благодаря:

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

В то время как Python и Node.js Хотя Python и JavaScript более популярны для веб-скрейпинга, Scala предлагает уникальный баланс между производительностью и гибкостью.

Веб-скрейпинг без кода

Если вы хотите собирать данные с сайтов без написания кода, советую взглянуть на эти платформы:

  1. Яркие данные — скрейпер корпоративного уровня с высокой масштабируемостью и автоматизацией.
  2. Octoparse — Удобное и гибкое извлечение данных по расписанию.
  3. ParseHub — Интуитивный скрапер с point-and-click управлением для структурированных данных.
  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: Сайт 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"

Выполните команду `update`, чтобы установить библиотеку:

sbt update

Шаг 2: Подключение к веб-странице

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

импорт net.ruippeixotog.scalascraper.browser.JsoupBrowser
объект ScalaScraper {
def main(args: Array[String]): Unit = {
// Initialize the browser
val browser = JsoupBrowser()
// Connect to the webpage
val doc = browser.получить("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:

импорт net.ruippeixotog.scalascraper.dsl.DSL._
импорт net.ruippeixotog.scalascraper.dsl.DSL.Extract._
импорт 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 продукция = 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)

Определите case class `Product` для хранения данных:

case класс 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 для работы со страницами:

импорт scala.collection.mutable._
val pagesToScrape = Queue("https://www.scrapingcourse.com/ecommerce/page/1/")
val pagesDiscovered = Set(pagesToScrape.head)
val продукция = ListBuffer[Product]()

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

в то время как (pagesToScrape.nonEmpty) {
val страница = 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")
если (!pagesDiscovered.contains(nextPage)) {
pagesDiscovered  = nextPage
pagesToScrape.enqueue(nextPage)
}
}
}

Скрапинг страниц, рендеримых JavaScript, с помощью Selenium

Для динамических страниц можно использовать Selenium для управления headless-браузером.

Шаг 1: Добавьте зависимость Selenium

Скачайте Selenium и ChromeDriver. Настройте их в своей среде.

Шаг 2: Извлеките динамический контент

импорт org.openqa.selenium.chrome.ChromeDriver
импорт org.openqa.selenium.chrome.ChromeOptions
импорт org.openqa.selenium.By
импорт scala.jdk.CollectionConverters._
object SeleniumScraper {
def главная(args: Array[String]): Unit = {
val options = новый ChromeOptions()
options.addArguments(" - headless")
val драйвер = новый ChromeDriver(options)
driver.get("https://scrapingclub.com/exercise/list_infinite_scroll/")
val продукция = 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))

Заключение

Поздравляем! Вы узнали, как выполнять веб-скрейпинг на Scala, работая со статическим и динамическим контентом. Теперь вы понимаете, как настроить окружение, извлекать данные, обрабатывать пагинацию и экспортировать результаты в CSV. Продолжайте экспериментировать, чтобы отточить навыки и создавать более продвинутые скрейперы!

Похожие записи