Heim BlogWeb-Scraping So verwenden Sie cURL in Python

So verwenden Sie cURL in Python

von Kadek

Nahezu jeder Internetnutzer arbeitet täglich unsichtbar mit cURL.

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

Was ist cURL?

cURL ist ein Tool zum Übertragen von Daten zu und von einem Webserver und zum Durchführen verschiedener Arten von Datenanfragen über verschiedene Datenprotokolle:

  1. HTTP und HTTPS. Zur Übertragung von Textdaten zwischen dem Client und dem Server vorgesehen. Der Hauptunterschied zwischen ihnen besteht darin, dass HTTPS über eine Verschlüsselung der übertragenen Daten verfügt.
  2. FTP, FTPS und SFTP. Für die Übertragung von Dateien über ein Netzwerk vorgesehen. FTPS ist ein sicheres Dateiübertragungsprotokoll, das SSL/TLS-Technologien zur Verschlüsselung seiner Kommunikationskanäle verwendet. SFTP ist ein Protokoll, das Dateien mithilfe der SSH-Technologie überträgt.
  3. IMAP und IMAPS (IMAP über SSL) – Protokoll der Anwendungsschicht für den E-Mail-Zugriff.
  4. POP3 und POP3S (POP3 über SSL) – Protokoll zum Empfangen 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 Transport.
  7. TELNET – Netzwerkprotokoll für den Fernzugriff auf einen Computer mithilfe eines Befehlsinterpreters.
  8. GOPHER – Netzwerkprotokoll für die verteilte Suche und Übertragung von Dokumenten.
  9. LDAP und LDAPS (LDAP über SSL) – Protokoll zur Authentifizierung von Verzeichnisdiensten.
  10. SMTP und SMTPS (SMTP über SSL) – Netzwerkprotokoll für die E-Mail-Übertragung.

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

cURL ist ein plattformübergreifendes Befehlszeilendienstprogramm und kann daher auf jedem Betriebssystem verwendet werden. Um zu überprüfen, ob cURL installiert ist, gehen Sie zur cmd (Befehlszeile) und geben Sie 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 beispielsweise HTML-Code zu erhalten, kann man mit einem Befehlszeilentool Folgendes schreiben:

curl example.com

Das Ergebnis:

C:\Users\Admin>curl example.com
<!doctype html>
<html>
<head>
    <title>Example 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>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

C:\Users\Admin>

Um einen Webseiten-Scraper auf cURL zu schreiben, kann man unsere API verwenden, die beim Scrapen von Seiten hilft. Füllen Sie einfach die erforderlichen Felder aus und verwenden Sie sie dann nach Bedarf: Führen Sie sie entweder von der Website aus oder fügen Sie den Code in das Programm ein.


Anfragen-Builder
Anfragen-Builder

Ohne solche Tools reicht cURL jedoch in der Regel 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 zu Python.

So verwenden Sie cURL in Python

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

Es ist jedoch zu beachten, dass solche Dienste normalerweise die Standardbibliothek für Anfragen in Python verwenden – die Requests-Bibliothek. Und obwohl dieser Ansatz etwas einschränkend ist, mag er für einige von Nutzen sein.

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

Für diejenigen, die eine unkomplizierte Lösung suchen, bieten wir einen praktischen cURL-zu-Python-Konverter an, der Ihre cURL-Befehle mühelos in Python-Code umwandeln kann.

Installation der PycURL-Bibliothek

Wie bereits erwähnt, erbt PycURL als Thin Wrapper über libcURL alle Funktionen von libcURL. PycURL ist beispielsweise extrem schnell (viel schneller als Requests, eine Python-Bibliothek für HTTP-Anfragen), unterstützt Multiprotokolle und enthält auch Sockets zur Unterstützung von Netzwerkvorgängen. Darüber hinaus unterstützt PycURl dieselben Datenprotokolle wie eine cURL.

Um PycURL zu installieren, gehen Sie zu cmd und schreiben Sie den nächsten Befehl:

pip install pycurl

Wenn bei der Installation mit dem Befehl pip install Probleme auftreten, können Sie die offizielle PycURL-Site aufrufen, auf der 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 muss ein weiteres Modul angeschlossen werden – BytesIO (ein Stream, der einen Puffer von Bytes im Speicher verwendet).

import pycurl 
from io import BytesIO

Danach müssen die verwendeten Objekte deklariert werden:

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'))

Denken Sie daran, dass JSON-Daten angezeigt werden. Wenn beim Hochladen Fehler auftreten, wird der Antwortcode zurückgegeben. Statuscode 404 bedeutet beispielsweise, dass die Seite nicht gefunden wurde.

POST-Anfrage

POST Request ermöglicht das Senden von Daten an den Server. Es ist so, als wäre GET eine HTTP-Anfrage. Es gibt zwei verschiedene Möglichkeiten, Daten mit der POST-Methode zu senden: das Senden von Textdaten und das 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')

Stellen Sie dann die HTTP-Anforderungsmethode auf POST und die zu sendenden Daten im Anforderungstext ein:

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

Und der letzte Schritt – POST durchführen:

crl.perform()
crl.close()

Das Senden von Daten aus der 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 zum Hochladen einer Datei im Hauptteil der Anfrage verwendet werden kann. 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 zu beachten, dass die Datei zum Zeitpunkt der Übertragung geöffnet sein muss.

Dieser Teil ähnelt 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 mit der Datenübertragung begonnen 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. Es 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()

Dateien herunterladen

Manchmal kommt es vor, dass die empfangenen Daten in eine Datei geschrieben werden müssen. Hierfür kann man den gleichen Code wie zum Übertragen von Daten aus einer Datei verwenden, mit einer Ausnahme – die Funktion setopt verwendet nicht READDATA, sondern WRITEDATA:

crl.setopt(crl.WRITEDATA, file)

Verwenden von Proxy in PycURL

CURL-Proxy ist ein Curl-Dienstprogrammschlüssel, der es ermöglicht, eine HTTP-Anfrage indirekt über einen Proxyserver zu senden. Mit anderen Worten: Dies ist eine unverzichtbare Sache für Web Scraping.

Die Proxy-Einstellung ist für das Parsen einer großen Datenmenge relevant. Durch das Senden von Hunderten von Anfragen pro Minute von einer einzigen IP-Adresse besteht die Gefahr, blockiert zu werden.

Auf Serverebene wird ein 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, muss die Certifi-Bibliothek installiert werden:

pip install certifi

In den meisten Fällen verfügen Benutzer jedoch bereits über sie, 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 Zertifikate in das 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 es im Programm zu verwenden, importieren Sie zunächst alle Bibliotheken:

import pycurl
from io import BytesIO
import certifi

Und dann Proxy festlegen:

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 Erkenntnisse

CURL ist ein praktisches Abfragedienstprogramm, das die meisten Übertragungsprotokolle unterstützt. Die LibcURL-API wurde für die Verwendung in eigenen Programmen erstellt. Und für die Verwendung in Python wurde oberhalb von libcURL ein dünner Wrapper namens PycURL erstellt.

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

Related Posts

Hinterlasse einen Kommentar