Zurück zum Blog
Leitfäden
Mihnea-Octavian Manolache30. November 202211 Min. Lesezeit

Wie man CURL mit Python für Web Scraping verwendet

Wie man CURL mit Python für Web Scraping verwendet

Wie benutzt man CURL mit Python?

Kurz gesagt, cURL ist hauptsächlich ein Befehlszeilentool, das zum Abrufen von Daten von einem Server verwendet wird. Ich weiß, dass bei der Erwähnung der Befehlszeile die Dinge kompliziert erscheinen mögen. 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 von der Kommandozeile aus zu verwenden, öffnen Sie einfach ein neues Terminalfenster und geben Sie `curl` gefolgt von der URL ein, die Sie abrufen 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 nicht so aussieht, haben Sie gerade die Infrastruktur für einen zukünftigen Web Scraper aufgebaut. Und das alles in nur einer Zeile Code.

cURL ist eigentlich ein fortgeschritteneres Werkzeug. Wenn Sie mehr über die Verwendung von curl erfahren wollen, können Sie die offizielle Dokumentation lesen. Sie können auch den `--help` Schalter benutzen und über die verschiedenen verfügbaren Optionen lesen. 

Wie man cURL zum Abrufen von HTML-Dateien verwendet

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 eine HTML-Datei bereitstellen, die man dann parsen und aus der man Daten extrahieren muss.

Im Moment liegt unser Schwerpunkt jedoch nicht auf der Datenmanipulation, sondern auf der Datenextraktion. Und wir wissen, dass wir cURL zum Scrapen von Websites verwenden können, aber wie machen wir das eigentlich? Nun, falls Sie noch nicht neugierig geworden sind und es ausprobiert haben, bitten Sie curl einfach, auf eine beliebige generische URL zuzugreifen, von der Sie wissen, 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 einfachen 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>

Wie man cURL in Python verwendet 

Wie Sie gesehen haben, ist das Extrahieren von Daten mit cURL eine unkomplizierte Lösung, die keine eigentliche Codierung erfordert. Es geht einfach darum, einen Befehl zu senden und einige Informationen zu erhalten. Wenn Sie ein echtes Web-Scraping-Projekt aufbauen wollen, müssen Sie die gesammelten Daten irgendwie verwenden. Und da wir Programmierer sind, wollen wir die Daten programmatisch manipulieren. Hier kommt Python ins Spiel.

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

Python ist zweifelsohne eine der beliebtesten Programmiersprachen. Sie ist nicht nur sehr leistungsfähig, sondern eignet sich dank ihrer einfachen Syntax auch perfekt für Programmieranfänger. Außerdem gibt es eine große Gemeinschaft, die immer bereit ist, zu helfen. Wenn Sie also irgendwann auf ein Problem stoßen und nicht weiterkommen, zögern Sie nicht, eine Frage zu stellen, zum Beispiel auf Stackoverflow, und jemand wird Ihnen sicher helfen. 

Vor allem für das Web Scraping ist Python eine gute Wahl, da es eine Vielzahl von Paketen enthält. Wie Sie später in diesem Artikel sehen werden, erfordert die Datenmanipulation das Parsen der HTML-Dateien, so dass Sie anschließend die Elemente "auslesen" und nur die Informationen extrahieren können, die Sie von dieser bestimmten Webseite benötigen.

Web Scraping mit cURL und Python

Bis jetzt haben wir curl kennengelernt, wie man es im Terminal benutzt, aber wie integrieren wir es eigentlich in Python? Nun, es gibt tatsächlich mehrere Möglichkeiten, wie man dies angehen kann. Sie könnten zum Beispiel Pythons `os`-Modul verwenden und Terminalbefehle senden:

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

Sie können sogar Ihre eigene Funktion um diese herum aufbauen und sie im gesamten Projekt verwenden:

import os  
def curl(website):     
    return os.system(f'curl "{website}"')
  
print(curl('https://httpbin.org/forms/post'))

