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 scrapen kann. Obwohl darüber nicht so oft geschrieben wird wie über Web-Scraping mit Python, bietet Scala eine solide Grundlage und anständige Scraping-Tools.
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.
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 einsehen.
Ubuntu
curl -fL https://github.com/coursier/coursier/releases/latest/download/cs-x86_64-pc-linux.gz | gzip -d > cs && chmod +x cs && ./cs setup
macOS
brew install coursier && coursier setup
Windows
Laden Sie das Scala-Installationsprogramm für Windows herunter.
Erstellen eines Scrapers
Legen Sie einen neuen Projektordner an und wechseln
Sie in diesen Ordner.
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.
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.
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.
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}")
Betrieb des Abstreifers
Um unseren Scraper zu starten, führen Sie den folgenden Befehl im Stammverzeichnis des Projekts aus.
sbt run
Sie sollten eine ähnliche Ausgabe wie die folgende sehen.
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, 2025, 8:58:04 PM
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.
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.
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.
//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()
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.
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.
//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()
attr()
Die Methode attr()
verhält sich anders als text()
. Diese Methode extrahiert ein einzelnes Attribut aus einem einzelnen Seitenelement.
//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.
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, 2025, 10:29:30 PM
Alternative Web Scraping Tools
- Scraping-Browser: Ein vollständig integrierter Remote-Browser mit Proxys, den Sie von Playwright und Selenium aus verwenden können.
- Web Scraper APIs: 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: Sagen Sie uns, welche Website Sie scrapen möchten und welche Daten Sie benötigen. Wir kümmern uns um den Rest.
- Datensätze: 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.
Schlussfolgerung
Web Scraping ist mit Scala ziemlich intuitiv. Sie haben gelernt, wie man Seitenelemente auswählt und ihre Daten mit 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!
Keine Kreditkarte erforderlich