Daha önceki derslerde Google Finans'tan HTML scraping ile fiyat çekmiştik. Kripto paralar için ise çok daha temiz bir alternatif var: CoinGecko'nun kimlik doğrulama gerektirmeyen ücretsiz public API'si. API kullanmak, HTML yapısı her değiştiğinde kodun bozulma riskini ortadan kaldırır.
Basit Bir Fiyat Sorgusu
import requests
url = "https://api.coingecko.com/api/v3/simple/price"
params = {
"ids": "bitcoin,ethereum",
"vs_currencies": "usd,try",
}
response = requests.get(url, params=params)
veri = response.json()
print(veri)
Bu istek, bitcoin ve ethereum'un hem dolar hem TL karşılığını tek seferde döndürür:
print(f"Bitcoin: {veri['bitcoin']['usd']} USD / {veri['bitcoin']['try']} TL")
24 Saatlik Değişim ve Hacmi Dahil Etmek
params = {
"ids": "bitcoin",
"vs_currencies": "usd",
"include_24hr_change": "true",
"include_24hr_vol": "true",
"include_market_cap": "true",
}
response = requests.get(url, params=params)
veri = response.json()["bitcoin"]
print(f"Fiyat: {veri['usd']} USD")
print(f"24 Saatlik Değişim: %{veri['usd_24h_change']:.2f}")
print(f"24 Saatlik Hacim: {veri['usd_24h_vol']:,.0f} USD")
print(f"Piyasa Değeri: {veri['usd_market_cap']:,.0f} USD")
Coin Adı Yerine Coin ID Kullanmak
CoinGecko, coin'leri sembol (BTC) yerine kendi id alanıyla (bitcoin) tanımlar — çünkü aynı sembolü kullanan birden fazla farklı coin olabilir. Hangi coin'in hangi id'ye sahip olduğunu şu uç noktadan öğrenebilirsiniz:
liste = requests.get("https://api.coingecko.com/api/v3/coins/list").json()
for coin in liste:
if coin["symbol"] == "btc":
print(coin)
En Çok Yükselen/Düşen Coinleri Listelemek
url = "https://api.coingecko.com/api/v3/coins/markets"
params = {
"vs_currency": "usd",
"order": "market_cap_desc",
"per_page": 10,
"page": 1,
}
coinler = requests.get(url, params=params).json()
for coin in coinler:
print(f"{coin['name']}: {coin['current_price']} USD (%{coin['price_change_percentage_24h']:.2f})")
İstek Sınırlarına Dikkat
CoinGecko'nun ücretsiz katmanı, dakikada belirli sayıda istekle sınırlıdır. Sürekli çalışan bir bot yazıyorsanız, isteklerinizin arasına time.sleep(...) ile makul bir bekleme koymanız — hem sınıra takılmamak hem de servise aşırı yük bindirmemek için önemlidir.
Sırada Ne Var?
Sırada, çektiğimiz bu tür fiyat verilerini matplotlib ile grafiğe dökmeyi ve PNG olarak kaydetmeyi göreceğiz.