Startseite BlogWeb-Scraping Web Scraping mit Ruby - Erstellen Sie einen leistungsstarken Scraper in 7 Schritten

Web Scraping mit Ruby - Erstellen Sie einen leistungsstarken Scraper in 7 Schritten

von Kadek

Ruby ist eine Open-Source-Programmiersprache mit einer eleganten und leicht zu lesenden Syntax, die der menschlichen Sprache sehr nahe kommt. Dank des Rails-Frameworks hat sie für die Erstellung von MVPs an Popularität gewonnen.

Da es sich hierbei um eine großartige Technologie handelt, möchten wir unsere Serie über Web-Scraping für Anfänger mit einer Einführung in das Web-Scraping in Ruby mit HTTParty abschließen.

Anmerkung: Auf fortgeschrittenere Tools wie Kimurai werden wir später eingehen, aber wir wollen es jetzt einfach halten.

Dieses Tutorial richtet sich an Anfänger, die gerade erst in die Welt des Web Scraping einsteigen und Daten aus statischen Seiten extrahieren möchten.

In unserem heutigen Beispiel werden wir Schritt für Schritt einen Ruby Scraper erstellen, um Produktnamen, Preise und Links aus einer NewChic-Kleidungskategorie zu extrahieren. Folgen Sie uns, um das Beste aus diesem Tutorial herauszuholen.

1. Installation von Ruby, HTTParty und Nokogiri

Als Erstes müssen wir alle notwendigen Tools installieren, die wir für die Erstellung unseres Scrapers benötigen. Wenn Sie mit einem Mac arbeiten, sollten Sie bereits eine Version von Ruby auf Ihrem Computer installiert haben.

Geben Sie in Ihrem Terminal ruby -v ein und es wird Ihnen angezeigt, welche Version Sie installiert haben.

Bild der Ruby-Installation

Wenn Sie unter Windows arbeiten und noch keine Version von Ruby auf Ihrem Rechner installiert haben, verwenden Sie das Ruby-Installationsprogramm und folgen Sie den Anweisungen.

Wenn Sie mit Ruby fertig sind, wird das Einrichten Ihrer Entwicklungsumgebung viel einfacher sein.

Erstellen Sie ein neues Verzeichnis für das Projekt

Wechseln Sie wieder zu Ihrem Terminal und navigieren Sie zu Ihrem Desktop (cd desktop). Geben Sie dann mkdir ruby_scraper ein, um einen neuen Ordner für das Projekt zu erstellen.

Darin werden wir zwei Dateien erstellen:

  • Eine Gem-Datei: touch Gemfile
  • Unsere Scraper-Datei: touch newchic_scraper.r

Bild einer Ruby Scraper-Datei.

Installieren Sie HTTParty und Nokogiri

Öffnen Sie Ihren Projektordner mit Ihrem bevorzugten Texteditor. In unserem Fall werden wir unseren Ordner in VScode öffnen und dann zu Gemfile wechseln.

Darin fügen wir den folgenden Code ein:

</p>
Quelle "https://rubygems.org/"
gem 'httparty'
gem 'nokogiri'
gem 'byebug'
<p>

Zurück in unserem Terminal geben wir bundle install ein. Das Programm holt automatisch diese drei Edelsteine und fügt sie zu unserem Projekt hinzu, indem es eine Datei Gemfile.lock in dem Verzeichnis erstellt. Zusätzlich zu den bereits erwähnten Edelsteinen haben wir den Byebug-Edelstein für Debugging-Zwecke hinzugefügt.

Da unsere Umgebung nun eingerichtet ist, ist es an der Zeit, zu unserer Zielseite zu navigieren und sich mit ihrer Struktur vertraut zu machen.

2. Verstehen der Seitenstruktur für Web Scraping

Bevor wir mit dem Schreiben unseres Skripts beginnen, ist es wichtig, dass wir wissen, wonach wir suchen und wo. Wenn wir die Website-Struktur unserer Zielseite verstehen, wird es viel einfacher sein, eine Logik zu schreiben, die die gewünschten Ergebnisse liefert.

Wie Sie vielleicht schon wissen, werden Websites aus zwei grundlegenden Bausteinen aufgebaut: HTML und CSS. Dies sind die beiden Elemente, die wir für unseren Scraper verwenden werden.

