Zurück zum Blog
Anleitungen
Mihnea-Octavian ManolacheLast updated on Mar 31, 20269 min read

So verwenden Sie CURL mit Python zum Web-Scraping

So verwenden Sie CURL mit Python zum Web-Scraping

Die grundlegendste Aufgabe jeder Web-Scraping-Anwendung besteht darin, zunächst die HTML-Datei abzurufen und sich erst danach auf deren Bearbeitung zu konzentrieren. Natürlich gibt es verschiedene Möglichkeiten, dies zu erreichen. Im heutigen Artikel werden wir jedoch herausfinden, wie man CURL mit Python für einen Web-Scraper einsetzt. Hier ist ein kleiner Vorgeschmack auf nur einen Bruchteil dessen, was Sie nach der Lektüre dieses Artikels lernen werden:

  • Was ist cURL und wie greift man über die Befehlszeile darauf zu?
  • Wie man den cURL-Befehl verwendet, um Informationen von einer beliebigen Website zu sammeln
  • Wie man cURL in Python verwendet, um einen einfachen Web-Scraper zu erstellen

Wie verwendet man cURL mit Python?

Kurz gesagt ist cURL in erster Linie ein Befehlszeilentool, das zum Abrufen von Daten von einem Server verwendet wird. Ich weiß, dass es kompliziert klingen mag, wenn von der Befehlszeile die Rede ist. Ich kann Ihnen jedoch versichern, dass cURL in der Praxis – wie Sie im Laufe dieses Artikels feststellen werden – vielleicht eines der einfachsten Tools ist, die Sie als Programmierer jemals verwenden werden.

Um cURL über die Befehlszeile zu verwenden, öffnen Sie einfach ein neues Terminalfenster und geben Sie `curl` gefolgt von der URL ein, die Sie scrapen möchten. Zum Beispiel:

~ » curl 'https://api.ipify.org?format=json'

Dieser einfache Befehl greift auf die API von ipify zu und fordert Informationen vom Server an, genau wie es ein herkömmlicher Browser tun würde. Die Ausgabe dieses Beispiels ist ein JSON-Objekt, das Ihre IP-Adresse enthält. Auch wenn es vielleicht nicht so aussieht, haben Sie gerade die Infrastruktur für einen zukünftigen Web-Scraper aufgebaut. Und das alles mit nur einer einzigen Codezeile.

cURL ist eigentlich ein fortgeschritteneres Tool. Wenn du mehr über die Verwendung von curl erfahren möchtest, kannst du die offizielle Dokumentation durchlesen. Du kannst auch den Schalter `--help` verwenden und dich über die verschiedenen verfügbaren Optionen informieren. 

So verwenden Sie cURL zum Abrufen von HTML-Dateien

Im obigen Beispiel war die Antwort, die wir vom ipify-Server erhalten haben, eine JSON-Datei. Das liegt daran, dass dieser spezielle API-Endpunkt Daten im JSON-Format zurückgibt. Beim Web-Scraping stößt man in der Regel auf herkömmliche Websites, die HTML-Dateien bereitstellen, die man dann parsen und aus denen man Daten extrahieren muss.

Unser Fokus liegt jedoch vorerst nicht auf der Datenbearbeitung, sondern auf der Datenextraktion. Und wir wissen, dass wir cURL zum Scrapen von Websites verwenden können, aber wie machen wir das konkret? Nun, falls du es noch nicht aus Neugier ausprobiert hast, lass cURL einfach auf eine beliebige generische URL zugreifen, von der du weißt, dass es sich um eine herkömmliche HTML-basierte Website handelt. Nehmen wir als Beispiel httpbin.org:

curl 'https://httpbin.org/forms/post'

Geben Sie diesen Befehl in Ihr Terminal ein, und Sie erhalten den reinen HTML-Code als Antwort:

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
  <!-- Example form from HTML5 spec http://www.w3.org/TR/html5/forms.html#writing-a-form's-user-interface -->
  <form method="post" action="/post">
   <p><label>Customer name: <input name="custname"></label></p>
   <p><label>Telephone: <input type=tel name="custtel"></label></p>
   <p><label>E-mail address: <input type=email name="custemail"></label></p>
   <fieldset>
    <legend> Pizza Size </legend>
    <p><label> <input type=radio name=size value="small"> Small </label></p>
    <p><label> <input type=radio name=size value="medium"> Medium </label></p>
    <p><label> <input type=radio name=size value="large"> Large </label></p>
   </fieldset>
   <fieldset>
    <legend> Pizza Toppings </legend>
    <p><label> <input type=checkbox name="topping" value="bacon"> Bacon </label></p>
    <p><label> <input type=checkbox name="topping" value="cheese"> Extra Cheese </label></p>
    <p><label> <input type=checkbox name="topping" value="onion"> Onion </label></p>
    <p><label> <input type=checkbox name="topping" value="mushroom"> Mushroom </label></p>
   </fieldset>
   <p><label>Preferred delivery time: <input type=time min="11:00" max="21:00" step="900" name="delivery"></label></p>
   <p><label>Delivery instructions: <textarea name="comments"></textarea></label></p>
   <p><button>Submit order</button></p>
  </form>
  </body>
