Веб-скрапинг на Scala: пошаговое руководство 2026
В этом руководстве вы узнаете, как настроить Scala В этой среде вы сможете извлекать данные из статических веб-страниц, работать с пагинированным контентом и собирать данные с динамических сайтов с помощью таких инструментов, как Selenium. В итоге вы хорошо освоите техники веб-скрейпинга на Scala.
Почему стоит выбрать Scala для веб-скрапинга?
Scala — практичный выбор для веб-скрейпинга благодаря:
- Простой и выразительный синтаксис: Лаконичный синтаксис Scala делает код легко читаемым и удобным для сопровождения.
- Interoperability: Scala может использовать Java-библиотеки, такие как Jsoup, Selenium и HtmlUnit.
- Функциональные возможности: Scala поддерживает парадигмы функционального программирования, которые упрощают задачи обработки данных.
В то время как Python и Node.js Хотя Python и JavaScript более популярны для веб-скрейпинга, Scala предлагает уникальный баланс между производительностью и гибкостью.
Веб-скрейпинг без кода
Если вы хотите собирать данные с сайтов без написания кода, советую взглянуть на эти платформы:
- Яркие данные — скрейпер корпоративного уровня с высокой масштабируемостью и автоматизацией.
- Octoparse — Удобное и гибкое извлечение данных по расписанию.
- ParseHub — Интуитивный скрапер с point-and-click управлением для структурированных данных.
- Apify — облачный скрейпинг с готовыми шаблонами и API.
- Веб-скрапер — Браузерное расширение для быстрого и простого веб-скрейпинга.
Хотите узнать больше? Посмотрите полное статья о no-code веб-скрейперах. Я не связан ни с одним из провайдеров!
Требования и настройка окружения
Чтобы начать скрейпинг на Scala, нужно подготовить окружение.
Установите Java и Scala
- Java: Для работы со Scala требуется Java Development Kit (JDK). Скачайте последнюю LTS-версию JDK, если она у вас еще не установлена.
- Scala: Скачайте и установите Scala 3.x с помощью Coursier менеджер пакетов.
- SBT: Сайт 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"
Выполните команду `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
Чтобы избежать блокировки:
- Задайте реалистичный User-Agent.
- Используйте ротационные прокси с такими сервисами, как Bright Data.
val browser = JsoupBrowser("Mozilla/5.0", Proxy("your-proxy-ip", 8080))
Заключение
Поздравляем! Вы узнали, как выполнять веб-скрейпинг на Scala, работая со статическим и динамическим контентом. Теперь вы понимаете, как настроить окружение, извлекать данные, обрабатывать пагинацию и экспортировать результаты в CSV. Продолжайте экспериментировать, чтобы отточить навыки и создавать более продвинутые скрейперы!