HyperText Markup Language (HTML) wird verwendet, um Webbrowsern zu beschreiben, wie eine Website angezeigt werden soll. Sie strukturiert den gesamten Inhalt der Website mit Hilfe von Tags, die jedes Element beschreiben.

Werfen wir einen Blick auf den HTML-Code der Kategorieseite für Herrenpullover, indem wir mit der rechten Maustaste darauf klicken und auf inspizieren klicken.

Bild der Webseite für Herren-Kapuzenpullover.

Es öffnet das Entwickler-Tool und zeigt uns die HTML-Datei.

Bild einer HTML-Datei

Wenn wir dieses Tool verwenden, um den Haupttitel der Seite zu untersuchen, können wir sehen, wie er in der HTML angezeigt wird.

Bild einer HTML-Datei, die eine Webseite mit Herren-Kapuzenpullover überlagert.

Der Titel "Kapuzenpullis" ist verpackt in ein <span> HTML-Tag innerhalb einer <div>. Vielleicht haben Sie aber noch etwas anderes bemerkt: ein Klassenattribut.

Die Attribute ID und class werden verwendet, um ein Element innerhalb des HTML-Dokuments zu identifizieren, damit es bei der Anwendung von Stilen, der Implementierung von JavaScript usw. ausgewählt werden kann.

Cascading Style Sheets (CSS) ist eine Sprache, die zur Beschreibung (Gestaltung) von Elementen in einer Auszeichnungssprache wie HTML verwendet wird. Mit anderen Worten, sie teilt dem Browser mit, wie jedes im HTML-Dokument beschriebene Element in Bezug auf Farbe, Größe, Position und mehr aussehen soll, indem die Klasse oder ID der Elemente ausgewählt wird...

Um es einfacher zu machen, schauen wir uns das CSS-Styling unseres Titels an:

Bild des CSS-Stylings.

Die <span> Element, das den Titel umhüllt, hat mehrere Klassen, aber in diesem Beispiel können wir sehen, dass das Newchic-Team die Klassen 'font-size-26' und 'font-bold' verwendet, um das Element auszuwählen und den Stil hinzuzufügen.

Nun gut, aber warum ist das alles so wichtig? Weil wir die genauen Selektoren verwenden können, um unserem Scraper mitzuteilen, welche Elemente er zurückbringen soll und wo sie zu finden sind.

3. Die Auswahl unserer CSS-Selektoren

In diesem Sinne können wir den richtigen CSS-Selektor auf zwei Arten finden. Wir können entweder die Elemente inspizieren, die wir scrapen möchten, und einen Blick auf das HTML-Element im Entwickler-Toolfenster werfen:

Bild eines HTML-Codes, der eine Webseite für Herrenpullover überlagert.

Oder wir können ein Tool wie SelectorGadget verwenden, um uns bei der Auswahl der besten zu helfen.

 Bild der Webseite für Herren-Kapuzenpullover.

Wenn wir auf ein Element klicken, hebt SelectorGadget alle ähnlichen Elemente hervor und zeigt eine Klasse in der Leiste an. Wir können dann auf jedes hervorgehobene Element klicken, das wir nicht haben wollen, bis alle Elemente, die wir scrapen wollen, als einzige gelb sind.

Es scheint also, dass wir für den Produktnamen die Klasse 'product-item-name-js' verwenden können. Da wir das Element zuvor inspiziert haben, können wir außerdem feststellen, dass sich der Link zum Produkt ebenfalls in diesem Tag befindet, so dass wir auch dafür denselben Selektor verwenden.

Für den Preis verwenden wir die Klasse 'product-price-js':

 Bild der Webseite für Herren-Kapuzenpullover.

Wir mussten einige Elemente auswählen und wieder abwählen, weil das Preisschild ähnliche Klassen verwendet wie die Navigationslinks. Auch der Preis mit Rabatt hat andere Klassen (wir wissen auch, dass es die richtige ist, da 120 Elemente ausgewählt wurden, genau wie bei der Klasse Produktname).

Achten Sie immer darauf, dass Sie eine Klasse wählen, die alle Elemente repräsentiert, die Sie scrapen möchten, ohne sie mit anderen Elementen zu vermischen.

Großartig! Wir haben unser Ziel, jetzt müssen wir noch etwas Code in unser newchic_scraper.rg Datei.

4. Senden einer HTTP-Anfrage und Parsen des HTML

