Dans ce guide, nous allons aborder les concepts suivants de l’utilisation des API avec Python :
- Qu’est-ce que HTTP ?
- Qu’est-ce qu’une API REST ?
- Comment faire une demande GET
- Comment effectuer une requête POST
- Comment utiliser un SDK
Qu’est-ce que HTTP ?
Le protocole HTTP (Hypertext Transfer Protocol) est la norme qui permet à la plupart des données de circuler sur le web. Vous avez probablement entendu dire que les bases de données constituent le backend de la plupart des sites web – et c’est vrai, mais il existe des nuances dans la manière dont notre client (navigateur ou script Python) interagit réellement avec la base de données. Le protocole HTTP est la couche de communication entre le client et le serveur dorsal.
Lorsque vous utilisez HTTP pour le scraping et les API web, ce sont les méthodes que vous êtes le plus susceptible d’utiliser.
- GET: C’est de loin la méthode la plus utilisée. Chaque fois que vous visitez un site, votre navigateur effectue un GET pour l’HTML, puis rend la page pour que vous puissiez la voir.
- POST: C’est la deuxième méthode la plus courante. POST est utilisée pour transférer de grandes quantités de données en toute sécurité – et le plus souvent pour ajouter quelque chose à une base de données. Lorsque vous remplissez des formulaires et des enquêtes ou que vous publiez sur les médias sociaux, vous effectuez une requête POST.
- PUT: Les requêtes PUT sont utilisées pour mettre à jour des éléments existants dans une base de données. Lorsque vous modifiez un message sur un média social, PUT est utilisé sous le capot.
- DELETE: si vous souhaitez supprimer un message publié sur un média social (ou tout autre élément d’une base de données), votre navigateur envoie une demande DELETE au serveur pour le supprimer.
HTTP et son absence de normes de retour
Malgré sa simplicité, le protocole HTTP ne dispose pas d’une norme de retour universelle. Certains serveurs renvoient du HTML par défaut, tandis que d’autres recrachent du JSON ou même d’anciennes structures de données comme le XML et le texte brut.
Tout d’abord, faisons une requête GET basique. Si vous n’avez pas encore installé Python Requests, vous pouvez le faire via pip.
pip install requests
Une fois Requests installé, vous pouvez exécuter le code suivant pour réaliser un simple GET. Prêtez attention à la sortie du terminal.
import requests
response = requests.get("https://quotes.toscrape.com")
print(response.text)
Après avoir exécuté le code, vous devriez remarquer que nous avons une page HTML. C’est très bien pour le navigateur, mais dans le terminal, c’est plutôt laid. La sortie ci-dessous a été coupée, mais vous voyez l’idée.
<!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>
Les pages HTML sont destinées à être lues et rendues par les navigateurs. Elles ne sont pas conçues pour être lues ou intégrées dans votre code.
Comment REST (Representational State Transfer) résout ce problème
Les API REST constituent une norme de conception pour les pipelines de données. JSON est de loin le type de retour le plus populaire avec les API REST. Il est flexible et facile à lire. Cette syntaxe claire et lisible facilite également l’analyse à partir de votre environnement de programmation.
Jetez un coup d’œil ci-dessous pour voir à quoi ressemble JSON. N’oubliez pas que nous utilisons une API REST pour obtenir ce type de structure de données.
{
"name": "Jake",
"age": 34,
"professions": ["writing", "coding"]
}
Les API REST utilisent des points de terminaison, des paramètres et des méthodes HTTP pour contrôler les données renvoyées et leur format.
Faire sa première demande d’API
Maintenant que vous savez ce qu’une API REST est censée faire, essayons d’en utiliser une. Quotes to Scrape possède également une API REST. Au lieu de simplement récupérer la page d’accueil, nous allons maintenant accéder à leur API. Nous communiquons avec le serveur par l’intermédiaire de points d’extrémité.
Notre point d’accès complet /api/quotes
peut être divisé en deux parties.
/api
: Cela indique au serveur que nous voulons des données API structurées, et non des pages HTML./quotes
: Nous voulons que l’API renvoie des données à partir du point de terminaisonquotes
.
Faire la demande
Exécutez le code comme vous l’avez fait précédemment.
import requests
import json
response = requests.get("https://quotes.toscrape.com/api/quotes")
print(json.dumps(response.json(), indent=4))
Nos données nous reviennent désormais propres et structurées. Elles sont faciles à analyser et, à partir de là, nous pouvons faire à peu près n’importe quoi avec elles.
{
"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
]
]
}
Faire une demande authentifiée
Maintenant que nous avons vu comment demander des données publiques, examinons les API authentifiées. Dans de nombreux cas, vous aurez besoin d’une clé d’API pour obtenir vos données. La plupart des serveurs d’API exigent un en-tête Authorization
contenant votre clé d’API pour authentifier votre demande.
Il est assez facile d’effectuer une requête GET de base. Nous allons maintenant essayer de faire une requête POST. Les requêtes POST sont utilisées pour gérer de plus grandes quantités d’informations en toute sécurité. Dans le code ci-dessous, nous utilisons l’API Web Unlocker pour analyser la page et renvoyer du texte en majuscules.
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)
Cette fois-ci, notre requête est adressée à https://api.brightdata.com/request.
Tout est contrôlé par nos en-têtes
et notre charge utile
.
Voici nos en-têtes
:
- “
Authorization" : f "Bearer {API_KEY}"
: Ceci lie la demande à votre compte Bright Data. "Content-Type" : "application/json"
: Cela indique au serveur que nous envoyons des données au format JSON.
Maintenant, regardez la charge utile
:
- “
url"
: L’url à laquelle nous souhaitons accéder avec Web Unlocker. - “
zone"
: Le nom de la zone que vous avez donné à votre instance de Web Unlocker. - “
format"
: Le format de réponse que nous voulons (dans ce cas, brut) "data_format"
: Nous utilisons “markdown”, ce qui indique à Bright Data que nous voulons que la page soit analysée au format markdown. Ce format n’est pas aussi flexible que JSON, mais il peut être facilement converti en JSON.
Voici la sortie du terminal maintenant que la page est convertie en markdown.
# [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
L’authentification utilise un identifiant unique, généralement une clé API. Dans ce cas, nous avons obtenu l’accès à Web Unlocker, mais le principe est le même, quel que soit le service API que vous utilisez.
Traitement de la réponse
Chaque réponse comprend un code d’état. Les codes d’état sont utilisés pour relayer différents messages au client. Dans un monde parfait, vous recevrez toujours un statut 200.
Malheureusement, le monde n’est pas parfait. Si vous recevez un code non-200, cela signifie que quelque chose ne va pas.
- 400-499 : Ces codes impliquent généralement une erreur du côté du client. Vérifiez votre clé API et le format de votre demande.
- 500-599 : Cette plage indique une erreur du serveur. Votre demande était correcte, mais le serveur n’a pas pu la traiter pour une raison ou une autre.
Vous pouvez en savoir plus sur les codes d’état ici. Si vous souhaitez apprendre à gérer ces codes d’état à partir de Python, jetez un œil à ce guide sur la logique de réessai.
Sauter le modèle de base avec un kit de développement logiciel (SDK)
Un SDK (kit de développement logiciel) nous permet de nous connecter à une API REST sans avoir à écrire un modèle pour la gestion des erreurs et la logique de réessai. L’API OpenAI propose également une API REST complète. Vous pouvez la consulter ici.
Pour installer leur SDK et ignorer les requêtes HTTP, exécutez la commande suivante.
pip install openai
Maintenant, nous importons le SDK OpenAI. Nous récupérons la vieille page HTML comme nous l’avons fait initialement. Si vous souhaitez analyser le HTML manuellement, vous pouvez apprendre à utiliser Requests avec BeautifulSoup. Une fois que nous avons récupéré la page HTML, nous utilisons le SDK pour transmettre la page à ChatGPT afin qu’elle soit analysée.
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}")
Jetez un coup d’œil à la sortie cette fois-ci. Aucune analyse n’est nécessaire, juste des données à l’intérieur d’un bloc json.
[
{
"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"]
}
]
Les SDK vous permettent de bénéficier de toute la puissance d’une API REST sans avoir à gérer manuellement le protocole HTTP. Si vous souhaitez apprendre à faire du scrape avec l’IA, jetez un œil à nos guides pour Claude et DeepSeek.
Conclusion
Maintenant que vous savez comment effectuer des requêtes API de base avec Python, vous pouvez passer à des projets plus importants. Vous pouvez utiliser les API pour interagir avec divers services afin de récupérer des données et vous pouvez même utiliser un SDK pour analyser automatiquement ces données. Dans ce tutoriel, nous avons utilisé Web Unlocker, mais Bright Data propose une variété d’autres produits pour répondre à vos besoins en matière de données.
- Proxies résidentiels: Acheminez votre trafic HTTP par l’intermédiaire d’appareils réels dotés d’adresses IP résidentielles.
- Scraper API: Automatisez complètement votre recherche et téléchargez les résultats directement dans votre environnement de programmation.
- Scraping Browser: Contournez les CAPTCHAs et contrôlez un véritable navigateur sans tête depuis votre script Python.
Inscrivez-vous pour un essai gratuit et commencez dès aujourd’hui !
Aucune carte de crédit requise