Zurück zum Blog
Anleitungen
Raluca PenciucLast updated on Mar 31, 20269 min read

Web-Scraping in Ruby: Das ultimative Tutorial

Web-Scraping in Ruby: Das ultimative Tutorial

Machen wir uns nichts vor: Mit jedem Jahr wird das Datenvolumen im Internet weiter steigen. Diese Entwicklung lässt sich von niemandem aufhalten – aber ist das wirklich so schlimm?

Insbesondere in den letzten zehn Jahren hat Web Scraping enorm an Popularität gewonnen. Um in der heutigen Geschäftswelt erfolgreich zu sein, benötigen Unternehmen geeignete Strategien, die eine Fülle von Informationen innerhalb kurzer Zeit erfordern. Außerdem könnte es für Entwickler eine gute Möglichkeit sein, ihre Programmierkenntnisse zu verbessern UND dem Unternehmen zu helfen.

Wenn Sie zum Team Ruby gehören, aber noch nicht viel mit Web Scraping zu tun haben, bietet Ihnen dieser Artikel eine neue Nische, die Sie erkunden können: die Entwicklung Ihres eigenen Web-Scrapers.

Web-Scraping verstehen

Nehmen wir als Beispiel eine Preisvergleichsplattform. Ihre Aufgabe ist es, die Preise einer Vielzahl von Artikeln bei verschiedenen Online-Händlern zu erfassen. Aber warum sollte man sich auf physische Produkte beschränken? Auch die Luftfahrt- und die Hotellerie sind dank Vergleichsseiten viel verbraucherfreundlicher geworden. Wie funktionieren diese magischen Websites oder Apps also? Durch Web Scraping natürlich!

Sie fragen sich jetzt wahrscheinlich: „Wie kann ich diese Daten sonst noch nutzen?“ Schauen wir uns also einige praktische Anwendungsmöglichkeiten von Web-Scraping an:

Dieser gut geschriebene Artikel zum Thema Web Scraping bietet detaillierte Beschreibungen und weitere Anwendungsbeispiele.

Web-Scraper sind nicht einfach zu erstellen, selbst wenn man versteht, wie sie funktionieren und welche potenziellen Vorteile sie bieten können. Es gibt viele Möglichkeiten, wie Websites Bots identifizieren und daran hindern können, auf ihre Daten zuzugreifen.

Hier sind einige Beispiele:

  • Geo-Blocking: Möglicherweise werden Ihnen regionalspezifische Ergebnisse angezeigt, wenn Sie Informationen aus einem anderen Gebiet abfragen (z. B. Flugticketpreise).
  • IP-Blockierung: Eine Website kann Sie blockieren oder verlangsamen, wenn sie feststellt, dass Sie wiederholt Anfragen von einer bestimmten IP-Adresse aus stellen;
  • Honeypots: Menschen können Honeypot-Links nicht sehen, Bots hingegen schon; sobald die Bots in die Falle tappen, wird ihre IP-Adresse blockiert;
  • CAPTCHAs: Menschen können diese einfachen logischen Aufgaben relativ schnell lösen, für Scraper sind sie jedoch oft schwierig;

Es ist keine leichte Aufgabe, all diese Hindernisse zu überwinden. Es ist nicht allzu schwierig, einen einfachen Bot zu erstellen, aber die Entwicklung eines hervorragenden Web-Scrapers ist etwas anspruchsvoller. Daher sind APIs für das Web-Scraping in den letzten zehn Jahren zu einem der heißesten Themen geworden.

HTML-Inhalte von jeder beliebigen Website können mit WebScrapingAPI erfasst werden, und alle zuvor genannten Probleme werden automatisch gelöst. Darüber hinaus nutzen wir Amazon Web Services, um Geschwindigkeit und Skalierbarkeit zu gewährleisten. Klingt interessant, oder? Nun, bleiben Sie nicht nur beim Hören stehen! Probieren Sie es selbst aus mit den 5000 kostenlosen API-Aufrufen, die Sie im Rahmen der kostenlosen WebScrapingAPI-Testversion erhalten.

Das Web verstehen

Um das Web zu verstehen, muss man das Hypertext Transfer Protocol (HTTP) verstehen. Es erklärt, wie ein Server und ein Client miteinander kommunizieren. Eine Nachricht enthält Informationen, die den Client beschreiben und wie er mit Daten umgeht: Methode, HTTP-Version und Header.