Das Wichtigste zuerst. Wir müssen die HTML-Datei herunterladen, um sie zu parsen. Dafür werden wir HTTParty verwenden.

Beginnen wir mit dem Hinzufügen unserer Abhängigkeiten am Anfang unserer Scraper-Datei:

</p>
erfordern 'nokogiri'
require 'httparty'
erfordern 'byebug'
<p>

Lassen Sie uns als nächstes eine neue Methode namens scraper definieren und die HTTP-Anfrage senden:

</p>
def scraper
	url = "https://www.newchic.com/hoodies-c-12200/1.html?newhead=0&amp;mg_id=2&amp;from=nav&amp;country=223&amp;NA=1"
	unparsed_html = HTTParty.get(url)
	Seite = Nokogiri::HTML(unparsed_html)
end
<p>

Hier geschehen einige Dinge. Zunächst haben wir die Ziel-URL zu einer url-Variablen hinzugefügt und diese dann an HTTParty weitergegeben, um die HTTP-Anfrage zu senden. Als Antwort sendet uns der Server die rohe HTML-Datei und speichert sie in der Variable unparsed_html.

Wir können diese Datei jedoch noch nicht parsen. Zunächst müssen wir die unparsed_html an Nokogiri senden, das einen Schnappschuss des HTML in Form einer Reihe von verschachtelten Knoten erstellt, durch die wir mithilfe der CSS-Selektoren, die wir im vorherigen Schritt identifiziert haben, navigieren können.

Testen wir also diese Anfrage mit Byebug. Fügen Sie einfach byebug nach der Variablen page und scraper außerhalb unserer Methode hinzu.

Dann führen wir unseren Scraper über das Terminal aus (ruby newchic_scraper.rb). Mit diesem Befehl wird unser Skript ausgeführt und sobald es auf byebug trifft, können wir mit unseren Variablen interagieren. Auf diese Weise können wir sicherstellen, dass wir die richtigen Daten extrahieren.

Wenn Sie nun eine der Variablen eingeben, können Sie sehen, welche Daten darin gespeichert sind.

Bild der HTML-Codierung.

5. Aufbau eines Ruby-Parsers mit CSS-Selektoren in Nokogiri

Jetzt, da die Antwort auf Nokogiri eingestellt ist, können wir CSS-Selektoren verwenden, um die Knoten zu navigieren und alles Notwendige auszuwählen.

Bevor wir uns in die Datei stürzen, sollten wir unsere Konsole verwenden, um einige der ausgewählten CSS-Selektoren zu testen und zu sehen, was sie zurückgeben.

Testen unserer CSS-Selektoren in der Konsole

Bild von CSS-Selektoren

Lassen Sie uns zunächst alle Titel einer Variablen zuweisen, indem wir hoodies-names = page.css(‘a.product-item-name-js’) in unserem Terminal ein. Dann geben wir hoodies-names.count ein und sollten 120 Produkte zurückbekommen.

Huch! Was ist denn da passiert? Wir hatten 120 Produktnamen ausgewählt, aber jetzt sind es nur noch 60.

Nun, das passiert tatsächlich, weil die erste Anfrage nur 60 Produkte lädt und die Seite die anderen 60 nach dem Scrollen nach unten injiziert - ein Verhalten, das unser derzeitiger Scraper nicht nachahmen kann.

Lassen Sie uns einen Blick auf unsere Ziel-URL werfen:

</p>
https://www.newchic.com/hoodies-c-12200/1.html?newhead=0&mg_id=2&from=nav&country=223&NA=1
<p>

Wenn wir diese Kategorie jedoch direkt vom Browser aus aufrufen, würde die URL eher wie folgt aussehen:

</p>
https://www.newchic.com/hoodies-c-12200/?newhead=0&mg_id=2&from=nav&country=223&NA=1
<p>

Mit anderen Worten: Jede Produktseite wird in einer anderen HTML-Datei gespeichert und dem Benutzer dann dynamisch angezeigt.

Das haben wir entdeckt, als wir mit der oberen Navigation herumgespielt haben.

Anstatt von Seite 1 zu Seite 2 zu gehen, springt die Navigation einige HTML-Dokumente, da auf einer Seite zwei HTML-Dokumente angezeigt werden.

 Bild der NewChic Website.

