In diesem Leitfaden werden wir die folgenden Konzepte der API-Nutzung mit Python erläutern:
- Was ist HTTP?
- Was ist eine REST-API?
- Wie man eine GET-Anfrage stellt
- Wie man eine POST-Anfrage stellt
- Wie man ein SDK verwendet
Was ist HTTP?
HTTP (Hypertext Transfer Protocol) ist der Standard für die Übermittlung der meisten Daten im Internet. Sie haben wahrscheinlich gehört, dass Datenbanken das Backend der meisten Websites bilden – das stimmt, aber es gibt Nuancen, wie unser Client (Browser oder Python-Skript) tatsächlich mit der Datenbank interagiert. HTTP ist die Kommunikationsschicht zwischen dem Client und dem Backend-Server.
Bei der Verwendung von HTTP für Scraping und Web-APIs sind dies die Methoden, die Sie am ehesten verwenden werden.
- GET: Die mit Abstand am häufigsten verwendete Methode. Immer wenn Sie eine Website besuchen, führt Ihr Browser einen GET-Vorgang für den HTML-Code durch und rendert dann die Seite für Sie zur Ansicht.
- POST: Dies ist die zweithäufigste Methode. POST wird verwendet, um größere Datenmengen sicher zu übertragen – und am häufigsten, um etwas zu einer Datenbank hinzuzufügen. Wenn Sie Formulare und Umfragen ausfüllen oder in sozialen Medien posten, führen Sie eine POST-Anfrage durch.
- PUT: PUT-Anfragen werden verwendet, um vorhandene Elemente in einer Datenbank zu aktualisieren. Wenn Sie einen Beitrag in sozialen Medien bearbeiten, wird PUT unter der Haube verwendet.
- DELETE: Wenn Sie einen Beitrag in sozialen Medien (oder etwas anderes aus einer Datenbank) löschen möchten, sendet Ihr Browser eine DELETE-Anfrage an den Server, um ihn zu entfernen.
HTTP und sein Mangel an Rückgabestandards
Trotz seiner Einfachheit gibt es bei HTTP keinen universellen Rückgabestandard. Einige Server geben standardmäßig HTML zurück, während andere JSON oder sogar ältere Datenstrukturen wie XML und Klartext ausspucken.
Lassen Sie uns zunächst eine einfache GET-Anfrage stellen. Wenn Sie Python Requests noch nicht installiert haben, können Sie es über pip installieren.
pip install requests
Sobald Sie Requests installiert haben, können Sie den folgenden Code ausführen, um einen einfachen GET zu erstellen. Achten Sie auf die Terminalausgabe.
import requests
response = requests.get("https://quotes.toscrape.com")
print(response.text)
Nachdem Sie den Code ausgeführt haben, sollten Sie feststellen, dass wir eine HTML-Seite erhalten haben. Diese ist für die Anzeige im Browser gut geeignet, aber im Terminal ist sie ziemlich hässlich. Die untenstehende Ausgabe wurde gekürzt, aber Sie können sich ein Bild davon machen.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Quotes to Scrape</title>
<link rel="stylesheet" href="/static/bootstrap.min.css">
<link rel="stylesheet" href="/static/main.css">
</head>
<body>
<div class="container">
<div class="row header-box">
<div class="col-md-8">
<h1>
<a href="/" style="text-decoration: none">Quotes to Scrape</a>
</h1>
</div>
<div class="col-md-4">
<p>
<a href="/login">Login</a>
</p>
</div>
</div>
<div class="row">
<div class="col-md-8">
<div class="quote" itemscope itemtype="http://schema.org/CreativeWork">
<span class="text" itemprop="text">“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”</span>
<span>by <small class="author" itemprop="author">Albert Einstein</small>
<a href="/author/Albert-Einstein">(about)</a>
</span>
<div class="tags">
Tags:
<meta class="keywords" itemprop="keywords" content="change,deep-thoughts,thinking,world" / >
<a class="tag" href="/tag/change/page/1/">change</a>
<a class="tag" href="/tag/deep-thoughts/page/1/">deep-thoughts</a>
<a class="tag" href="/tag/thinking/page/1/">thinking</a>
<a class="tag" href="/tag/world/page/1/">world</a>
</div>
</div>
<div class="quote" itemscope itemtype="http://schema.org/CreativeWork">
<span class="text" itemprop="text">“It is our choices, Harry, that show what we truly are, far more than our abilities.”</span>
<span>by <small class="author" itemprop="author">J.K. Rowling</small>
<a href="/author/J-K-Rowling">(about)</a>
</span>
<div class="tags">
Tags:
<meta class="keywords" itemprop="keywords" content="abilities,choices" / >
<a class="tag" href="/tag/abilities/page/1/">abilities</a>
<a class="tag" href="/tag/choices/page/1/">choices</a>
</div>
</div>
HTML-Seiten sind dafür gedacht, von Browsern gelesen und wiedergegeben zu werden. Sie sind nicht dafür gedacht, dass Sie sie lesen oder in Ihren Code integrieren.
Wie REST (Representational State Transfer) dies behebt
REST-APIs geben uns einen Designstandard für Datenpipelines. JSON ist bei weitem der beliebteste Rückgabetyp bei REST-APIs. Er ist flexibel und leicht zu lesen. Diese klare, lesbare Syntax macht es auch einfach, sie in Ihrer Programmierumgebung zu parsen.
Im Folgenden sehen Sie, wie JSON tatsächlich aussieht. Denken Sie daran, dass wir eine REST-API verwenden, um diese Art von Datenstruktur zu erhalten.
{
"name": "Jake",
"age": 34,
"professions": ["writing", "coding"]
}
REST-APIs verwenden Endpunkte, Parameter und HTTP-Methoden zur Steuerung der zurückgegebenen Daten und ihres Formats.
Ihre erste API-Anfrage stellen
Nun, da Sie wissen, was eine REST-API tun soll, lassen Sie uns versuchen, sie tatsächlich zu verwenden. Quotes to Scrape hat auch eine REST-API. Anstatt einfach die Homepage abzurufen, greifen wir jetzt auf die API zu. Wir kommunizieren mit dem Server über Endpunkte.
Unser vollständiger Endpunkt /api/quotes
kann in zwei Teile zerlegt werden.
/api
: Damit wird dem Server mitgeteilt, dass wir strukturierte API-Daten und keine HTML-Seiten wünschen./quotes
: Wir möchten, dass die API Daten vom Endpunkt ”quotes
” zurückgibt.
Den Antrag stellen
Führen Sie den Code aus, wie Sie es zuvor getan haben.
import requests
import json
response = requests.get("https://quotes.toscrape.com/api/quotes")
print(json.dumps(response.json(), indent=4))
Unsere Daten kommen jetzt sauber und strukturiert zurück. Sie sind leicht zu analysieren – und von dort aus können wir so ziemlich alles damit machen.
{
"has_next": true,
"page": 1,
"quotes": [
{
"author": {
"goodreads_link": "/author/show/9810.Albert_Einstein",
"name": "Albert Einstein",
"slug": "Albert-Einstein"
},
"tags": [
"change",
"deep-thoughts",
"thinking",
"world"
],
"text": "\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d"
},
{
"author": {
"goodreads_link": "/author/show/1077326.J_K_Rowling",
"name": "J.K. Rowling",
"slug": "J-K-Rowling"
},
"tags": [
"abilities",
"choices"
],
"text": "\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d"
},
{
"author": {
"goodreads_link": "/author/show/9810.Albert_Einstein",
"name": "Albert Einstein",
"slug": "Albert-Einstein"
},
"tags": [
"inspirational",
"life",
"live",
"miracle",
"miracles"
],
"text": "\u201cThere are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.\u201d"
},
{
"author": {
"goodreads_link": "/author/show/1265.Jane_Austen",
"name": "Jane Austen",
"slug": "Jane-Austen"
},
"tags": [
"aliteracy",
"books",
"classic",
"humor"
],
"text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d"
},
{
"author": {
"goodreads_link": "/author/show/82952.Marilyn_Monroe",
"name": "Marilyn Monroe",
"slug": "Marilyn-Monroe"
},
"tags": [
"be-yourself",
"inspirational"
],
"text": "\u201cImperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.\u201d"
},
{
"author": {
"goodreads_link": "/author/show/9810.Albert_Einstein",
"name": "Albert Einstein",
"slug": "Albert-Einstein"
},
"tags": [
"adulthood",
"success",
"value"
],
"text": "\u201cTry not to become a man of success. Rather become a man of value.\u201d"
},
{
"author": {
"goodreads_link": "/author/show/7617.Andr_Gide",
"name": "Andr\u00e9 Gide",
"slug": "Andre-Gide"
},
"tags": [
"life",
"love"
],
"text": "\u201cIt is better to be hated for what you are than to be loved for what you are not.\u201d"
},
{
"author": {
"goodreads_link": "/author/show/3091287.Thomas_A_Edison",
"name": "Thomas A. Edison",
"slug": "Thomas-A-Edison"
},
"tags": [
"edison",
"failure",
"inspirational",
"paraphrased"
],
"text": "\u201cI have not failed. I've just found 10,000 ways that won't work.\u201d"
},
{
"author": {
"goodreads_link": "/author/show/44566.Eleanor_Roosevelt",
"name": "Eleanor Roosevelt",
"slug": "Eleanor-Roosevelt"
},
"tags": [
"misattributed-eleanor-roosevelt"
],
"text": "\u201cA woman is like a tea bag; you never know how strong it is until it's in hot water.\u201d"
},
{
"author": {
"goodreads_link": "/author/show/7103.Steve_Martin",
"name": "Steve Martin",
"slug": "Steve-Martin"
},
"tags": [
"humor",
"obvious",
"simile"
],
"text": "\u201cA day without sunshine is like, you know, night.\u201d"
}
],
"tag": null,
"top_ten_tags": [
[
"love",
14
],
[
"inspirational",
13
],
[
"life",
13
],
[
"humor",
12
],
[
"books",
11
],
[
"reading",
7
],
[
"friendship",
5
],
[
"friends",
4
],
[
"truth",
4
],
[
"simile",
3
]
]
}
Eine authentifizierte Anfrage stellen
Nachdem wir nun gesehen haben, wie man öffentliche Daten abruft, wollen wir uns nun mit authentifizierten APIs beschäftigen. In vielen Fällen benötigen Sie einen API-Schlüssel, um Ihre Daten zu erhalten. Die meisten API-Server verlangen einen Authorization-Header
mit Ihrem API-Schlüssel, um Ihre Anfrage zu authentifizieren.
Eine einfache GET-Anfrage zu stellen ist ziemlich einfach. Jetzt werden wir versuchen, eine POST-Anfrage zu stellen. POST-Anfragen werden verwendet, um größere Datenmengen sicher zu verarbeiten. Im folgenden Code verwenden wir die Web Unlocker API, um die Seite zu parsen und Markdown zurückzugeben.
import requests
API_KEY = "your-api-key"
ZONE = "web_unlocker1"
url = "https://api.brightdata.com/request"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
payload = {
"url": "https://quotes.toscrape.com/",
"zone": ZONE,
"format": "raw",
"data_format": "markdown"
}
response = requests.post(url, headers=headers, json=payload)
print(response.text)
Dieses Mal geht unsere Anfrage an https://api.brightdata.com/request.
Alles wird durch unsere Header
und Payload
gesteuert.
Hier sind unsere Überschriften
:
- “
Autorisierung": f "Bearer {API_KEY}"
: Damit wird die Anfrage mit Ihrem Bright Data-Konto verknüpft. "Content-Type": "application/json"
: Dies teilt dem Server mit, dass wir Daten im JSON-Format senden.
Werfen Sie nun einen Blick auf die Nutzlast
:
"url"
: Die URL, auf die wir mit Web Unlocker zugreifen möchten."Zone"
: Der Zonenname, den Sie Ihrer Instanz von Web Unlocker gegeben haben."Format"
: Das gewünschte Antwortformat (in diesem Fall raw)- “
data_format"
: Wir verwenden “markdown” – damit wird Bright Data mitgeteilt, dass die Seite im Markdown-Format geparst werden soll. Es ist nicht ganz so flexibel wie JSON, kann aber leicht in JSON konvertiert werden.
Hier ist die Terminalausgabe, nachdem die Seite in Markdown konvertiert wurde.
# [Quotes to Scrape](/)
[Login](/login)
“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.” by Albert Einstein [(about)](/author/Albert-Einstein)
Tags: [change](/tag/change/page/1/) [deep-thoughts](/tag/deep-thoughts/page/1/) [thinking](/tag/thinking/page/1/) [world](/tag/world/page/1/)
“It is our choices, Harry, that show what we truly are, far more than our abilities.” by J.K. Rowling [(about)](/author/J-K-Rowling)
Tags: [abilities](/tag/abilities/page/1/) [choices](/tag/choices/page/1/)
“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.” by Albert Einstein [(about)](/author/Albert-Einstein)
Tags: [inspirational](/tag/inspirational/page/1/) [life](/tag/life/page/1/) [live](/tag/live/page/1/) [miracle](/tag/miracle/page/1/) [miracles](/tag/miracles/page/1/)
“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.” by Jane Austen [(about)](/author/Jane-Austen)
Tags: [aliteracy](/tag/aliteracy/page/1/) [books](/tag/books/page/1/) [classic](/tag/classic/page/1/) [humor](/tag/humor/page/1/)
“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.” by Marilyn Monroe [(about)](/author/Marilyn-Monroe)
Tags: [be-yourself](/tag/be-yourself/page/1/) [inspirational](/tag/inspirational/page/1/)
“Try not to become a man of success. Rather become a man of value.” by Albert Einstein [(about)](/author/Albert-Einstein)
Tags: [adulthood](/tag/adulthood/page/1/) [success](/tag/success/page/1/) [value](/tag/value/page/1/)
“It is better to be hated for what you are than to be loved for what you are not.” by André Gide [(about)](/author/Andre-Gide)
Tags: [life](/tag/life/page/1/) [love](/tag/love/page/1/)
“I have not failed. I've just found 10,000 ways that won't work.” by Thomas A. Edison [(about)](/author/Thomas-A-Edison)
Tags: [edison](/tag/edison/page/1/) [failure](/tag/failure/page/1/) [inspirational](/tag/inspirational/page/1/) [paraphrased](/tag/paraphrased/page/1/)
“A woman is like a tea bag; you never know how strong it is until it's in hot water.” by Eleanor Roosevelt [(about)](/author/Eleanor-Roosevelt)
Tags: [misattributed-eleanor-roosevelt](/tag/misattributed-eleanor-roosevelt/page/1/)
“A day without sunshine is like, you know, night.” by Steve Martin [(about)](/author/Steve-Martin)
Tags: [humor](/tag/humor/page/1/) [obvious](/tag/obvious/page/1/) [simile](/tag/simile/page/1/)
* [Next →](/page/2/)
## Top Ten tags
[love](/tag/love/) [inspirational](/tag/inspirational/) [life](/tag/life/) [humor](/tag/humor/) [books](/tag/books/) [reading](/tag/reading/) [friendship](/tag/friendship/) [friends](/tag/friends/) [truth](/tag/truth/) [simile](/tag/simile/)
Quotes by: [GoodReads.com](https://www.goodreads.com/quotes)
M
Bei der Authentifizierung wird eine eindeutige Kennung verwendet – in der Regel ein API-Schlüssel. In diesem Fall haben wir uns Zugang zu Web Unlocker verschafft, aber das Prinzip ist das gleiche, egal welchen API-Dienst Sie verwenden.
Umgang mit der Antwort
Jede Antwort enthält einen Statuscode. Statuscodes werden verwendet, um verschiedene Nachrichten an den Kunden weiterzuleiten. In einer perfekten Welt würden Sie immer einen Status 200
erhalten.
Leider ist die Welt nicht perfekt. Wenn Sie einen Nicht-200-Code erhalten, bedeutet dies, dass etwas nicht stimmt.
- 400-499: Diese Codes deuten in der Regel auf einen Fehler auf der Client-Seite hin. Überprüfen Sie Ihren API-Schlüssel und Ihr Anfrageformat.
- 500-599: Dieser Bereich weist auf einen Serverfehler hin. Ihre Anfrage war in Ordnung, aber der Server konnte sie aus dem einen oder anderen Grund nicht abschließen.
Mehr über Statuscodes erfahren Sie hier. Wenn Sie lernen möchten, wie Sie diese Statuscodes mit Python behandeln können, werfen Sie einen Blick auf diesen Leitfaden zur Wiederholungslogik.
Das Überspringen der Boilerplate mit einem SDK
Mit einem SDK (Software Development Kit) können wir eine Verbindung zu einer REST-API herstellen, ohne Boilerplate für Fehlerbehandlung und Wiederholungslogik schreiben zu müssen. Die OpenAI API bietet ebenfalls eine vollständige REST-API. Sie können sie sich hier ansehen.
Um das SDK zu installieren und die HTTP-Anfragen zu überspringen, führen Sie den folgenden Befehl aus.
pip install openai
Jetzt importieren wir das OpenAI SDK. Wir rufen die einfache alte HTML-Seite ab, wie wir es anfangs getan haben. Wenn Sie daran interessiert sind, HTML manuell zu parsen, können Sie lernen , wie man Requests mit BeautifulSoup verwendet. Sobald wir die HTML-Seite abgerufen haben, verwenden wir das SDK, um die Seite zum Parsen an ChatGPT zu übergeben.
from openai import OpenAI
import requests
OPENAI_API_KEY = "sk-your-openai-api-key"
response = requests.get("https://quotes.toscrape.com")
html_page = response.text
client = OpenAI(api_key=OPENAI_API_KEY)
chat = client.chat.completions.create(
messages=[
{
"role": "user",
"content": f"Parse the quotes from the following page. I want JSON only--zero commentary from you, here's the page: {html_page}",
}
],
model="gpt-4o-mini",
)
reply = chat.choices[0].message.content
print(f"ChatGPT: {reply}")
Werfen Sie diesmal einen Blick auf die Ausgabe. Kein Parsing erforderlich – nur Daten innerhalb eines json-Blocks.
[
{
"text": "The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.",
"author": "Albert Einstein",
"tags": ["change", "deep-thoughts", "thinking", "world"]
},
{
"text": "It is our choices, Harry, that show what we truly are, far more than our abilities.",
"author": "J.K. Rowling",
"tags": ["abilities", "choices"]
},
{
"text": "There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.",
"author": "Albert Einstein",
"tags": ["inspirational", "life", "live", "miracle", "miracles"]
},
{
"text": "The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.",
"author": "Jane Austen",
"tags": ["aliteracy", "books", "classic", "humor"]
},
{
"text": "Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.",
"author": "Marilyn Monroe",
"tags": ["be-yourself", "inspirational"]
},
{
"text": "Try not to become a man of success. Rather become a man of value.",
"author": "Albert Einstein",
"tags": ["adulthood", "success", "value"]
},
{
"text": "It is better to be hated for what you are than to be loved for what you are not.",
"author": "André Gide",
"tags": ["life", "love"]
},
{
"text": "I have not failed. I've just found 10,000 ways that won't work.",
"author": "Thomas A. Edison",
"tags": ["edison", "failure", "inspirational", "paraphrased"]
},
{
"text": "A woman is like a tea bag; you never know how strong it is until it's in hot water.",
"author": "Eleanor Roosevelt",
"tags": ["misattributed-eleanor-roosevelt"]
},
{
"text": "A day without sunshine is like, you know, night.",
"author": "Steve Martin",
"tags": ["humor", "obvious", "simile"]
}
]
SDKs bieten Ihnen die volle Leistung einer REST-API, ohne dass Sie HTTP manuell verwalten müssen. Wenn Sie lernen möchten, wie man mit KI scrapt, werfen Sie einen Blick auf unsere Anleitungen für Claude und DeepSeek.
Schlussfolgerung
Nachdem Sie nun wissen, wie man mit Python grundlegende API-Anfragen stellt, können Sie sich an größere Projekte machen. Sie können APIs verwenden, um mit verschiedenen Diensten zu interagieren und Daten abzurufen, und Sie können sogar ein SDK verwenden, um diese Daten automatisch zu parsen. In diesem Lernprogramm haben wir Web Unlocker verwendet, aber Bright Data bietet eine Vielzahl anderer Produkte an, die Ihnen bei Ihren Datenanforderungen helfen.
- Proxies für Privatpersonen: Leiten Sie Ihren HTTP-Verkehr über echte Geräte mit privaten IP-Adressen.
- Scraper-API: Automatisieren Sie Ihren Scrape vollständig und laden Sie die Ergebnisse direkt in Ihre Programmierumgebung herunter.
- Scraping-Browser: Umgehen Sie CAPTCHAs und steuern Sie einen echten Headless-Browser direkt aus Ihrem Python-Skript heraus.
Melden Sie sich für eine kostenlose Testversion an und legen Sie noch heute los!
Keine Kreditkarte erforderlich