Como fazer chamadas de API com Python em 2025

Aprenda técnicas modernas de GET/POST, analise JSON e aproveite os SDKs para fazer chamadas eficientes à API do Python.
14 min de leitura
How to make API calls using Python blog image

Neste guia, abordaremos os seguintes conceitos de uso da API com Python:

  1. O que é HTTP?
  2. O que é uma API REST?
  3. Como fazer uma solicitação GET
  4. Como fazer uma solicitação POST
  5. Como usar um SDK

O que é HTTP?

O HTTP (Hypertext Transfer Protocol) é o padrão para a forma como a maioria dos dados trafega na Web. Você provavelmente já ouviu falar que os bancos de dados compõem o backend da maioria dos sites, e isso é verdade, mas há nuances na forma como nosso cliente (navegador ou script Python) interage com o banco de dados. O HTTP é a camada de comunicação entre o cliente e o servidor de back-end.

Ao usar HTTP para raspagem e APIs da Web, esses são os métodos que você provavelmente usará.

  • GET: De longe, o método mais comumente usado. Sempre que você visita um site, seu navegador executa um GET para o HTML e, em seguida, renderiza a página para que você a visualize.
  • POST: Esse é o segundo método mais comum. O POST é usado para transferir corpos maiores de dados com segurança e, na maioria das vezes, para adicionar algo a um banco de dados. Quando você preenche formulários e pesquisas ou publica em mídias sociais, está fazendo uma solicitação POST.
  • PUT: As solicitações PUT são usadas para atualizar itens existentes em um banco de dados. Quando você edita uma publicação de mídia social, o PUT é usado nos bastidores.
  • DELETE: se desejar excluir uma publicação de mídia social (ou qualquer outra coisa de um banco de dados), seu navegador enviará uma solicitação DELETE ao servidor para removê-la.

HTTP e sua falta de padrões de retorno

Apesar de toda a sua simplicidade, o HTTP não tem um padrão de retorno universal. Alguns servidores retornam HTML por padrão, enquanto outros retornam JSON ou até mesmo estruturas de dados legadas, como XML e texto simples.

Primeiro, vamos fazer uma solicitação GET básica. Se você ainda não tiver o Python Requests instalado, poderá instalá-lo via pip.

pip install requests

Depois de instalar o Requests, você pode executar o código a seguir para fazer um GET simples. Preste atenção na saída do terminal.

import requests

response = requests.get("https://quotes.toscrape.com")

print(response.text)

Depois de executar o código, você deve perceber que temos uma página HTML. Isso é ótimo para visualização no navegador, mas no terminal é muito feio. O resultado abaixo foi cortado, mas você entendeu a ideia.

<!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>

As páginas HTML foram criadas para serem lidas e renderizadas pelos navegadores. Elas não foram projetadas para serem lidas ou integradas ao seu código.

Como o REST (Representational State Transfer) corrige isso

As APIs REST nos fornecem um padrão de design para pipelines de dados. O JSON é, de longe, o tipo de retorno mais popular nas APIs REST. Ele é flexível e fácil de ler. Essa sintaxe clara e legível também facilita a análise em seu ambiente de programação.

Dê uma olhada abaixo para ver a aparência real do JSON. Lembre-se de que usamos uma API REST para obter esse tipo de estrutura de dados.

{
    "name": "Jake",
    "age": 34,
    "professions": ["writing", "coding"]
}

As APIs REST usam pontos de extremidade, parâmetros e métodos HTTP para controlar os dados de retorno e seu formato.

Como fazer sua primeira solicitação de API

Agora que você sabe o que uma API REST deve fazer, vamos tentar usar uma. O Quotes to Scrape também tem uma API REST. Em vez de simplesmente buscar a página inicial, agora acessaremos a API deles. Estamos nos comunicando com o servidor por meio de pontos de extremidade.

Nosso endpoint completo /api/quotes pode ser dividido em duas partes.

  1. /api: Isso informa ao servidor que queremos dados de API estruturados, não páginas HTML.
  2. /quotes: Queremos que a API retorne dados do endpoint de cotações.

Como fazer a solicitação

Vá em frente e execute o código como fez antes.

import requests
import json

response = requests.get("https://quotes.toscrape.com/api/quotes")

print(json.dumps(response.json(), indent=4))

Nossos dados agora retornam limpos e estruturados. É fácil analisá-los e, a partir daí, podemos fazer praticamente qualquer coisa com eles.

{
    "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
        ]
    ]
}

Fazer uma solicitação autenticada