Mit anderen Worten: Auf der ersten im Browser angezeigten Seite werden die Dateien 1.html und 2.html angezeigt, aber die zweite Datei wird erst ausgelöst, wenn der Benutzer nach unten scrollt.

Da wir wissen, dass wir jede HTML-Datei einzeln ansteuern können, anstatt die Seite, die den Benutzern angezeigt wird. Die 60 Produkte, die in der Variable hoodiesNames gespeichert sind, sind also tatsächlich korrekt!

Für weitere Tests geben Sie hoodiesNames.first ein, um das erste in der Variable gespeicherte Element in der Konsole zu protokollieren.

Bild der HTML-Codierung

Perfekt, es scheint richtig zu funktionieren. Zeit, weiterzumachen!

Schreiben unseres Parsers in der Datei newchic_scraper.rb

Genau wie oben fügen wir eine neue Variable hinzu, die alle 60 Produktlisten enthält. Wir möchten jedoch das Element erhalten, das alle gewünschten Daten enthält.

Mit SelectorGadget können wir sehen, dass jedes Produktangebot ein <div> Element mit der Klasse ‘mb-lg-32’.

 Bild der Webseite für Herren-Kapuzenpullover.

Das ist also das erste Element, auf das wir abzielen, um dann durch jedes Produkt zu iterieren und den Namen, den Preis und den Link zu extrahieren.

</p>
erfordern 'httparty'
require 'nokogiri'
require 'byebug'def scraper
	url = "https://www.newchic.com/hoodies-c-12200/1.html?newhead=0&amp;mg_id=2&amp;from=nav&amp;country=223&amp;NA=1"
	unparsed_html = HTTParty.get(url)
	Seite = Nokogiri::HTML(unparsed_html)
	product_listings = page.css('div.mb-lg-32')
	product_listings.each do |product_listing|
		produkt = {
			Titel: product_listing.css('a.product-item-name-js').text,
			preis: product_listing.css('span.produkt-preis-js').text,
			link: product_listing.css('a')[0].attributes["href"].value
		}
		byebug
	end
endscraper
<p>

Ein paar Dinge hier:

  • Wenn wir unsere CSS-Selektoren in der Konsole testen, wird der gesamte HTML-Code innerhalb des ausgewählten Knotens protokolliert. Um nur den Text zu erfassen (was alles ist, was wir für den Namen und den Preis brauchen), haben wir .text am Ende des Strings verwendet.
  • Wir haben auch den HTML-Tag hinzugefügt, damit unser Scraper die Objekte leichter finden kann und nicht durcheinander kommt.
  • Für den Link wollen wir nicht wirklich den Text (der derselbe ist wie der Titel), also wollen wir, dass unser Scraper stattdessen auf den Wert innerhalb des href-Attributs zugreift.
  • Wir haben den Byebug in unseren Iterator verschoben, um ihn zu debuggen.

Zurück zu unserer Konsole, lassen Sie uns mit dem Byebug fortfahren, um zu unserem Projektverzeichnis zurückzukehren. Dort führen wir unser Skript noch einmal aus. Jetzt haben wir ein Produktobjekt mit allen Daten, die wir zu extrahieren versuchen.

Bild der HTML-Codierung.

Geben Sie exit ein, damit wir jetzt nicht über die 60 Produkte iterieren, und lassen Sie uns weiter an unserem Scraper arbeiten.

Als Nächstes wollen wir all diese Daten in einem Array speichern, um ihnen eine gewisse Struktur oder Ordnung zu geben und die Arbeit damit zu erleichtern.

Fügen Sie nach der Seitenvariablen products = Array.new ein und ersetzen Sie die byebug-Zeile durch products << product, um jede Auflistung in das Array zu verschieben und byebug außerhalb des Iterators für die Fehlersuche zu platzieren.

Wenn es richtig funktioniert, sollte unsere Produktvariable jetzt 60 Produkte enthalten und jedes Produkt sollte den Titel, den Preis und den Link enthalten.

Bild der HTML-Codierung.

Unglaublich! Wir haben alle 60 Produkte, die auf unserer Zielseite aufgelistet sind, aufgespürt.

Mit demselben Verfahren können Sie fast jede beliebige Seite im Internet scrapen (zumindest statische Seiten). Wir können jedoch noch ein wenig weiter gehen.

Lassen wir unseren Nokogiri Scraper zu anderen Seiten navigieren und die restlichen Produktdaten aus dieser Kategorie sammeln.