Bei HTTP-Anfragen verwenden Web-Scraper die GET-Methode, um Daten vom Server abzurufen. Darüber hinaus gibt es einige fortgeschrittene Methoden wie POST und PUT. Die HTTP-Methoden sind hier zu Ihrer Information detailliert aufgeführt.

In HTTP-Headern finden sich verschiedene zusätzliche Informationen zu Anfragen und Antworten. Für das Web Scraping sind folgende besonders wichtig:

  • User-Agent: Web-Scraper nutzen diesen Header, um ihre Anfragen realistischer erscheinen zu lassen; er enthält Informationen wie Anwendung, Betriebssystem, Software und Version.
  • Cookie: Der Server und die Anfrage können vertrauliche Informationen (wie Authentifizierungstoken) austauschen.
  • Referrer: Enthält die Quelle, die der Nutzer besucht hat; daher ist es wichtig, diesen Umstand zu berücksichtigen.
  • Host: Er identifiziert den Host, mit dem Sie sich verbinden.
  • Accept: Gibt einen Antworttyp für den Server an (z. B. text/plain, application/json).

Ruby verstehen

Ruby ist eine hochrangige, multiparadigmatische Programmiersprache, die zudem vollständig interpretierbar ist. Das bedeutet, dass der Programmcode im Klartext gespeichert ist, der an den Interpreter übermittelt wird, der ihn ausführt.

Im Jahr 1995 kombinierte Yukihiro Matsumoto (in der Ruby-Community auch als Matz bekannt) Merkmale verschiedener Programmiersprachen wie Perl, Lisp und Smalltalk, um eine neue Sprache zu schaffen, deren Schwerpunkt auf Einfachheit und Produktivität liegt.

Es handelt sich um eine Nischen-Programmiersprache, deren natürlicher Anwendungsbereich Webanwendungen sind. Hier sind die wesentlichen Vorteile, von denen Sie bei der Verwendung dieser Sprache in Ihren Projekten profitieren:

  • Sie liefert schnell Ergebnisse. In Kombination mit dem Rails-Framework können Sie Software relativ schnell erstellen; deshalb bevorzugen Start-ups hauptsächlich Ruby, um ihre MVPs (Minimum Viable Product) zügig zu entwickeln.
  • Sie ist gut entwickelt und wird von der wachsenden Ruby-Community gepflegt.
  • Hilfreiche Tools und Bibliotheken (sogenannte Gems) sorgen dafür, dass es in fast jeder Situation einfach ist, die besten Programmierpraktiken zu befolgen.

Andererseits machen diese Vorteile Ruby nicht zu einer magischen Universallösung für jede neue Software. Sie sollten vor einer Entscheidung auch diese Eigenschaften der Sprache berücksichtigen:

  • Mit zunehmender Größe werden mit Ruby erstellte Anwendungen langsamer, was zu Problemen bei der Skalierbarkeit führt.
  • Sein natürlicher Einsatzbereich sind Webanwendungen. Daher eignet es sich nicht gut für Desktop-/Mobil-Anwendungen.
  • Da es einen Interpreter verwendet, wird ein möglicher objektorientierter Code langsamer sein.

Erstellen eines eigenen Web-Scrapers

Nun können wir uns mit der Datenextraktion befassen. Zunächst benötigen wir eine Website, die wertvolle Informationen bereitstellt.

Schritt 1: Einrichten der Umgebung

Um unseren Ruby-Webscraper zu erstellen, müssen wir zunächst sicherstellen, dass alle Voraussetzungen erfüllt sind:

  • Die neueste stabile Version von Ruby: Schau dir die offizielle Installationsanleitung an, um die beste Methode für dein Betriebssystem auszuwählen.
  • Eine IDE: In dieser Anleitung verwenden wir Visual Studio Code, da es ressourcenschonend ist und keine zusätzlichen Konfigurationen erfordert, aber Sie können jede beliebige IDE wählen.
  • Bundler: ein Ruby-Tool zur Abhängigkeitsverwaltung (auch als „Gem“ bezeichnet);
  • Watir: ein Selenium-basiertes Gem für automatisierte Tests, da es das Benutzerverhalten in einem Browser nachahmen kann;
  • Webdrivers: Ein von Watir empfohlenes Gem, das automatisch den neuesten Treiber für eine Browser-Instanz herunterlädt;
  • Nokogiri: Ein Gem, das dafür bekannt ist, die Analyse von Webseiten zu vereinfachen. Es kann HTML und XML parsen, fehlerhafte HTML-Dokumente erkennen und bietet Zugriff auf Elemente über XPath- und CSS3-Selektoren.