</html>

So verwenden Sie cURL in Python

Wie du gesehen hast, ist das Extrahieren von Daten mit cURL eine unkomplizierte Lösung und erfordert keine eigentliche Programmierung. Es geht lediglich darum, einen Befehl zu senden und einige Informationen zu erhalten. Wenn du ein echtes Web-Scraping-Projekt erstellen möchtest, musst du die gesammelten Daten irgendwie nutzen. Und da wir Programmierer sind, wollen wir die Daten programmgesteuert bearbeiten. Hier kommt Python ins Spiel.

Warum Python für ein Web-Scraping-Projekt wählen

Zweifellos ist Python eine der beliebtesten Programmiersprachen. Es ist nicht nur sehr leistungsstark, sondern eignet sich dank seiner einfachen Syntax auch perfekt für Programmieranfänger. Außerdem verfügt es über eine großartige Community, die immer bereit ist, einzusteigen und zu helfen. Wenn du also irgendwann auf ein Problem stößt und nicht weiterkommst, zögere nicht, beispielsweise auf Stackoverflow eine Frage zu stellen, und jemand wird dir sicher helfen. 

Insbesondere beim Web-Scraping ist Python aufgrund der vielen mitgelieferten Pakete eine hervorragende Wahl. Wie du später in diesem Artikel sehen wirst, erfordert die Datenbearbeitung das Parsen der HTML-Dateien, damit du anschließend die Elemente „auswerten“ und nur die Informationen extrahieren kannst, die du von dieser bestimmten Webseite benötigst.

Web-Scraping mit cURL und Python

Bisher haben wir gelernt, wie man cURL im Terminal verwendet, aber wie integrieren wir es tatsächlich in Python? Nun, es gibt tatsächlich mehrere Möglichkeiten, wie du dies angehen kannst. Du könntest zum Beispiel das Python-Modul `os` verwenden und Terminalbefehle senden:

import os
curl = os.system(f'curl "https://httpbin.org/forms/post"')
print(curl)

Oder Sie können sogar eine eigene Funktion darum herum erstellen und diese im gesamten Projekt verwenden:

import os
def curl(website):
return os.system(f'curl "{website}"')

print(curl('https://httpbin.org/forms/post'))

Wie ich jedoch bereits sagte, ist eine der größten Stärken von Python die Vielfalt seiner Pakete. Da cURL viel vielfältiger ist, müsste unsere Funktion wesentlich komplexer sein, um all seine Funktionen abzudecken. Anstatt also das Rad neu zu erfinden, empfehle ich, ein bestehendes Paket für die cURL-Integration in Python zu verwenden: PycURL.

Was ist PycURL und wie installiert man es?

Laut der Website ist PycURL eine Schnittstelle zur cURL-Bibliothek und übernimmt somit alle Funktionen von libcURL. Kurz gesagt ist PycURL das Mittel, mit dem wir cURL in Python nutzen werden. Was die Installation angeht, verwenden wir wie bei jedem anderen Python-Paket pip. Falls du mit pip nicht vertraut bist: Es ist ein Paketverwaltungssystem für Python, das Python-Entwickler ständig nutzen, um Abhängigkeiten schnell zu installieren.

Um PycURL zu installieren, fügen Sie einfach den folgenden Befehl in Ihr Terminal ein:

~ » pip install pycurl

HTML-Parsing mit BeautifulSoup

Da wir gerade über Abhängigkeiten und pip sprechen, ist es auch erwähnenswert, dass die Python-Community eine ganze Reihe von Lösungen für das Parsen von HTML entwickelt hat. Eines der beliebtesten Pakete zum Parsen von HTML ist BeautifulSoup. Bei WebScrapingAPI haben wir sogar einen ganzen Blogbeitrag darüber verfasst, wie man Webdaten mit Python und BeautifulSoup extrahiert und parst

