Blogmani – Google ve Alexa verilerini çekmek

Daha önce, Technorati verilerini, Technorati API’si kullanarak çektiğimi söylemiştim.

Aynı şeyi, Alexa için yapamadım-miktar ne olursa olsun, Alexa API’lerini kullanmak için para ödemek zorundasınız.

Bu durumda, geriye iki seçenek kalıyordu: PHP’nin CURL fonksiyonları, ya da sayfaya soket açıp, sayfa içeriğini işlemek.

CURL kullanmanızı tavsiye etmem: aslında harika çalışıyor; ancak makinaya minimal bir Apache kurduktan sonra, CURL fonksiyonlarının çalışmadığını farkettim. Standart Apache kurulumu ile gelmeyen çoğu kütüphaneyi kullanmak risklidir - sunucunuzda da o fonksiyonlar olamayabileceğinden, bilgisayarınızdaki web sunucusunda güzel güzel çalışan projeniz, hostunuz üzerinde patlayabilir.

O zaman, ben de soket açarım dedim ve fsockopen’ı bol bol kullandım!

fsockopen ile açtığınız sayfalardan spesifik bir bilgiyi alabilmek için, Regular Expressions’ın kucağına düşüyorsunuz. Eğer çok iyi düzeyde Reg Ex bilginiz yoksa -benim gibi!- ve problemi hızlı çözmek zorundaysanız, bildiğiniz kadar Reg Ex ile, sprintf (ve türevleri) ile birlikte, PHP’nin katar işleme fonksiyonlarını kombine kullanın. 15 sene önce olsa farklı konuşurdum; artık yazılım geliştirmek kolay ama zaman çok kısıtlı. Günümüzde en kıymetli kodcu, hızlı olan. Bilgisayarlarda çok hızlı olduğundan, genelde yazabileceğiniz en kötü kod bile, aletlere ter attıramıyor. (Simulatör, 3D oyun, ya da genetik alanında kullanılan tarzda karmaşık programlar yazmadığınızı varsayıyorum!)

Alexa sorununu nispeten kolay çözdüm; zira verilerin düzenli bir XML formatında geldiği bir sayfaya çengel atmayı başarabildim!

Google API’leri günde 1000 sorguya izin verdiği ve sonuçları hala parse etmeniz gerektiği için, yine API kullanmama kararı aldım.

Google ile işim, kolay görünmesine rağmen, biraz maceralı geçti. Pagerank’i alan kodu Internet’ten 10 dakika içinde çalıp(!) neredeyse aynen kullandım. Gelgelelim, arama sonuçlarını veren bir kod bulamadım. Bulduğum üç örneğin ikisi CURL’e dayandığı için, daha ilk anda çalışmadılar. Üçüncü, soket kullanan örnek ise, yazılan yanlış Reg Ex ifadeleri yüzünden çalışmıyordu.

Kolları sıvayarak 2-3 saat içinde, link sayısını veren Google kodunu yazdım. Aslında, uzamanın nedeni, yine bir Reg Ex-PHP azizliğiydi…

Benim kullandığım Apache+PHP sunucusunda, Unicode’dan (UTF-8), ISO tabanlı dil kodlamalarına çeviri yapan fonksiyonlar çalışmıyor. (Açıkcası, hala geliştirilme aşamasında ve PHP’yi ICU desteği ile derlemeniz gerek). Sorun şu; sayfadan Türkçe karakterler geliyor ve Reg Ex, Unicode anlıyor olması gerektiği halde, anlamıyor ve unicode karakterleri bulamıyor. Çözüm? Unicode harfler yerine, Reg Ex’in (.) -nokta- güzelliğini kullanmak! Böylece, katarınız içindeki unicode karakterlerini “her ne gelirse” diye geçiştiriyorsunuz. Harika bir çözüm değil ama her koşulda işe yarıyor. En azından, insanlar php.net’te ve forumlarda “reg ex ile unicode işleyemiyoruz” diye ağlaşırken, siz geminizi yürütüyorsunuz.

Sonuç olarak, Google Pagerank, link sayısı ve Alexa verileri gibi bilgileri de çekmeyi başardım. Technorati işini de dün çözdüğüm için, geriye birkaç iş kaldı.

Bunlardan biri, çektiğim verileri veritabanına yazmak. Bu, en kolay iş.

İkincisi, bu sitelere ulaşılamadığında, scriptimin neler yapacağına karar verecek ek fonksiyonları yazmak. Örneğin, Technorati’den veri gelmezse, tekrar deneme yapılacak mı? Kaç kere denenecek?

Bu tip detaylar…

Üçüncüsü, bu modülü ne zaman ve nasıl çalıştıracağıma karar vermek. Bunun içinde sunucu üzerinde bazı denemeler yapmak gerekiyor. Örneğin, bana üzerinde cron çalıştırmak için izin veriyor mu? Şayet cron iznim yoksa, scripti manuel çalıştırmak gerek.

Son olarak, iş puanlama algoritmasını çıkarmaya kalıyor. Bu iş aslında son derece basit. Tek bir zorluğu var; o da adil ama rekabetçi bir algoritma çıkarmak.

Umuyorum, bir ve iki numaralı maddeleri Pazar ve Pazartesi günü hallederim.




Siz de birşey söyleyin!