6. Scraping mehrerer Seiten mit Ruby

Nun, da unser Scraper das Gewünschte extrahiert, können wir die von Newchic verwendete URL-Logik zu unserem Vorteil nutzen.

Aufgrund der begrenzten Möglichkeiten dieses Artikels haben wir eine schnelle - aber etwas umständliche - Lösung gefunden, die aber gerade für diese Website gut funktioniert und uns etwas Zeit spart.

Einstiegs- und Endpunkt festlegen

Erstellen Sie zunächst eine neue Variable namens per_page, um die richtige Anzahl von Produkten zu speichern, die unser Bot auf jeder Seite findet. Wir wissen bereits, dass es 60 sind, aber was ist, wenn sich das in Zukunft ändert? Wir wollen das nicht begrenzen, also machen wir es stattdessen so: per_page = product_listings.count.

Anmerkung: denken Sie daran, dass unsere Variable product_listings zieht alle Produktkarten auf die Seite.

Die nächste Variable ist total. Sie teilt unserem Scraper mit, wie viele Produkte sich insgesamt auf der Website befinden, nämlich 1050 Produkte.

 Bild der Webseite für Herren-Kapuzenpullover.

Fügen Sie außerdem eine Variable mit der ersten Navigationsseite hinzu, die 1 ist (aus 1.html), da wir diese Variable verwenden werden, um die URL zu ändern.

Das Letzte, was wir wollen, ist jedoch, dass unser Scraper die Website unendlich oft aufruft. Daher müssen wir einen Endpunkt in Form von last_navigation = 17 erstellen. Das ist die letzte HTML-Datei in der Kategorie.

Bild der NewChic Website

Das ist natürlich nicht die einzige Möglichkeit, wie wir eine Crawler-ähnliche Funktion für unseren Scraper entwickeln können.

Wir haben zum Beispiel die Gesamtzahl der Produkte und den Endpunkt last_navigation fest kodiert. Wir könnten jedoch jede einzelne Funktion mit einer flexibleren Logik erstellen.

Wir könnten zum Beispiel die Gesamtzahl der Produkte im oberen Bereich abrufen. Das Problem ist, dass die <div> Umschlag, dass die Daten nur durch Klicken ausgelöst werden:

 Bild eines HTML-Codes, der eine Webseite für Herrenpullover überlagert.

Der Versuch, diese Daten mit unserem aktuellen Scraper zu extrahieren, wird nur einen leeren String liefern, da unser Skript nicht wirklich mit der Seite interagiert. Dazu müssten wir ein anderes Tool verwenden.

Wir sagen Ihnen das nicht, um Sie zu entmutigen, sondern um Ihren Geist für die Möglichkeiten zu öffnen!

Einschließen des Iterators in eine While-Schleife

An dieser Stelle haben Sie wahrscheinlich gemerkt, wie einfach Ruby zu lesen ist. Anstatt jedes kleine Detail für die while-Schleife zu erklären, lesen Sie die letzte Version des Codes, um herauszufinden, was wir geändert haben und warum:

</p>
erfordern 'httparty'
require 'nokogiri'
erfordern 'byebug'

def scraper
	url = "https://www.newchic.com/hoodies-c-12200/?newhead=0&amp;mg_id=2&amp;from=nav&amp;country=223&amp;NA=0"
	unparsed_html = HTTParty.get(url)
	Seite = Nokogiri::HTML(unparsed_html)
	Produkte = Array.new
	produkt_auflistungen = page.css('div.mb-lg-32')
	Navigation = 1
	pro_seite = produkt_auflistungen.count
	gesamt = 1050
	letzte_navigation = 17
	while navigation <= last_navigation
		navigation_url = "ttps://www.newchic.com/hoodies-c-12200/{navigation}.html?newhead=0&mg_id=2&from=nav&country=223&NA=1"
		navigation_unparsed_html = HTTParty.get(navigation_url)
		navigation_page = Nokogiri::HTML(navigation_unparsed_html)
		navigation_product_listings = navigation_page.css('div.mb-lg-32')
		navigation_product_listings.each do |product_listing|
			product = {
				title: product_listing.css('a.product-item-name-js').text,
				price: product_listing.css('span.product-price-js').text,
				link: product_listing.css('a')[0].attributes["href"].value
			}
			products &lt; Produkt
		Ende
		Navigation += 1
	end
	byebug