Aber wie gesagt, eine der größten Stärken von Python ist seine Paketvielfalt. Da cURL sehr viel vielfältiger ist, müsste unsere Funktion sehr viel komplexer sein, um alle seine Funktionen zu berücksichtigen. Anstatt also das Rad neu zu erfinden, empfehle ich, ein bestehendes Paket für die Integration von cURL in Python zu verwenden: PycURL.

Was ist PycURL und wie wird es installiert?

Laut ihrer Website ist PycURL eine Schnittstelle zur cURL-Bibliothek und erbt daher alle libcURL-Fähigkeiten. Kurz gesagt, PycURL ist das Mittel, mit dem wir cURL in Python verwenden werden. Zur Installation verwenden wir, wie bei jedem anderen Python-Paket, pip. Falls Sie pip noch nicht kennen, es ist ein Paketverwaltungssystem für Python und Python-Entwickler verwenden es ständig, um schnell Abhängigkeiten zu installieren.

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

~ " pip install pycurl 

Parsen von HTML mit BeautifulSoup

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

Genau wie bei PycURL ist für die Installation von BeautifulSoup nur ein Befehl erforderlich:

~ "pip install beautifulsoup4

Wie man einen Web Scraper mit Python und cURL erstellt

Nachdem wir nun den theoretischen Teil abgedeckt haben und wissen, wie man cURL sowohl mit dem Terminal als auch in Python benutzt, wollen wir uns gleich ans Programmieren machen. In diesem Abschnitt werden wir lernen, wie man curl in Python verwendet, indem wir einen echten Web Scraper bauen. Also, ohne weitere Umschweife, lasst das Programmierspiel beginnen!

1. Das Verzeichnis einrichten

Als Softwareentwickler ist es wichtig, unsere Projekte so zu strukturieren, dass sie sowohl für uns als auch für andere Entwickler leicht zu pflegen und zu lesen sind. Um alles zu organisieren, beginnen wir mit der Erstellung eines neuen Verzeichnisses, das alle Dateien unseres Projekts enthalten wird. Öffnen Sie ein neues Terminalfenster, gehen Sie mit "cd" auf den Desktop und erstellen Sie einen neuen Ordner mit dem Namen "py_scraper":

~ " cd desktop && mkdir py_scraper && cd py_scraper

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

  • `cd` - aktuelles Verzeichnis wechseln
  • &&" - führt den folgenden Befehl nur aus, wenn der vorherige erfolgreich war
  • `mkdir` - neues Verzeichnis erstellen

Öffnen Sie Ihr Projekt in Ihrer bevorzugten IDE und erstellen Sie eine neue Datei mit dem Namen 'scraper.py' im Verzeichnis `py_scraper`. Tipp: Sie können dies auch von der Kommandozeile aus tun, indem Sie diesen Befehl verwenden:

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

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

Ein Fenster des Dark-Code-Editors, in dem eine leere Python-Datei namens „scraper.py“ geöffnet ist

2. Installieren von Paketen

Ihr Terminal sollte sich nun im Verzeichnis `py_scraper` befinden. Das letzte, was wir tun müssen, bevor wir den eigentlichen Scraper programmieren, ist die Installation der Pakete, die wir zuvor vorgestellt haben, und eines weiteren. Wir wollen sie jedoch nur innerhalb des `py_scraper`-Verzeichnisses haben (und sie nicht global installieren). Um dies zu erreichen, müssen wir die virtuellen Umgebungen von Python verwenden. Diese ermöglichen es uns, den Python-Interpreter, die Bibliotheken und die installierten Skripte zu isolieren.

Um eine neue virtuelle Umgebung innerhalb des `py_scraper`-Verzeichnisses einzurichten, verwenden Sie den folgenden Befehl:

~/Desktop/py_scraper " python3 -m venv env

Dadurch wird ein neuer `env`-Ordner erstellt, den wir aktivieren müssen, bevor wir die gewünschten Pakete installieren. Aktivieren Sie ihn mit dem folgenden Befehl:

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

Nachdem Sie nun Ihre virtuelle Umgebung erstellt und aktiviert haben, müssen Sie nur noch die benötigten Pakete mit Hilfe der pip-Befehle installieren, die wir zuvor vorgestellt haben.

