Startseite BlogWeb-Scraping Wie man cURL in Python verwendet

Wie man cURL in Python verwendet

von Kadek

Fast jeder Internetnutzer arbeitet täglich unsichtbar mit cURL.

Aufgrund seiner Flexibilität und Ungebundenheit wird cURL überall eingesetzt: von Autos und Fernsehern bis hin zu Routern und Druckern.

Was ist cURL?

cURL ist ein Tool, mit dem Sie Daten zu und von einem Webserver übertragen und verschiedene Arten von Datenanfragen über verschiedene Datenprotokolle stellen können:

  1. HTTP und HTTPS. Sie sind für die Übertragung von Textdaten zwischen dem Client und dem Server bestimmt. Der Hauptunterschied zwischen ihnen ist, dass HTTPS die übertragenen Daten verschlüsselt.
  2. FTP, FTPS und SFTP. Dient der Übertragung von Dateien über ein Netzwerk. FTPS ist ein sicheres Dateiübertragungsprotokoll, das SSL/TLS-Technologien verwendet, um seine Kommunikationskanäle zu verschlüsseln. SFTP ist ein Protokoll, das Dateien mit Hilfe der SSH-Technologie überträgt.
  3. IMAP und IMAPS (IMAP over SSL) - Anwendungsschichtprotokoll für den E-Mail-Zugriff.
  4. POP3 und POP3S (POP3 über SSL) - Protokoll für den Empfang von E-Mail-Nachrichten.
  5. SMB - Netzwerkprotokoll der Anwendungsschicht für den Fernzugriff auf Dateien, Drucker und andere Netzwerkressourcen.
  6. SCP - Protokoll zum Kopieren von Dateien zwischen Computern unter Verwendung von verschlüsseltem SSH als Transportmittel.
  7. TELNET - Netzwerkprotokoll für den Fernzugriff auf einen Computer über einen Befehlsinterpreter.
  8. GOPHER - Netzwerkprotokoll für die verteilte Suche und Übertragung von Dokumenten.
  9. LDAP und LDAPS (LDAP over SSL) - Protokoll, das zur Authentifizierung von Verzeichnisdiensten verwendet wird.
  10. SMTP und SMTPS (SMTP over SSL) - Netzwerkprotokoll für die E-Mail-Übertragung.

Außerdem unterstützt cURL HTTPS-Authentifizierung, HTTP-Post, FTP-Upload, Proxy, Cookies und Benutzernamen + Passwörter.

cURL ist ein plattformübergreifendes Kommandozeilenprogramm und kann daher auf allen Betriebssystemen verwendet werden. Um zu überprüfen, ob cURL installiert ist, rufen Sie cmd (Befehlszeile) auf und geben curl -V ein:

C:\Users\Admin>curl -V
curl 7.79.1 (Windows) libcurl/7.79.1 Schannel
Release-Date: 2021-09-22
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS HSTS IPv6 Kerberos Largefile NTLM SPNEGO SSL SSPI UnixSockets

C:\Users\Admin>

Um zum Beispiel HTML-Code zu erhalten, können Sie ein Kommandozeilen-Tool verwenden:

curl example.com

Das Ergebnis:

C:\Benutzer\Admin>curl beispiel.com
<!doctype html>
<html>
<head>
    <title>Beispiel Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 2em;
        background-color: #fdfdff;
        border-radius: 0.5em;
        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        div {
            margin: 0 auto;
            width: auto;
        }
    }
    </style>
</head>

<body>
<div>
    <h1>Beispiel Domain</h1>
    <p>Diese Domain ist zur Verwendung in illustrativen Beispielen in Dokumenten bestimmt. Sie können diese Domain in der Literatur verwenden, ohne sie vorher abzustimmen oder um Erlaubnis zu fragen.</p>
    <p><a href="https://www.iana.org/domains/example">Mehr Informationen...</a></p>
</div>
</body>
</html>

C:\Benutzer\Admin&gt;

Um einen Web Page Scraper auf cURL zu schreiben, können Sie unsere API verwenden, die Ihnen beim Scrapen von Seiten hilft. Füllen Sie einfach die erforderlichen Felder aus und verwenden Sie sie je nach Bedarf: entweder führen Sie sie von der Website aus oder fügen Sie den Code in das Programm ein.


Requests Builder
Requests Builder

In der Regel reicht cURL jedoch ohne solche Tools nicht aus, da es als Teil des Python-Programms notwendig ist. Daher wurde eine API für die cURL-Funktionalität, die libCURL-Bibliothek, erstellt. Für Python gibt es einen Wrapper für libCURL namens pyCURL. pyCURL ist also ein Curl für Python.