end
scraper
<p>

Wenn wir dies ausführen, extrahiert unser Ruby Scraper 60 Produkte pro Seite, erhöht dann die Zahl in der URL um 1 und greift auf die nächste Seite zu, um den gleichen Prozess durchzuführen, bis er unsere Seite last_navigation erreicht.

Anmerkung: Wir könnten auch einige Puts in den Code einfügen, um zu sehen, was in unserer Konsole passiert, um sicherzustellen, dass es richtig funktioniert.

7. Integration von Ruby Web Scraping mit ScraperAPI für Skalierbarkeit

Wir haben bisher gute Arbeit geleistet und wir hoffen, dass Sie jedes Stückchen Code verstehen, das wir heute geschrieben haben. Dennoch gibt es ein paar Probleme, die wir überwinden müssen.

Wir haben nur siebzehn Seiten von Newchic ausgewertet, was ein eher kleines Projekt ist.

Wenn wir jedoch versuchen, unseren Scraper zu vergrößern und auf mehr Seiten zuzugreifen, wird es nicht lange dauern, bis der Server erkennt, dass es unser Scraper ist, der auf die Seite zugreift, und nicht ein Mensch. Sobald dies geschieht, wird der Server unsere IP-Adresse blockieren und verhindern, dass eine Anfrage durchkommt.

Um dies zu umgehen, müssten wir eine IP-Rotationsfunktion programmieren (um unsere IP-Adresse nach jeder Anfrage zu ändern), Timeouts festlegen, um die Anzahl der Anfragen pro Sekunde und Minute zu verlangsamen, möglicherweise eine Lösung für CAPTCHAs programmieren und mehr.

Tatsächlich senden wir unsere Anfragen von einer lateinamerikanischen IP-Adresse aus, so dass wir alle Ergebnisse auf Spanisch erhalten.

Bild der HTML-Codierung.

Wenn Sie versuchen, Daten über Seiten zu sammeln, die sich abhängig von der Geolokalisierung ändern, müssen Sie auch danach suchen.

Genau dafür ist die ScraperAPI gedacht. Sie nutzt Proxys von Drittanbietern, maschinelles Lernen und jahrelange statistische Analysen, um Ihren Scraper praktisch unauffindbar zu machen.

Alles, was wir tun müssen, ist, unsere Anfrage über die ScraperAPI zu senden und ein paar Parameter zu setzen, um der ScraperAPI mitzuteilen, was wir brauchen.

</p>
http://api.scraperapi.com?api_key={API_key}&url=https://www.newchic.com/hoodies-c-12200/{navigation}.html?newhead=0&mg_id=2&from=nav&country=223&NA=1&country_code=us
<p>

In Weiß sehen Sie die neuen Zeilen, die wir in der navigation_url Wert, und schon haben wir unserem Scraper ohne zusätzlichen Code oder Arbeit bessere Funktionen hinzugefügt.

 Bild der HTML-Codierung.

Um Ihren API-Schlüssel zu erhalten, melden Sie sich einfach für ein kostenloses ScraperAPI-Konto an. Sie erhalten 5000 kostenlose API-Credits und alle Pro-Funktionen für eine Woche (danach erhalten Sie 1000 kostenlose Credits pro Monat).

In Ihrem Dashboard finden Sie Ihren API-Schlüssel, Code-Schnipsel, die Sie kopieren und in Ihr Projekt einfügen können, und Ihren monatlichen Aufrufbericht.

Alles, was Sie mit ScraperAPI tun können, finden Sie auch in unserer umfangreichen Dokumentation.

Zusammenfassung und andere Web Scraping Ressourcen

Wir hoffen, dass Ihnen dieses Ruby-Tutorial für Anfänger gefallen hat. Es hat Spaß gemacht, es zu schreiben!

Beim Web Scraping geht es vor allem ums Üben. Jede Website ist ein anderes Rätsel, bei dem man über den Tellerrand hinausschauen muss. Der beste Weg, dieses Handwerk zu erlernen und zu beherrschen, ist das Lesen und Erstellen von Projekten.

Um Ihnen dabei zu helfen, finden Sie hier die besten Ressourcen zum Thema Web Scraping für Anfänger:

Viel Spaß beim Schaben!

Verwandte Beiträge

Einen Kommentar hinterlassen