Google App Engine ile Alexa Rank Değerini Okuma – urlfetch fonksiyonu

Bugünlerde sitemin alexa rank değeri aniden 2 katından fazla artınca biraz kafayı taktım. Derken Google App Engine ile değeri okumaya çalıştım ve sizinle paylaşıyorum.

Bu yazıyı okumaya devam etmeden önce şuradaki yazımı okumanızı öneriyorum.

Önce alexa isminde bir çalışma dizini oluşturuyoruz. Bu dizinin içine app.yaml isminde bir dosya oluşturuyoruz. Dosyanın içeriğini şöyle yapıyoruz:

application: alexa-rank-ogren
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
script: main.py

İlk satırdaki alexa-rank-ogren degeri appengine.google.com adresine girip Create an Application dedikten sonra girdiğimiz Application Identifier değeri olmalıdır.

Şimdi de burada belirttiğmiz main.py dosyasını da app.yaml dosyasının yanına oluşturuyoruz. main.py dosyası da şöyle olsun:

from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import urlfetch
import re,urllib

class MainPage(webapp.RequestHandler):
    def get(self,url):
        self.response.headers['Content-Type'] = 'text/plain'
        url = 'http://www.alexa.com/siteinfo/'+ url
        try:
            content = urlfetch.fetch(url).content
            up = re.search('<img src="/images/icons/globe-sm.jpg" alt="Global" style="margin-bottom:-2px;"/> [0-9,]{1,10}</a>',content)
            up = re.search('[0-9,]{1,10}</a>',up.group()).group()
            sonuc = up[0:-4]
        except:
            sonuc = 'hata'
        self.response.out.write(sonuc)

application = webapp.WSGIApplication([(r'/(.*)',MainPage)],debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

Burada önce MainPage isminde bir sınıf oluşturduk ardından sınıfın içinde oluşturduğumuz get fonksiyonu ile sayfaya gelen istek sonucunda sayfanın gösterdiği değeri belirleyeceğiz. Bu fonksiyonun bir parametresi olan url şu şekilde okunuyor:

http://alexa-rank-ogren.appspot.com/ftoptas.com

Bu adresteki ftoptas.com kısmı urlyi oluşturmaktadır. Çünkü sadece bir parametremiz var o da ilk ‘/’ karakterinden sonra gelen kısımdır.

alexa rank değerini okuyacağımız siteyi öğrendik şimdi de alexaya bağlanıyoruz. Sitenin alexa rank değeri de

http://www.alexa.com/siteinfo/ftoptas.com adresindedir.

urlfetch() fonksiyonuyla bu siteyi çekiyoruz. Yaklaşık olarak 26KB’lik bir dosya. Şimdi bir düzenli ifade yazarak bu 26KB’lik dosyanın içinden sadece alexa rank değerini alacağız.

Eğer FireBug ile bu sayfayı incelersek alexa rank değerinin olduğu yerdeki kodlar şöyledir:

<img src="/images/icons/globe-sm.jpg" alt="Global" style="margin-bottom:-2px;"/> 4,274,049</a>

Bu ifadeyi 12. satırda buluyoruz ve 13.satırda ikinci defa düzenli ifade (regex) kullanarak buradaki sayıyı çekiyoruz.

try kullanmamızın nedeni ise olmayan bir url girdiğimizde bize ‘hata’ değerini döndürmesi içindir.

Oluşturduğumuz WSGIApplication parametrelerinde ise urllerin nasıl olacağını belirttik. Yani hangi fonksiyonun hangi url ile bağlantılı olacağını yazdık.

Burada ‘/’ yerine r’/(.*)’ kullanmamızın nedeni ise http://alexa-rank-ogren.appspot.com/ adresinden sonra bir parametre geleceğini belirtmek.

Eğer http://alexa-rank-ogren.appspot.com/alexa/ftoptas.com urlsini kullandığımızda MainPage fonksiyonunu çağırmak isteseydik şu ifadeyi kullanırdık:

r’/alexa/(.*)’

veya MainPage fonksiyonunda iki parametre kullanmak isteseydik şöyle yapardık:

r’/(.*)/(.*)’

Yani regex kullanarak çok esnek urller oluşturabiliriz.

Gördüğünüz gibi 26KB’lik bir veriyi kendi sunucunuzda çekip işlemek hem trafiği hem de işlemci yükünü arttırır. Google app engine kullanarak bu yükü google sunucuların yükledik.  Sistemin çalışan halini şu adreslerden test edebilirsiniz.

http://f-toptas.appspot.com/alexa/google.com

http://f-toptas.appspot.com/alexa/ftoptas.com

3 comments

  1. sitenizi çok beğendim ayrıca ürünlerinizde çok güzel

  2. serdar keskin Kardeşe Katılıyorum Dogru Söz Söylemiş. Orta Bir tane Bir tane Değil Bir Kaç tane Ürün var

Leave a Reply

Your email address will not be published. Required fields are marked *

*