PHP ile başka sitelerden veri çekmek
Bu yazı 2020 yılından. Anlatılan sürümler, fiyatlar ve adresler o günden bu yana değişmiş olabilir.
Herkesin bir gün işine yarayacak bir konu: başka bir siteden veri çekip kendi sitenizde göstermek. Bu bir döviz kuru, bir hava durumu ya da başka bir bilgi olabilir. Bu yazıda bunun iki yolunu anlatacağım; hangisini seçeceğiniz veriyi çektiğiniz siteye bağlı.
Güncelleme (Kasım 2026): Bu yazının eski halinde veriyi file_get_contents ve regex (düzenli ifade) ile çekiyordum. O yöntem çalışır ama kırılgandır: karşı sitenin tasarımı azıcık değişince kodunuz bozulur. Daha sağlam yolları ekledim.
En iyi yol: varsa API kullanın
Veri çekmeden önce şunu kontrol edin: çekmek istediğiniz bilgiyi sunan bir API var mı? Döviz, hava durumu, döviz/kripto gibi veriler için bedava API'ler mevcut. API, veriyi size doğrudan düzenli (genelde JSON) biçimde verir; sayfanın HTML'iyle uğraşmazsınız ve site tasarımını değiştirse bile kodunuz bozulmaz.
Bir döviz API'sinden veri çekmek bu kadar basit:
<?php
$json = file_get_contents('https://api.ornek-doviz.com/latest?base=USD');
$veri = json_decode($json, true);
echo "Dolar: " . $veri['rates']['TRY'];Buradaki adres sadece örnek; kullanacağınız API'nin kendi adresini ve döndürdüğü alan adlarını onun belgelerinden öğrenirsiniz. Bir veri için API varsa, aşağıdaki HTML kazıma yöntemine hiç gerek kalmaz.
API yoksa: cURL + DOMXPath ile kazıma
Bazı sitelerin API'si olmaz; o zaman sayfanın HTML'inden veriyi ayıklamak (scraping) gerekir. Burada iki şeye dikkat edin:
- Sayfayı çekmek için
file_get_contentsyerine cURL kullanın. cURL daha güvenilirdir, zaman aşımı koyabilir, hata yakalayabilir ve bir User-Agent gönderebilirsiniz (birçok site kendini tanıtmayan isteklere cevap vermez). - HTML'den veri ayıklamak için regex yerine DOMXPath kullanın. Regex ile HTML ayıklamak kırılgandır; DOMXPath sayfayı tıpkı tarayıcı gibi anlayıp istediğiniz elemanı adresleyerek bulur.
Örnek olarak bir sayfadaki menu-row2 sınıflı elemanları çekelim:
<?php
$hedef = 'https://www.ornek-site.com/';
// 1) sayfayı cURL ile çek
$ch = curl_init($hedef);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_USERAGENT => 'Mozilla/5.0 (veri-cekme-botu)',
]);
$html = curl_exec($ch);
if ($html === false) {
die('Sayfa çekilemedi: ' . curl_error($ch));
}
curl_close($ch);
// 2) HTML'i DOMXPath ile ayıkla
$dom = new DOMDocument();
@$dom->loadHTML($html); // başka sitenin HTML'i kusurlu olabilir, uyarıları susturuyoruz
$xpath = new DOMXPath($dom);
$veri = [];
foreach ($xpath->query("//span[contains(@class,'menu-row2')]") as $node) {
$veri[] = trim($node->textContent);
}Burada $veri artık sayfadaki o elemanların içindeki metinleri sırayla tutan bir dizi. İstediğiniz sitede span ve menu-row2 yerine kendi hedef elemanınızın etiketini ve sınıfını yazacaksınız (sayfada sağ tık > "Öğeyi incele" ile hangi etikette olduğunu bulabilirsiniz).
Çektiğimiz veriyi göstermek
<a class="kur"><b>Altın</b> <?= $veri[0] ?? '-' ?></a>
<a class="kur"><b>$</b> <?= $veri[1] ?? '-' ?></a>
<a class="kur"><b>€</b> <?= $veri[2] ?? '-' ?></a>Buradaki $veri[0], $veri[1] gibi numaralar sayfadaki sıralamayı gösterir: 0 ilk eşleşen eleman, 1 ikinci, böyle devam eder. Sonundaki ?? '-' ise veri gelmezse hata yerine tire göstersin diye; karşı site erişilemez olduğunda sayfanız çökmez.
Dikkat edilmesi gerekenler
- Her veriyi her istekte baştan çekmeyin. Karşı siteye saniyede onlarca istek atarsanız hem onları yorarsınız hem de IP'niz engellenebilir. Çektiğiniz veriyi kendi tarafınızda birkaç dakika saklayıp (önbellek) oradan gösterin.
- Sitenin kurallarına saygı gösterin. Kazıdığınız sitenin kullanım şartlarına ve
robots.txtdosyasına aykırı davranmayın; başkasının içeriğini kendi içeriğinizmiş gibi yayınlamayın. Zaten çoğu durumda doğru yol, en baştaki API yöntemidir.