Genau wie bei PycURL erfordert die Installation von BeautifulSoup nur einen einzigen Befehl:

~ » pip install beautifulsoup4

Wie man einen Web-Scraper mit Python und cURL erstellt

Nachdem wir nun den theoretischen Teil behandelt haben und wissen, wie man cURL sowohl im Terminal als auch in Python verwendet, lassen Sie uns direkt mit dem Programmieren beginnen. In diesem Abschnitt lernen wir, wie man cURL in Python einsetzt, indem wir einen echten Web-Scraper erstellen. Also, ohne weitere Umschweife: Das Programmier-Spiel kann beginnen!

1. Einrichten des Verzeichnisses

Als Softwareentwickler ist es wichtig, unsere Projekte so zu strukturieren, dass sie leicht zu warten und sowohl für uns selbst als auch für andere Entwickler gut lesbar sind. Um alles übersichtlich zu halten, erstellen wir zunächst ein neues Verzeichnis, in dem alle Dateien unseres Projekts gespeichert werden. Öffnen Sie ein neues Terminalfenster, wechseln Sie mit `cd` in den Desktop und erstellen Sie einen neuen Ordner namens `py_scraper`:

~ » cd desktop && mkdir py_scraper && cd py_scraper

Lassen Sie mich kurz die Befehle erklären, die wir bisher verwendet haben:

  • `cd` – Wechseln in das aktuelle Verzeichnis
  • `&&` – den folgenden Befehl nur ausführen, wenn der vorherige erfolgreich war
  • `mkdir` – neues Verzeichnis erstellen

Öffnen Sie Ihr Projekt in Ihrer bevorzugten IDE und erstellen Sie eine neue Datei namens „scraper.py“ im Verzeichnis `py_scraper`. Tipp: Sie können dies auch über die Befehlszeile mit folgendem Befehl tun:

~/desktop/py_scraper » touch scraper.py && code .

Wenn Sie VSCode verwenden (so wie ich), wird Ihnen nun ein Fenster angezeigt, das wie folgt aussehen sollte:

2. Pakete installieren

Ihr Terminal sollte sich nun im Verzeichnis `py_scraper` befinden.  Bevor wir mit der eigentlichen Programmierung des Scrapers beginnen, müssen wir noch die zuvor vorgestellten Pakete sowie ein weiteres installieren. Wir möchten diese jedoch ausschließlich im Verzeichnis `py_scraper` einschließen (und nicht global installieren). Dazu müssen wir die virtuellen Umgebungen von Python nutzen. Diese ermöglichen es uns, den Python-Interpreter, die Bibliotheken und die installierten Skripte zu isolieren.

Um eine neue virtuelle Umgebung im Verzeichnis `py_scraper` einzurichten, verwenden Sie den folgenden Befehl:

~/desktop/py_scraper » python3 -m venv env

Dadurch wird ein neuer Ordner `env` erstellt, den wir vor der Installation der gewünschten Pakete aktivieren müssen. Aktivieren Sie ihn mit diesem Befehl:

~/desktop/py_scraper » source env/bin/activate

Nachdem Sie nun Ihre virtuelle Umgebung erstellt und aktiviert haben, müssen Sie nur noch die erforderlichen Pakete installieren, indem Sie die zuvor vorgestellten pip-Befehle verwenden.

~/desktop/py_scraper » pip install pycurl beautifulsoup4 certify

3. Erstellen des Python- und cURL-Web-Scrapers

Sie sind nun bereit, PycURL und BeautifulSoup zu verwenden. Um diese Pakete nutzen zu können, müssen wir sie zunächst in unsere Datei `scraper.py` importieren. Fügen Sie einfach diesen Codeausschnitt am Anfang der Datei ein:

import pycurl
import certify
from io import BytesIO
from bs4 import BeautifulSoup

# All our logic will go underneath this line

Nachdem Sie die Pakete importiert haben, kümmern wir uns nun um die Logik unseres Web-Scrapers. Aus dem bisher Besprochenen wissen wir, dass wir zwei Aspekte abdecken müssen: die Datenextraktion und die Datenverarbeitung. Der erste Teil wird von PycURL abgedeckt, der zweite von BeautifulSoup. Für eine bessere Struktur schlage ich vor, dass wir jeden Teil separat behandeln.

3.1. Daten mit cURL und Python scrapen