Wie man cURL in Python verwendet

Zunächst einmal sei gesagt, dass es viele Dienste gibt, die cURL-Befehle in Code übersetzen können. Diese Option ist für diejenigen geeignet, die bereits Erfahrung im Schreiben von Befehlen haben, aber Programmcode benötigen.

Es ist jedoch erwähnenswert, dass solche Dienste in der Regel die Standardbibliothek für Anfragen in Python verwenden - die Requests-Bibliothek. Und obwohl dieser Ansatz etwas einschränkend ist, mag er für einige geeignet sein.

Eine andere Möglichkeit ist, PycURL zu verwenden und selbst Programmcode zu schreiben.

Installation der PycURL-Bibliothek

Wie bereits erwähnt, ist PycURL eine dünne Hülle über libcURL und erbt alle Funktionen von libcURL. So ist PycURL beispielsweise extrem schnell (viel schneller als Requests, eine Python-Bibliothek für HTTP-Anfragen), unterstützt mehrere Protokolle und enthält auch Sockets zur Unterstützung von Netzwerkoperationen. Außerdem unterstützt PycURl die gleichen Datenprotokolle wie cURL.

Um PycURL zu installieren, gehen Sie zu cmd und geben Sie den folgenden Befehl ein:

pip install pycurl

Wenn es Probleme bei der Installation mit dem Befehl pip install gibt, können Sie auf die offizielle PycURL-Website gehen, wo sich die neueste Version der Installationsdateien befindet.

Python cURL Beispiele

Am häufigsten werden die Funktionen GET, POST, PUT und DELETE verwendet.

GET-Anfrage

Das einfachste Codebeispiel für die Verwendung von PycURL ist das Abrufen von Daten mit einer GET-Anfrage. Dazu ist es notwendig, ein weiteres Modul einzubinden - BytesIO (ein Stream, der einen Puffer mit Bytes im Speicher verwendet).

import pycurl 
from io import BytesIO

Danach müssen Sie die verwendeten Objekte deklarieren:

b_obj = BytesIO()
crl = pycurl.Curl()

Und legen Sie die URL fest:

crl.setopt(crl.URL, 'https://example.com/get)

Öffnen Sie dann die Übertragung, rufen Sie die Daten ab und zeigen Sie sie an:

# To write bytes using charset utf 8 encoding
crl.setopt(crl.WRITEDATA, b_obj) 
# Start transfer 
crl.perform() 
# End curl session 
crl.close() 
# Get the content stored in the BytesIO object (in byte characters) 
get_body = b_obj.getvalue() 
# Decode the bytes and print the result 
print('Output of GET request:\n%s' % get_body.decode('utf8'))

Beachten Sie, dass JSON-Daten angezeigt werden. Wenn während des Hochladevorgangs Fehler auftreten, wird der Antwortcode zurückgegeben. Der Statuscode 404 bedeutet zum Beispiel, dass die Seite nicht gefunden wurde.

POST-Anfrage

Die POST-Anfrage ermöglicht das Senden von Daten an den Server. Sie ist genau wie GET eine HTTP-Anfrage. Es gibt zwei verschiedene Möglichkeiten, Daten mit der POST-Methode zu senden: Senden von Textdaten und Senden einer Datei.

Importieren Sie zunächst Pycurl und urllib zur Kodierung und deklarieren Sie die verwendeten Objekte:

import pycurl
from urllib.parse import urlencode

crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://example.com/post')

Setzen Sie dann die HTTP-Anforderungsmethode auf POST und die zu sendenden Daten in den Anforderungskörper:

post_data = {'field': 'value'}
postfields = urlencode(post_data)
crl.setopt(crl.POSTFIELDS, postfields)

Und der letzte Schritt - POST ausführen:

crl.perform()
crl.close()

Das Senden von Daten aus einer physischen Datei ist ähnlich:

import pycurl

crl = pycurl.Curl()
crl.setopt(crl.URL, 'https://example.com/post')

crl.setopt(crl.HTTPPOST,[('fileupload',(clr.FORM_FILE, __file__, )),])

clr.perform()
clr.close()

Wenn sich die Dateidaten im Speicher befinden, kann man BUFFER/BUFFERPTR in seinem Code verwenden:

clr.setopt(clr.HTTPPOST, [('fileupload', (clr.FORM_BUFFER, 'readme.txt',
        clr.FORM_BUFFERPTR, 'This is a readme file',  )), ])

Ein anderer Code wird derselbe sein.

PUT-Anfrage

Eine PUT-Anfrage ist wie eine POST-Anfrage. Der Unterschied besteht darin, dass PUT dazu verwendet werden kann, eine Datei im Textkörper der Anfrage hochzuladen. Gleichzeitig kann PUT sowohl zum Erstellen als auch zum Überschreiben einer Datei an einer bestimmten Adresse verwendet werden. Bei der Verwendung von PUT mit PycURL ist es wichtig, daran zu denken, dass die Datei zum Zeitpunkt der Übertragung geöffnet sein muss.

Dieser Teil ist ähnlich wie bei der POST-Methode:

import pycurl

clr = pycurl.Curl()
clr.setopt(clr.URL, 'https://example.com/put')

Dann muss man die Datei öffnen und lesen:

clr.setopt(clr.UPLOAD, 1)
file = open('body.json')
clr.setopt(clr.READDATA, file)

Danach kann die Übertragung von Daten gestartet werden:

clr.perform()
clr.close()

Und erst am Ende kann die Datei geschlossen werden:

file.close()

DELETE-Anfrage

Und das letzte Beispiel ist eine HTTP DELETE-Anfrage. Sie sendet eine Anfrage zum Löschen der Zielressource an den Server:

import pycurl 

crl = pycurl.Curl() 
crl.setopt(crl.URL, "http://example.com/items/item34") crl.setopt(crl.CUSTOMREQUEST, "DELETE")

crl.perform() 
crl.close()

Herunterladen von Dateien

Manchmal kommt es vor, dass die empfangenen Daten in eine Datei geschrieben werden müssen. Hierfür können Sie den gleichen Code wie für die Übertragung von Daten aus einer Datei verwenden, mit einer Ausnahme - die Funktion setopt verwendet nicht READDATA, sondern WRITEDATA:

crl.setopt(crl.WRITEDATA, file)

Proxy in PycURL verwenden

CURL proxy ist ein Curl-Utility-Schlüssel, mit dem man eine HTTP-Anfrage indirekt über einen Proxy-Server senden kann. Mit anderen Worten, dies ist eine unverzichtbare Sache für Web Scraping.

Die Proxy-Einstellung ist für das Parsen einer großen Datenmenge von Bedeutung. Wenn Sie Hunderte von Anfragen pro Minute von einer einzigen IP-Adresse senden, besteht die Gefahr, dass sie blockiert werden.

Auf der Serverebene ist der Schutz aktiviert, um DoS-Angriffe zu verhindern. Die Verwendung verschiedener cURL-Proxys löst dieses Problem und ermöglicht das Scrapen von Daten ohne das Risiko einer Blockierung.

Um einen Proxy zu verwenden, müssen Sie die certifi-Bibliothek installieren:

pip install certifi

Aber in den meisten Fällen haben die Benutzer sie bereits, da es sich um eine integrierte Bibliothek handelt:

C:\Users\Admin>pip install certifi
Requirement already satisfied: certifi in c:\users\admin\appdata\local\programs\python\python310\lib\site-packages (2022.5.18.1)

C:\Users\Admin>

Um es zu verwenden, importieren Sie certifi in Ihr Projekt:

import certifi
Python 3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import certifi
>>> _

Um sie im Programm zu verwenden, müssen Sie zunächst alle Bibliotheken importieren:

import pycurl
from io import BytesIO
import certifi

Und setzen Sie dann Proxy:

def set_proxy(self, proxy):
     if proxy:
         logger.debug('PROXY SETTING PROXY %s', proxy)
         self.get_con.setopt(pycurl.PROXY, proxy)
         self.post_con.setopt(pycurl.PROXY, proxy)
         self.put_con.setopt(pycurl.PROXY, proxy)   

Fazit und Schlussfolgerungen

CURL ist ein praktisches Abfrageprogramm, das die meisten Übertragungsprotokolle unterstützt. Die LibcURL API wurde für die Verwendung in eigenen Programmen entwickelt. Und für die Verwendung in Python wurde ein dünner Wrapper über libcURL erstellt, der PycURL genannt wird.

Mit Hilfe dieser Bibliothek ist es möglich, alle Requests zu verwenden und mit allen von cURL unterstützten Protokollen zu arbeiten. Gleichzeitig ist die PycURL-Bibliothek viel schneller als ihr Python-Pendant, die Requests-Bibliothek.

Verwandte Beiträge

Einen Kommentar hinterlassen