pythonapirequestsjsonMahir4 mnt baca

Dari API ke DataFrame

Ambil data JSON dari API publik dengan requests, ubah jadi DataFrame siap analisis.

API itu seperti jendela drive-thru

Bayangkan restoran cepat saji: kamu tidak masuk ke dapur, kamu memesan lewat jendela kecil, lalu menerima bungkusan makanan. API bekerja persis seperti itu. Kamu (program Python-mu) mengirim request HTTP lewat "jendela" (URL endpoint), dan server membalas dengan bungkusan data, biasanya berformat JSON. Kamu tidak perlu tahu database apa yang dipakai server, cukup tahu cara memesan yang benar.

Kenapa analyst modern wajib bisa ambil data dari API

Dulu data analyst menunggu file Excel dikirim via email. Sekarang sumber data terbaik justru hidup di balik API: data produk marketplace, harga kurs terkini, cuaca, data terbuka pemerintah, sampai metrik media sosial. Analyst yang hanya bisa membaca CSV terbatas pada data yang disediakan orang lain. Analyst yang bisa menarik data dari API bisa membangun dataset sendiri kapan pun dibutuhkan, dan itu pembeda besar di dunia kerja.

Contoh minimal: request pertama

Pakai requests, library standar untuk HTTP di Python, ke API dummy gratis JSONPlaceholder:

python
import requests

res = requests.get("https://jsonplaceholder.typicode.com/users")
print(res.status_code)  # 200 = sukses
data = res.json()       # ubah JSON jadi list of dict
print(len(data))        # 10 user
print(data[0]["name"])  # 'Leanne Graham'

Selalu cek status_code dulu sebelum memproses: 200 sukses, 404 tidak ketemu, 429 kebanyakan request (kena rate limit).

Contoh realistis: ambil dengan aman, lalu analisis

Kode di atas rapuh untuk dipakai sungguhan: tidak ada timeout (request bisa menggantung selamanya), tidak ada penanganan error, dan struktur JSON diasumsikan selalu benar. Versi yang siap dipakai:

python
import os
import time
import requests
import pandas as pd

def ambil_data(url, params=None):
    try:
        res = requests.get(
            url,
            params=params,
            headers={"Authorization": "Bearer " + os.getenv("API_KEY", "")},
            timeout=10,              # jangan menggantung lebih dari 10 detik
        )
        res.raise_for_status()       # lempar error untuk status 4xx/5xx
        return res.json()
    except requests.RequestException as e:
        print("Gagal ambil data:", e)
        return []

posts = ambil_data("https://jsonplaceholder.typicode.com/posts")
df = pd.DataFrame(posts)
print(df.groupby("userId").size().sort_values(ascending=False).head(3))
# userId mana yang paling rajin posting?
time.sleep(1)  # jeda sopan antar request, hormati rate limit

Dari request mentah sampai insight dalam satu fungsi yang bisa dipakai ulang. Inilah workflow analyst modern: API sebagai sumber data, pandas sebagai mesin analisis.

JSON bersarang? Ratakan dulu

Sering kolom hasil API berisi dictionary di dalam dictionary. pd.DataFrame biasa akan menampilkan kolom itu sebagai objek mentah. Pakai json_normalize untuk meratakannya:

python
users = ambil_data("https://jsonplaceholder.typicode.com/users")
flat = pd.json_normalize(users)
print(flat[["name", "email", "address.city", "address.zipcode"]].head(3))

Kolom address.city sekarang bisa difilter dan di-groupby seperti kolom biasa.

Jebakan 1: request tanpa timeout dan error handling

SALAH:

python
res = requests.get(url)
data = res.json()  # kalau server mati, baris ini error; kalau lambat, menggantung selamanya

BENAR:

python
try:
    res = requests.get(url, timeout=10)
    res.raise_for_status()
    data = res.json()
except requests.RequestException as e:
    print("Gagal:", e)
    data = []

Internet itu tidak bisa diandalkan: server down, koneksi putus, API berubah. Kode tanpa penanganan error akan crash di tengah pipeline dan merusak seluruh analisis. Selalu bungkus request dengan try/except dan beri timeout.

Jebakan 2: mengasumsikan isi JSON dan hardcode API key

SALAH:

python
API_KEY = "sk-live-abc123"      # key bocor kalau kode di-push ke GitHub!
kota = data["address"]["city"]  # KeyError kalau strukturnya beda

BENAR:

python
API_KEY = os.getenv("API_KEY")  # simpan di environment variable / file .env
kota = data.get("address", {}).get("city", "tidak diketahui")

API key yang ter-hardcode dan ter-push ke GitHub bisa disalahgunakan orang dalam hitungan menit, dan tagihannya lari ke kamu. Untuk struktur JSON yang tidak pasti, pakai .get() berantai dengan nilai default supaya kode tidak crash saat satu field hilang.

Catatan teknis: API nyata hampir selalu punya rate limit (misalnya 100 request per jam). Kalau butuh mengambil banyak halaman, tambahkan time.sleep(1) antar request dan tangani status 429 dengan menunggu lalu mencoba lagi. Dokumentasi API selalu mencantumkan batasnya, baca dulu sebelum menulis kode.

Tantangan

Analisis postingan API

Ambil data dari https://jsonplaceholder.typicode.com/comments, ubah jadi DataFrame, lalu jawab: postId mana yang punya komentar terbanyak? Tampilkan 3 teratas dengan jumlahnya.