Agora que já vimos como solicitar dados públicos, vamos dar uma olhada nas APIs autenticadas. Em muitos casos, você precisará de uma chave de API para obter seus dados. A maioria dos servidores de API exige um cabeçalho de autorização com sua chave de API para autenticar sua solicitação.

Fazer uma solicitação GET básica é muito fácil. Agora, tentaremos fazer uma solicitação POST. As solicitações POST são usadas para lidar com cargas maiores de informações de forma segura. No código abaixo, usamos a API do Web Unlocker para analisar a página e retornar o markdown.

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)

Desta vez, nossa solicitação será enviada para https://api.brightdata.com/request. Tudo é controlado por nossos cabeçalhos e carga útil.

Aqui estão nossos cabeçalhos:

  • "Authorization": f "Bearer {API_KEY}": Isso vincula a solicitação à sua conta da Bright Data.
  • "Content-Type": "application/json": Isso informa ao servidor que estamos enviando dados no formato JSON.

Agora, dê uma olhada na carga útil:

  • "url": A url que desejamos acessar com o Web Unlocker.
  • "zone" (zona): O nome da zona que você deu à sua instância do Web Unlocker.
  • "format" (formato): O formato de resposta que desejamos (neste caso, bruto)
  • "data_format": Usamos “markdown” – isso informa à Bright Data que queremos que a página seja analisada no formato markdown. Ele não é tão flexível quanto o JSON, mas pode ser convertido em JSON facilmente.

Aqui está a saída do terminal agora que a página foi convertida em 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

A autenticação usa um identificador exclusivo, geralmente uma chave de API. Neste caso, obtivemos acesso ao Web Unlocker, mas o princípio é o mesmo, independentemente do serviço de API que você estiver usando.

Como lidar com a resposta

Cada resposta inclui um código de status. Os códigos de status são usados para retransmitir mensagens diferentes de volta ao cliente. Em um mundo perfeito, você sempre receberá um status 200.

Infelizmente, o mundo não é perfeito. Se você receber um código não-200, isso significa que algo está errado.

  • 400-499: Esses códigos normalmente implicam em um erro no lado do cliente. Verifique novamente sua chave de API e o formato da solicitação.
  • 500-599: Esse intervalo indica um erro do servidor. Sua solicitação estava correta, mas o servidor não pôde concluí-la por um motivo ou outro.

Você pode saber mais sobre códigos de status aqui. Se quiser saber como lidar com esses códigos de status no Python, dê uma olhada neste guia sobre lógica de repetição.

Ignorando o boilerplate com um SDK

Um SDK (kit de desenvolvimento de software) permite que nos conectemos a uma API REST sem precisar escrever um boilerplate para tratamento de erros e lógica de repetição. A API da OpenAI também oferece uma API REST completa. Você pode dar uma olhada nela aqui.

Para instalar o SDK e ignorar as solicitações HTTP, execute o seguinte comando.

pip install openai

Agora, importamos o OpenAI SDK. Buscamos a página HTML antiga e simples como fizemos inicialmente. Se estiver interessado em analisar o HTML manualmente, você pode aprender a usar o Requests com o BeautifulSoup. Depois de recuperarmos a página HTML, usamos o SDK para passar a página para o ChatGPT para análise.

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}")

Dê uma olhada no resultado desta vez. Não é necessária nenhuma análise – apenas dados dentro de um bloco 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"]
    }
]

Os SDKs oferecem a você todo o poder de uma API REST sem a necessidade de gerenciamento manual de HTTP. Se estiver interessado em aprender a fazer scraping com IA, dê uma olhada em nossos guias do Claude e do DeepSeek.

Conclusão

Agora que você sabe como fazer solicitações básicas de API com Python, pode passar para projetos maiores. Você pode usar APIs para interagir com vários serviços para recuperar dados e pode até utilizar um SDK para analisar automaticamente esses dados. Neste tutorial, usamos o Web Unlocker, mas a Bright Data oferece uma variedade de outros produtos para ajudar com suas necessidades de dados.

  • Proxies residenciais: Roteie seu tráfego HTTP por meio de dispositivos reais com endereços IP residenciais.
  • API do raspador: Automatize completamente seu scrape e baixe os resultados diretamente para seu ambiente de programação.
  • Navegador de raspagem: Ignore CAPTCHAs e controle um navegador real sem cabeça diretamente do seu script Python.

Inscreva-se para uma avaliação gratuita e comece hoje mesmo!

Não é necessário cartão de crédito