Nachdem Sie die Ruby-Umgebung eingerichtet haben, erstellen Sie ein neues Verzeichnis an einem beliebigen Ort auf Ihrem Computer und öffnen Sie es mit der IDE Ihrer Wahl. Führen Sie dann den folgenden Befehl in einem Terminalfenster aus, um unser erstes Gem zu installieren:

> gem install bundler

Erstellen Sie nun eine Datei namens Gemfile im Stammverzeichnis Ihres Projekts. Hier fügen wir die restlichen Gems als Abhängigkeiten hinzu:

source 'https://rubygems.org'

gem 'watir', '~> 6.19', '>= 6.19.1'
gem 'webdrivers', '~> 4.6'
gem 'nokogiri', '~> 1.11', '>= 1.11.7'

Kehren Sie nun zum Terminalfenster zurück und führen Sie den folgenden Befehl aus, um die von uns deklarierten Gems zu installieren:

> bundle install

Tolle Einrichtung! Erstellen Sie zum Schluss einfach eine Datei namens „scraper.rb“, um den Code unseres Web-Scrapers zu speichern. Was auch immer wir hier schreiben, können wir mit dem folgenden Befehl ausführen:

> ruby scraper.rb

Schritt 2: Untersuche die Seite, die du scrapen möchtest

Super, machen wir weiter! Navigiere zu der Seite, die du scrapen möchtest, klicke mit der rechten Maustaste auf eine beliebige Stelle darauf und wähle dann „Element untersuchen“. Die Entwicklerkonsole wird angezeigt, in der du den HTML-Code der Website sehen solltest.

Schritt 3: Sende eine HTTP-Anfrage und scrape den HTML-Code

Um diesen HTML-Code auf unseren lokalen Rechner zu holen, müssen wir nun eine HTTP-Anfrage mit Watir senden, um das Dokument abzurufen. Kehren wir zur IDE zurück und setzen wir diese Idee in Code um.

Schreiben Sie zunächst die benötigten Importe:

require 'watir'
require 'webdrivers'
require 'nokogiri'

Dann initialisieren wir eine Browser-Instanz und navigieren zu der Website, die wir scrapen möchten. Anschließend greifen wir auf den HTML-Code zu und übergeben ihn an den Nokogiri-Konstruktor, der uns dabei hilft, das Ergebnis zu parsen.

browser = Watir::Browser.new
browser.goto 'https://blog.eatthismuch.com/latest-articles/'
parsed_page = Nokogiri::HTML(browser.html)

File.open("parsed.txt", "w") { |f| f.write "#{parsed_page}" }

browser.close

Wir haben das Ergebnis außerdem in eine Textdatei namens „parsed.txt“ geschrieben, um uns den HTML-Code anzusehen. Es ist wichtig, die Verbindung nach Erhalt der Antwort zu schließen, da der Prozess weiterläuft.

Schritt 4: Extrahieren bestimmter Abschnitte

Wir haben also ein HTML-Dokument, wollen aber Daten, was bedeutet, dass wir die vorherige Antwort in für Menschen lesbare Informationen parsen sollten.

Beginnen wir mit kleinen Schritten und extrahieren wir den Titel der Website. Eine bemerkenswerte Eigenschaft von Ruby ist, dass mit wenigen Ausnahmen alles ein Objekt ist, was bedeutet, dass selbst eine einfache Zeichenkette Attribute und Methoden haben kann.

Daher können wir einfach über die Attribute des Objekts `parsed_page` auf den Wert des Website-Titels zugreifen.

puts parsed_page.title

Als Nächstes extrahieren wir alle Links von der Website. Dazu verwenden wir eine allgemeinere Methode, die bestimmte Tags parst: die css-Methode.

links = parsed_page.css('a')
links.map {|element| element["href"]}

puts links

Wir verwenden außerdem die „map“-Methode, um nur die Links mit einem „href“-Attribut aus dem HTML-Code zu behalten.

Nehmen wir ein realistischeres Beispiel. Wir müssen die Artikel aus dem Blog extrahieren, ihren Titel, ihre Adresse und ihre Meta-Beschreibung.

