---
title: "Web Scraping mit Scala und jsoup im Jahr 2026"
slug: web-scraping-with-scala
date: 2025-06-09T08:03:51+00:00
modified: 2025-11-04T08:49:37+00:00
permalink: https://brightdata.de/blog/web-data-de/web-scraping-with-scala
type: blog
---

[ Blog ](https://brightdata.de/blog "Blog") / [Web Data](https://brightdata.de/blog/web-data-de)







 [Web Data](https://brightdata.de/blog/web-data-de)

# Web Scraping mit Scala und jsoup im Jahr 2026

Entdecken Sie effiziente Techniken zur Extraktion dynamischer Pinterest-Daten mit Playwright und Scraper-APIs für schnelles, skalierbares Web-Scraping.

 8 min lesen





 [ ![Jacob Nulty](https://media.brightdata.de/2024/12/Jacob-Nulty-50x50.jpg) ](https://brightdata.com/blog/authors/jake-nulty)

 [Jake Nulty

Technical Writer

 ](https://brightdata.com/blog/authors/jake-nulty)





 ![Web Scraping With Scala blog image](https://media.brightdata.de/2025/02/Web-Scraping-With-Scala.svg)





Python und JavaScript dominieren die gesamte Scraping-Industrie. Wenn Sie Leistung oder Portabilität benötigen, bietet Scala eine starke Alternative. Scala bietet uns eine kompilierte, portable und stark typisierte Grundlage, mit der wir arbeiten können.

Heute gehen wir darauf ein, wie man mit Scala und [jsoup](/blog/wie/web-scraping-with-jsoup) scrapen kann. Obwohl darüber nicht so oft geschrieben wird wie über [Web-Scraping mit Python](/blog/wie/web-scraping-with-python), bietet Scala eine solide Grundlage und anständige Scraping-Tools.

## <a></a>Warum Scala?

Es gibt eine ganze Reihe von Gründen, warum Sie sich für Scala statt für Python oder JavaScript entscheiden könnten.

- **Leistung**: Scala wird mit der JVM (Java Virtual Machine) kompiliert. Compiler übersetzen unseren Code in maschinenausführbaren Bytecode. Das macht es von Natur aus schneller als Python.
- **Statische Typisierung**: Die Typüberprüfung bietet eine zusätzliche Sicherheitsebene. Viele häufige Fehler werden abgefangen, bevor das Programm überhaupt ausgeführt wird.
- **Portabilität**: Scala wird zu JVM (Java Virtual Machine) Bytecode kompiliert. JVM-Bytecode kann überall dort ausgeführt werden, wo Java installiert ist.
- **Vollständige Kompatibilität mit Java**: Sie können Java-Abhängigkeiten in Ihrem Scala-Code verwenden. Dadurch wird das Ihnen zur Verfügung stehende Ökosystem erheblich erweitert.

## <a></a>Erste Schritte

Bevor Sie loslegen, müssen Sie sicherstellen, dass Sie Scala installiert haben. Wir haben unten eine Anleitung für Ubuntu, macOS und Windows.

Die vollständige Dokumentation zur Installation können Sie [hier](https://docs.scala-lang.org/getting-started/install-scala.html) einsehen.

#### <a></a>Ubuntu

```none
curl -fL https://github.com/coursier/coursier/releases/latest/download/cs-x86_64-pc-linux.gz | gzip -d > cs && chmod +x cs && ./cs setup

```

#### <a></a>macOS

```none
brew install coursier && coursier setup

```

#### <a></a>Windows

Laden Sie das [Scala-Installationsprogramm für Windows](https://github.com/coursier/coursier/releases/latest/download/cs-x86_64-pc-win32.zip) herunter.

## <a></a>Erstellen eines Scrapers

Legen Sie einen neuen Projektordner an und `wechseln` Sie in diesen Ordner.

```none
mkdir quote-scraper
cd quote-scraper

```

Initialisieren Sie ein neues Scala-Projekt. Der Befehl konvertiert unseren neuen Ordner in ein Scala-Projekt und erstellt eine `build.sbt-Datei`, die unsere Abhängigkeiten enthält.

```none
sbt new scala/scala3.g8

```

Öffnen Sie nun die `Datei build.sbt`. Sie müssen jsoup als eine Abhängigkeit hinzufügen. Ihre vollständige Build-Datei sollte wie folgt aussehen.

```none
val scala3Version = "3.6.3"

lazy val root = project
  .in(file("."))
  .settings(
    name := "quote-scraper",
    version := "0.1.0-SNAPSHOT",

    scalaVersion := scala3Version,

    libraryDependencies += "org.scalameta" %% "munit" % "1.0.0" % Test,

    libraryDependencies += "org.jsoup" % "jsoup" % "1.18.3"
  )

```

Kopieren Sie dann den folgenden Code und fügen Sie ihn in Ihre Datei `Main.scala` ein.

```none
import org.jsoup.Jsoup
import scala.jdk.CollectionConverters._

@main def QuotesScraper(): Unit =
  val url = "http://quotes.toscrape.com"

  try
    val document = Jsoup.connect(url).get()
    //find all objects on the page with the quote class
    val quotes = document.select(".quote")

    for quote <- quotes.asScala do
      //find the first object with the class "text" and return its text
      val text = quote.select(".text").text()
      //find the first object with the class "author" and return its text
      val author = quote.select(".author").text()
      println(s"Quote: $text")
      println(s"Author: $author")
      println("-" * 50)

  catch case e: Exception => println(s"Error: ${e.getMessage}")

```

### <a></a>Betrieb des Abstreifers

Um unseren Scraper zu starten, führen Sie den folgenden Befehl im Stammverzeichnis des Projekts aus.

```none
sbt run

```

Sie sollten eine ähnliche Ausgabe wie die folgende sehen.

```none
Quote: “The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
Author: Albert Einstein
--------------------------------------------------
Quote: “It is our choices, Harry, that show what we truly are, far more than our abilities.”
Author: J.K. Rowling
--------------------------------------------------
Quote: “There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”
Author: Albert Einstein
--------------------------------------------------
Quote: “The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”
Author: Jane Austen
--------------------------------------------------
Quote: “Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”
Author: Marilyn Monroe
--------------------------------------------------
Quote: “Try not to become a man of success. Rather become a man of value.”
Author: Albert Einstein
--------------------------------------------------
Quote: “It is better to be hated for what you are than to be loved for what you are not.”
Author: André Gide
--------------------------------------------------
Quote: “I have not failed. I've just found 10,000 ways that won't work.”
Author: Thomas A. Edison
--------------------------------------------------
Quote: “A woman is like a tea bag; you never know how strong it is until it's in hot water.”
Author: Eleanor Roosevelt
--------------------------------------------------
Quote: “A day without sunshine is like, you know, night.”
Author: Steve Martin
--------------------------------------------------
[success] Total time: 6 s, completed Feb 18, 2026, 8:58:04 PM

```

## <a></a>Auswahl mit jsoup

Um Seitenelemente mit jsoup zu finden, verwenden wir die Methode `select()`. `select()` gibt eine Liste aller Elemente zurück, die unserem Selektor entsprechen. Schauen wir uns an, wie dies in unserem Quote Scraper-Projekt funktioniert.

In dieser Zeile verwenden wir `document.select(".quote")`, um alle Seitenelemente mit der `Klasse` ” `quote"` zurückzugeben.

```none
val quotes = document.select(".quote")

```

Wir könnten diese Selektoren auch mit mehr Struktur schreiben: `element[attribute='some value']`. Dies ermöglicht uns, bei der Suche nach Objekten auf der Seite stärkere Filter anzuwenden.

Die folgende Zeile würde immer noch dieselben Seitenobjekte zurückgeben, ist aber viel aussagekräftiger.

```none
val quotes = document.select("div[class='quote']")

```

Schauen wir uns ein paar andere Beispiele für `select()` in unserem Code an. Da es in jedem Zitat nur ein `Textelement` und einen `Autor` gibt, gibt `select()` nur ein Textobjekt und einen Autor zurück. Wenn unser Zitat-Element mehrere Texte oder Autoren enthielte, würde es alle Texte und Autoren für jedes Zitat zurückgeben.

```none
//find objects with the class "text" and return their text
val text = quote.select(".text").text()
//find objects with the class "author" and return their text
val author = quote.select(".author").text()

```

## <a></a>Extraktion mit jsoup

Um Daten mit jsoup zu extrahieren, können wir die folgenden Methoden verwenden:

- `text()`: Extrahiert den Text aus einer Liste von Seitenelementen. Wenn Sie Preise von einer Website auslesen, werden sie auf der Seite als Text angezeigt.
- `attr()`: Extrahiert ein bestimmtes Attribut aus einem einzelnen Seitenelement. Dies sind Daten, die sich innerhalb der HTML-Tags befinden. Diese Methode wird üblicherweise verwendet, um Links aus einer Website zu extrahieren.

### <a></a>text()

Wir haben Beispiele dafür in unserem ersten Scraper gesehen. `text()` gibt den Text aller Elemente zurück, für die wir sie aufrufen. Wenn das folgende Beispiel zwei Autoren finden sollte, würde `text()` beide Texte extrahieren und zu einer einzigen Zeichenkette kombinieren.

```none
//find objects with the class "text" and return their text
val text = quote.select(".text").text()
//find objects with the class "author" and return their text
val author = quote.select(".author").text()

```

### <a></a>attr()

Die Methode `attr()` verhält sich anders als `text()`. Diese Methode extrahiert ein einzelnes Attribut aus einem einzelnen Seitenelement.

```none
//find link elements with the class "tag" and extract the "href" from the first one
val firstTagLink = quote.select("a[class='tag']").attr("href")

```

Nach dem Hinzufügen dieser Zeile sieht unsere Ausgabe nun wie folgt aus.

```none
Quote: “The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
Author: Albert Einstein
First Tag Link: /tag/change/page/1/
--------------------------------------------------
Quote: “It is our choices, Harry, that show what we truly are, far more than our abilities.”
Author: J.K. Rowling
First Tag Link: /tag/abilities/page/1/
--------------------------------------------------
Quote: “There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”
Author: Albert Einstein
First Tag Link: /tag/inspirational/page/1/
--------------------------------------------------
Quote: “The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”
Author: Jane Austen
First Tag Link: /tag/aliteracy/page/1/
--------------------------------------------------
Quote: “Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”
Author: Marilyn Monroe
First Tag Link: /tag/be-yourself/page/1/
--------------------------------------------------
Quote: “Try not to become a man of success. Rather become a man of value.”
Author: Albert Einstein
First Tag Link: /tag/adulthood/page/1/
--------------------------------------------------
Quote: “It is better to be hated for what you are than to be loved for what you are not.”
Author: André Gide
First Tag Link: /tag/life/page/1/
--------------------------------------------------
Quote: “I have not failed. I've just found 10,000 ways that won't work.”
Author: Thomas A. Edison
First Tag Link: /tag/edison/page/1/
--------------------------------------------------
Quote: “A woman is like a tea bag; you never know how strong it is until it's in hot water.”
Author: Eleanor Roosevelt
First Tag Link: /tag/misattributed-eleanor-roosevelt/page/1/
--------------------------------------------------
Quote: “A day without sunshine is like, you know, night.”
Author: Steve Martin
First Tag Link: /tag/humor/page/1/
--------------------------------------------------
[success] Total time: 3 s, completed Feb 18, 2026, 10:29:30 PM

```

## <a></a>Alternative Web Scraping Tools

- [Scraping-Browser](/products/scraping-browser): Ein vollständig integrierter Remote-Browser mit Proxys, den Sie von [Playwright und Selenium](/blog/web-data-de/playwright-vs-selenium) aus verwenden können.
- [Web Scraper APIs](/products/web-scraper): Automatisieren Sie Ihren Scraping-Prozess, indem Sie eine unserer APIs aufrufen. Wenn Sie eine Scraper-API aufrufen, scrapen wir eine Website und senden die Daten an Sie zurück.
- [Kein Code Scraper](/products/web-scraper/no-code): Sagen Sie uns, welche Website Sie scrapen möchten und welche Daten Sie benötigen. Wir kümmern uns um den Rest.
- [Datensätze](/products/datasets): Unsere Datensätze sind vielleicht die einfachste aller Extraktionsmethoden. Wir scrapen Hunderte von Websites und aktualisieren unsere Datenbanken ständig. Mit Datensätzen erhalten Sie einen sauberen Satz von Daten, der für die Analyse bereit ist.

## <a></a>Schlussfolgerung

Web Scraping ist mit Scala ziemlich intuitiv. Sie haben gelernt, wie man Seitenelemente auswählt und ihre Daten mit [jsoup](/blog/web-data-de/parse-html-with-jsoup) extrahiert. Wenn Scraping nicht Ihr Ding ist, können Sie jederzeit eines unserer automatisierten Tools verwenden, um den Prozess zu begleiten, oder den Scraping-Prozess mit unseren gebrauchsfertigen Datensätzen komplett überspringen.

Melden Sie sich jetzt an und starten Sie noch heute Ihre kostenlose Testversion!



Vertrieb kontaktierenGratis testen![google social icon](/wp-content/themes/brightdata/assets/images/ic_google.svg)









 Inhaltsverzeichnis







Dedicated Scraper APIs &amp; No-Code Scrapers

Over 1000 scrapers for all popular domains. Simplify your web scraping.

[See pricing](/pricing/web-scraper "See pricing")

Just want data? Skip scraping.

Hundreds of ready-to-use datasets from all popular domains.

[See pricing](/pricing/datasets "See pricing")







 [ ](https://news.ycombinator.com/submitlink?t=Web+Scraping+mit+Scala+und+jsoup+im+Jahr+2026&u=https://brightdata.de/blog/web-data-de/web-scraping-with-scala) [ ](https://www.linkedin.com/shareArticle?mini=true&title=Web+Scraping+mit+Scala+und+jsoup+im+Jahr+2026&url=https://brightdata.de/blog/web-data-de/web-scraping-with-scala) [ ](http://www.reddit.com/submit?title=Web+Scraping+mit+Scala+und+jsoup+im+Jahr+2026&url=https://brightdata.de/blog/web-data-de/web-scraping-with-scala)







##  Das könnte Sie auch interessieren

 [ ![Web Scraping with GLM](https://media.brightdata.de/2026/09/Web-Scraping-with-GLM.png) ](https://brightdata.de/blog/ai/web-scraping-with-glm "Web-Scraping mit GLM: Text- und visuelle Datenextraktion")

 [AI



 ![Antonello Zanini](https://media.brightdata.de/2022/12/Antonello-Zanini-2-50x50.jpg)

Antonello Zanini

Technical Writer





### Web-Scraping mit GLM: Text- und visuelle Datenextraktion

Verwenden Sie GLM-5.3 mit Bright Datas Web Unlocker für KI-gestütztes Web-Scraping. Extrahieren Sie automatisch Text- und visuelle Daten und umgehen Sie gängige Hindernisse.



 16-Sep-2026

 5 min lesen

 ](https://brightdata.de/blog/ai/web-scraping-with-glm)

 [ ![Containers as a Service (CaaS)](https://media.brightdata.de/2026/09/Container-as-a-Service.png) ](https://brightdata.de/blog/web-data-de/containers-as-a-service "Containers as a Service (CaaS): So nutzen Sie es für Web-Datenpipelines und KI-Agenten")

 [Web Data



 ![Antonello Zanini](https://media.brightdata.de/2022/12/Antonello-Zanini-2-50x50.jpg)

Antonello Zanini

Technical Writer





### Containers as a Service (CaaS): So nutzen Sie es für Web-Datenpipelines und KI-Agenten

Wie Containers as a Service funktioniert und wie eine Bright Data Web-Scraping-Pipeline für KI-Agenten containerübergreifend skaliert wird.



 16-Sep-2026

 13 min lesen

 ](https://brightdata.de/blog/web-data-de/containers-as-a-service)

 [ ![Cursor + Bright Data vs a default coding agent setup](https://media.brightdata.de/2026/09/Cursor-Bright-Data-vs-a-default-coding-agent-setup.png) ](https://brightdata.de/blog/ai/cursor-bright-data-vs-default-coding-agent "Cursor + Bright Data vs. ein Standard-Coding-Agent-Setup: Aufbau eines echten Preis-Trackers")

 [AI



 ![Satyam Tripathi](https://media.brightdata.de/2024/09/Satyam-Tripathi-50x50.png)

Satyam Tripathi

Technical Writer





### Cursor + Bright Data vs. ein Standard-Coding-Agent-Setup: Aufbau eines echten Preis-Trackers

Eine Preis-Tracker-Aufgabe, 41 eingefrorene Retailer-Seiten, zwei Coding-Agents, gleicher Prompt und gleiches Modell. Mit Bright Data’s MCP darunter: 89% Feldgenauigkeit und 40 von 41 gelesenen Seiten. Ohne: 72% und 34.



 16-Sep-2026

 27 min lesen

 ](https://brightdata.de/blog/ai/cursor-bright-data-vs-default-coding-agent)
