PHP ile Akakçe.com'daki fiyatları çekme

Radebaugh

Hectopat
Katılım
5 Mayıs 2020
Mesajlar
2.049
Makaleler
1
Çözümler
6
Son düzenleyen: Moderatör:
Örnek yapabilir misin?
PHP:
<?php
$veri = file_get_contents("https://www.dgknbzglu.com");
preg_match_all('@<div class="price_footer">(.*?) (.*?)₺@si',$veri,$dlinkcek);

/*
echo "<pre>";
print_r($dlinkcek);
echo "</pre>";
*/
echo $toplam=$dlinkcek[0][3];
?>
<!DOCTYPE html>
<html>
<head>
    <title>Fiyat Çek</title>
    <meta charset="utf-8">
</head>
<body>
</body>
</html>

Bu şekilde herhangi bir siteden veri çekebilirsin ama Akakçe.com buna izin vermemiş. Denediğimde hata aldım, başka bir siteden istersen tekrar denerim.
Kodun açılımına gelirsek 2. satıra site adresini yazıyorsun.
3. satırda girdiğim yere div veya hangi etiket kullanılmışsa o etiketi girip ₺ bıraktığım yere de rakamın sonunda gelen bir ibare varsa onu girip orada kesilmesini sağlıyorsun.
Kodun çalışır hali ile 10. satırda kendi sitemdeki hosting fiyatlarından 4. sıradaki fiyatı çektim.
Kolay gelsin
 
Curl ile headerları taklit ederek yapabilirsiniz. Muhtemelen botları engellemek için HTTP headerlarını kontrol ediyorlardır.

image_2021-05-18_114740.png


Geliştirici araçlarından browserın kendi isteğini curl olarak kopyalayıp CMD'den bashtan göndermeyi bir deneyin. Sorun olmazsa curl isteğini PHP'ye çevirip kullanabilirsiniz. Çoğu PHP dağıtımında dahili libcurl bulunuyor. Buradaki isteği birebir oraya uyarlayabiliyorsunuz.

Bir site botları engellemeyi kafaya koyduysa tabi bu yöntem de çok geçerli olmayacaktır. Javascript ile çeşitli kontroller yapabilirler ya da bir ip'den dakikada şu kadar istek gelebilir şeklinde limit koymuş olabilirler. Bu durumda bir şey yapamazsınız çok uğraştırır.
 
Yapmaya calistiginiz isin teknik adi "web scraping". Yani kisaca bir siteden veri cekmek istiyorsunuz fakat bunun icin elinizde host tarafindan saglanan bir API yok, o yuzden de tum icerigi cekip cesitli yontemlerle (Regular expression, DOM kutuphaneleri, CSS Selectors, XPath) aldiginiz html icerigi filtreleyip sadece istediginiz sonuclari elde ediyorsunuz.

Bazi siteler bu tarz islemleri yapmanizi engelleyen cesitli mekanizmalar gelistirir. Tarayicinizdan bir siteye giris yaparken aslinda bir GET request gondermis olursunuz fakat bununla birlikte host'a ekstra bir takim bilgiler de gider. Bunlar genelde header denilen basliklarin icinde saklanir. (Ne tarz bir istemci kullaniyorsunuz, hangi web tarayici, kacinci versiyon, dil tercihi, isletim sisteminiz vesaire.) Bu tarz ekstra headerlar bir web tarayici uzerinden girdiginizde otomatik olarak GET istegine eklenir. Dolayisiyla PHP ve JS gibi dillerdeki curl, fetch api gibi araclarda ayni siteye dogrudan GET istegi attiginizda, bu ekstra headerlar olmadigi zaman karsi taraftaki site sizin gercek bir web tarayicidan ya da istemciden istek atmadiginizi anlayabilir. Bu anlattigim sadece cok basit bir algoritma. Siteler headerlarin yaninda cerezler gonderip alarak da istemci, sunucu arasinda bir veri aktarimi dolayisiyla daha karmasik dogrulama algoritmalari gelistirmis olabilir.

Kisacasi bu tur engelleri atlatmak icin de elbette cesitli yontemler var. Ilk aklima gelen sey, selenium web driver. Selenium aslinda bir tarayici taklit surucusu. Tarayici uzerinde testler yazip, otomasyon yapmaniza yariyor aslinda. Fakat tahmin edebileceginiz gibi kendinize gore programlayip web kazima (scraping) isleri icin de kullanabilirsiniz. Tipki kendiniz tarayiciya girmissiniz gibi herhangi bir butona tiklayabilir, login olabilir vs. kisacasi elle yaptiginiz bircok islemi web driver vasitasiyla programlayabilirsiniz. Bu konuyu bir arastirmanizi tavsiye ederim.
 
Curl ile headerları taklit ederek yapabilirsiniz. Muhtemelen botları engellemek için HTTP headerlarını kontrol ediyorlardır.

Eki Görüntüle 1028695

Geliştirici araçlarından browserın kendi isteğini curl olarak kopyalayıp CMD'den bashtan göndermeyi bir deneyin. Sorun olmazsa curl isteğini PHP'ye çevirip kullanabilirsiniz. Çoğu PHP dağıtımında dahili libcurl bulunuyor. Buradaki isteği birebir oraya uyarlayabiliyorsunuz.

Bir site botları engellemeyi kafaya koyduysa tabi bu yöntem de çok geçerli olmayacaktır. Javascript ile çeşitli kontroller yapabilirler ya da bir ip'den dakikada şu kadar istek gelebilir şeklinde limit koymuş olabilirler. Bu durumda bir şey yapamazsınız çok uğraştırır.
Pek anlayamadım.
Örnek yapabilirmisiniz?
 
Kurcalarken IP Ban yedim :D . Resimde gösterdiğim şekilde headerları cookieleri alıp PHP de curl a şu şekilde verebilirsiniz. Ben bir kısmını sildim sakata gelmemek adına. Burayı da takip ediyor olabilirler. Federaller peşimizde 😐.

PHP:
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://www.akakce.com/islemci/en-ucuz-intel-i5-10400f-alti-cekirdek-2-90-ghz-fiyati,732226478.html');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');

$headers = array();
$headers[] = 'Connection: keep-alive';
$headers[] = 'Cache-Control: max-age=0';
$headers[] = 'Upgrade-Insecure-Requests: 1';
$headers[] = 'Sec-Fetch-Site: cross-site';
$headers[] = 'Sec-Fetch-Mode: navigate';
$headers[] = 'Sec-Fetch-User: ?1';
$headers[] = 'Sec-Fetch-Dest: document';
$headers[] = 'Referer: https://www.technopat.net/';
$headers[] = 'Cookie: xxxxxxxxxxxxx';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
echo $result;
curl_close($ch);
 

Geri
Yukarı