Wenn Sie eine der Artikelkarten untersuchen, sehen Sie, dass wir die Adresse und den Titel des Artikels über die Attribute des Links abrufen können. Außerdem befindet sich die Meta-Beschreibung unter einem <div>-Tag mit einem bestimmten Klassennamen.

Natürlich gibt es viele Möglichkeiten, diese Suche durchzuführen. Die von uns verwendete Methode besteht darin, nach allen <div>-Tags mit dem Klassennamen „td_module_10 zu suchen und dann jedes einzelne davon zu durchlaufen, um die <a>-Tags und die inneren -Tags mit dem Klassennamen „td-excerpt“ zu extrahieren.

article_cards = parsed_page.xpath("//div[contains(@class, 'td_module_10')]")

article_cards.each do |card|
    title = card.xpath("div[@class='td-module-thumb']/a/@title")
    link = card.xpath("div[@class='td-module-thumb']/a/@href")
    meta = card.xpath("div[@class='item-details']/div[@class='td-excerpt']")
end

Ja, wie Sie vielleicht bereits erraten haben, ist ein XPath-Ausdruck der Schlüssel zum Erfolg, da wir nach HTML-Elementen anhand ihrer Klassennamen und ihrer übergeordneten Elemente suchen.

Schritt 5: Exportieren der Daten in CSV

Diese Art der Extraktion kann von Vorteil sein, wenn die Daten an eine andere Anwendung weitergeleitet werden sollen, in unserem Fall an einen Artikel-Aggregator. Dazu müssen wir die geparsten Daten in eine externe Datei exportieren.

Wir erstellen eine CSV-Datei, da diese von einer anderen Anwendung leicht gelesen und zur weiteren Verarbeitung mit Excel geöffnet werden kann. Zunächst noch ein weiterer Import:

require 'csv'

Dann erstellen wir die CSV-Datei im „Append“-Modus und fügen den vorherigen Code ein, sodass unser Scraper nun wie folgt aussieht:

CSV.open("articles.csv", "a+") do |csv|
    csv << ["title", "link", "meta"]

    article_cards = parsed_page.xpath("//div[contains(@class, 'td_module_10')]")
    article_cards.each do |card|

        title = card.xpath("div[@class='td-module-thumb']/a/@title")
        link = card.xpath("div[@class='td-module-thumb']/a/@href")
        meta = card.xpath("div[@class='item-details']/div[@class='td-excerpt']")

        csv << [title.first.value, link.first.value, meta.first.text.strip]
    end
end

Cool, das war’s schon! Jetzt können wir alle geparsten Daten übersichtlich, überschaubar und leicht weiterleitbar anzeigen.

Fazit und Alternativen

Wir haben nun unser Tutorial abgeschlossen. Herzlichen Glückwunsch! Hoffentlich hat Ihnen dieser Artikel viele Informationen zum Thema Web Scraping geliefert und Ihnen geholfen, es besser zu verstehen.

Natürlich kann diese Technologie viel mehr als nur Artikelaggregatoren zu betreiben. Der Schlüssel liegt darin, die richtigen Daten zu finden und sie zu analysieren, um neue Möglichkeiten zu erschließen.

Wie ich jedoch zu Beginn des Artikels erwähnt habe, stehen Web-Scraper vor zahlreichen Herausforderungen. Neben der Förderung Ihres Unternehmens ist es für Entwickler eine großartige Lernmöglichkeit, Probleme mithilfe ihrer eigenen Web-Scraper zu lösen. Dennoch möchten Sie vielleicht Kosten einsparen, wenn Sie ein Projekt abschließen müssen (Zeit, Geld, Personal).

Eine API, die speziell zur Lösung dieser Probleme entwickelt wurde, ist immer einfacher zu nutzen. Selbst wenn Hindernisse wie JavaScript-Rendering, Proxys, CAPTCHAs und andere Blockierungsfaktoren auftreten, überwindet WebScrapingAPI all diese und bietet eine anpassbare Lösung. Wenn Sie noch unsicher sind, probieren Sie doch einfach die kostenlose Testversion aus!

Über den Autor
Raluca Penciuc, Full-Stack-Entwickler @ WebScrapingAPI
Raluca PenciucFull-Stack-Entwickler

Raluca Penciuc ist Full-Stack-Entwicklerin bei WebScrapingAPI. Sie entwickelt Scraper, verbessert Umgehungsstrategien und findet zuverlässige Wege, um die Erkennung auf Zielwebsites zu verringern.

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.