~/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 verwenden zu können, müssen wir sie zunächst in unsere Datei "scraper.py" importieren. Fügen Sie einfach dieses Snippet am Anfang der Datei ein:

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

# Unsere gesamte Logik wird unterhalb dieser Zeile stehen

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

3.1. Scraping von Daten mit cURL und Python

Wenn ich von Scraping spreche, beziehe ich mich auf den Extraktionsteil des Web Scrapers. Nachdem wir dies im Kopf haben und wissen, wie man curl in Python verwendet, indem man mit der PycURL-Schnittstelle interagiert, können wir den Code schreiben:

# Globale Variablen setzen
TARGET_URL = 'https://httpbin.org/forms/post'

# Mit cURL und Python Daten über PycURL von einem Server abrufen
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()

# Abrufen der gescrapten Daten mit BytesIO
body = buffer.getvalue()

# Speichern der Ausgabe und Ausgeben im Terminal
data = body.decode('iso-8859-1')
print(data)

Im obigen Code deklarieren wir zunächst die globale Variable `TARGET_URL`, die die URL der Website enthält, aus der wir Daten extrahieren wollen. Als nächstes erstellen wir einen Puffer mit `BufferIO`, initialisieren PycURL und setzen zwei Optionen: 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 die Sitzung. 

Das war's. Sie haben erfolgreich Python verwendet, um eine cURL-Anfrage zu stellen und die HTML-Datei in Ihrer Konsole zu drucken. Jetzt müssen wir uns nur noch um den zweiten Abschnitt kümmern, nämlich die Datenverarbeitung.

3.2. Parsen von HTML mit Python und BeautifulSoup

Having the raw data is redundant in web scraping, unless we perform some sort of action on it. As the most basic scope of any web scraper is to extract data from HTML. For our example, let us assume that we want to scrape all text inside the `<p>` elements from the `data` variable (that is currently holding all the scraped HTML). Here is how we do this using BeautifulSoup:

# Daten mit BeautifulSoup analysieren
soup = BeautifulSoup(data, 'html.parser')
# Elemente mit BeautifulSoup suchen
paragraphs = soup.find_all("p")
for p in paragraphs:
   print(p.text)

Wie Sie sehen, sind mit BeautifulSoup nur 4 Codezeilen erforderlich, um das gewünschte Ergebnis zu erzielen. Die Ausführung des vollständigen Skripts sollte nun den Text innerhalb jedes Absatzes in der HTML-Datei ausgeben, die wir von unserer Ziel-Website gesammelt haben. 

Unter der Annahme, dass Sie die Anweisungen befolgt haben und dass Ihre `scraper.py` den gesamten Code enthält, den wir in diesem Abschnitt geschrieben haben, lassen Sie uns zum Terminal zurückkehren und das Skript ausführen:

~/desktop/py_scraper » python3 scraper.py
Kundenname: 
Telefonnummer: 
E-Mail-Adresse: 
  Klein 
  Mittel 
  Groß 
  Speck 
  Extra Käse 
  Zwiebel 
  Pilze 
Gewünschte Lieferzeit: 
Lieferhinweise: 
Bestellung abschicken

Schlussfolgerung

Der Aufbau eines Web Scrapers mit Python und cURL ist ein sehr nützliches Projekt und kann der Ausgangspunkt für eine größere Web Scraping App sein. Der empfohlene Ansatz zur Integration der beiden Technologien ist die Verwendung von PycURL. Sie können auch Ihre eigene Schnittstelle oder Funktion für die Interaktion mit cURL in Python schreiben. Das erfordert nur etwas mehr Zeit und Aufwand :).

Ich hoffe, dieser Artikel war eine gute Ressource, um Curl zu lernen, wie man es mit Python verwendet und einen einfachen Web Scraper baut. Außerdem lade ich Sie ein, den Code zu optimieren und ihn zu Ihrem eigenen zu machen, damit Sie ein weiteres Projekt zu Ihrem Portfolio hinzufügen können.

Über den Autor
Mihnea-Octavian Manolache, Full-Stack-Entwickler bei 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.