Wenn ich von Scraping spreche, beziehe ich mich auf den Extraktionsteil des Web-Scrapers. Mit diesem Hintergrund und dem Wissen, wie man curl in Python über die PycURL-Schnittstelle nutzt, schreiben wir nun den Code:

# Setting global variables
TARGET_URL = 'https://httpbin.org/forms/post'

# Using cURL and Python to gather data from a server via PycURL
buffer = BytesIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, TARGET_URL)
curl.setopt(curl.WRITEDATA, buffer)
curl.setopt(curl.CAINFO, certifi.where())
curl.perform()
curl.close()

# Using BytesIO to retrieve the scraped data
body = buffer.getvalue()

# Saving the output and printing it in terminal
data = body.decode('iso-8859-1')
print(data)

Im obigen Code beginnen wir mit der Deklaration der globalen Variablen `TARGET_URL`, die die URL der Website enthält, von der wir Daten extrahieren möchten. Als Nächstes erstellen wir mit `BufferIO` einen Puffer, initialisieren PycURL und legen zwei Optionen fest: eine für die Datenübertragung und eine für den Dateinamen, der die Zertifikate enthält. Zu guter Letzt führen wir die cURL-Aktion aus und schließen anschließend die Sitzung. 

Das war’s schon – Sie haben erfolgreich mit Python eine cURL-Anfrage gestellt und die HTML-Datei in Ihrer Konsole ausgegeben. Jetzt müssen wir uns nur noch um den zweiten Abschnitt kümmern, nämlich die Datenverarbeitung.

3.2. HTML-Parsing mit Python und BeautifulSoup

Die Rohdaten zu haben, ist beim Web-Scraping überflüssig, es sei denn, wir führen irgendeine Aktion damit durch. Denn der grundlegendste Zweck eines jeden Web-Scrapers ist es, Daten aus HTML zu extrahieren. Nehmen wir für unser Beispiel an, dass wir den gesamten Text innerhalb der `<p>`-Elemente aus der Variablen `data` (die derzeit den gesamten gescrapten HTML-Code enthält) extrahieren wollen. So machen wir das mit BeautifulSoup:

# Parsing data using BeautifoulSoup
soup = BeautifulSoup(data, 'html.parser')
# Finding elements using BeautifoulSoup
paragraphs = soup.find_all("p")
for p in paragraphs:
   print(p.text)

Wie Sie sehen, sind mit BeautifulSoup nur 4 Zeilen Code nötig, um das gewünschte Ergebnis zu extrahieren. Wenn Sie das vollständige Skript ausführen, sollte nun der Text in jedem Absatz ausgegeben werden, der in der HTML-Datei enthalten ist, die wir von unserer Zielwebsite gesammelt haben. 

Angenommen, Sie haben die Anweisungen befolgt und Ihre `scraper.py` enthält den gesamten Code, den wir in diesem Abschnitt geschrieben haben, kehren wir nun zum Terminal zurück und führen das Skript aus:

~/desktop/py_scraper » python3 scraper.py
Customer name: 
Telephone: 
E-mail address: 
  Small 
  Medium 
  Large 
  Bacon 
  Extra Cheese 
  Onion 
  Mushroom 
Preferred delivery time: 
Delivery instructions: 
Submit order

Fazit

Das Erstellen eines Web-Scrapers mit Python und cURL ist ein sehr nützliches Projekt und kann der Ausgangspunkt für eine größere Web-Scraping-Anwendung sein. Der empfohlene Ansatz zur Integration der beiden Technologien ist die Verwendung von PycURL. Sie können auch Ihre eigene Schnittstelle oder Funktion schreiben, um in Python mit cURL zu interagieren. Das kostet nur etwas mehr Zeit und Mühe :).

Ich hoffe, dieser Artikel war eine gute Quelle, um cURL kennenzulernen, zu lernen, wie man es mit Python verwendet, und einen einfachen Web-Scraper zu erstellen. Außerdem lade ich dich ein, den Code anzupassen und ihn dir zu eigen zu machen, sodass du ein weiteres Projekt hast, das du deinem Portfolio hinzufügen kannst.

Über den Autor
Mihnea-Octavian Manolache, Full-Stack-Entwickler @ WebScrapingAPI
Mihnea-Octavian ManolacheFull-Stack-Entwickler

Mihnea-Octavian Manolache ist Full-Stack- und DevOps-Entwickler bei WebScrapingAPI. Er entwickelt Produktfunktionen und sorgt für die Wartung der Infrastruktur, die den reibungslosen Betrieb der Plattform gewährleistet.

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.