15 Eylül 2008 Pazartesi

siteler üzerinde urlgrabber ile gezinti işlemi

Zaman zaman web sitelerine veri gönderip, dönen sonuçlara göre otomatik işlemler yazan kodlar yazmamız gerekebilir. bu iş için, hangi dili kullanıyorsak kullanalım bir HTTP kütüphanesine ihtiyaç duyarız. python bize bu konuda bir çok seçenek sunuyor. urllib, httplib, urlgrabber, pycurl gibi bu işi gayet güzel yapan HTTP modülleri kullanımımıza amade..

Ben kısaca, urlgrabber modulünden bahsedeceğim yazı boyunca. urlgrabber, urllib2 kütüphanesinin daha kullanıcı-dostu şekilde düzenlenmiş ve salt python ile yazılmış hali. yapmak istediğiniz işlemleri daha basitçe ve hızlı bir şekilde yapabiliyorsunuz. klasik olarak ilk önce, "pythontr.blogspot.com" adresine GET isteğinde bulunup kaynak kodlarını alalım:


from urlgrabber import urlopen

pytr = urlopen("http://pythontr.blogspot.com")
veri = pytr.read()
pytr.close()

print veri


kodu çalıştırdığınızda bloğumuzun HTML kaynak kodları ekrana basılacaktır. biraz daha pythonic yazarsak;

from urlgrabber import urlopen
print urlopen("http://pythontr.blogspot.com").read()


basit bir GET isteğinden sonra artık, daha komplike işlemlere geçelim. eğer istek yapacağımız sayfaya sağlıklı bir şekilde girebilmek için çerez yollamamız gerekiyorsa, HTTP_USER_AGENT değiştirmeliysek, ya da başka bir HTTP başlığı değiştirmek istersek ne yapmalıyız?

urlgrabber, bu konuda çok fazla seçenek sunuyor. örneğin HTTP_USER_AGENT bilgisini değiştirmek istediğimizi düşünelim;

from urlgrabber.grabber import URLGrabber

istek = URLGrabber(user_agent = 'pythontr python bot')
sonuc = istek.urlopen("http://pythontr.blogspot.com").read()


sadece 1 parametre eklemiş olmamız yetti. diğer parametrelere bu adresten göz atabilirsiniz.

örnek uygulama

python-challenge.com adresinde python programcılarının pratik yapmaları için seviyelerle hazırlanmış bir site var. python ile ipuçlarını yorumlayıp çözüme ulaşıyorsunuz. o siteden 4.seviyeye bakıyoruz hemen. gördüğünüz üzere. bağlantılara tıklasak bile bir sonuç alamıyoruz, tekrardan başka random bir sayı çıkıyor. anlıyoruz ki, bu işi elle yapmak yorucu olacak.

python ile her seferinde gördüğü bağlantıya istek yapan, gelen sayfaya aynı şekilde bir bağlantı daha varsa yine istek yapan ama yoksa durup, URL adresini veren bir uygulama yapalım. uygulama hem çerez yollasın, hemde regex ile değişiklik var mı yok mu kontrol etsin, duruma göre işlemi durdurup devam edeceğine karar versin.

from urlgrabber.grabber import URLGrabber
import re

def istekYap(sonGelen):
istek = URLGrabber(http_headers = (('info', 'you+should+have+followed+busynothing...'),))
sonuc =istek.urlopen("http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="+sonGelen).read()
try:
yeni = re.search("and the next nothing is ([0-9]{1,5})", sonuc).group(1)
print "%s rakami bulundu, yeni istek yapiliyor." % yeni
istekYap(yeni)
except:
print "son uygun rakam: " + sonGelen

istekYap("12345")

özyinelemeli çalışan bu fonksiyon ile, yüzlerce istekten sonra gerçek adrese ulaşıyorsunuz :)

dip notlar

http://linux.duke.edu/projects/urlgrabber/comparison.ptml
http://linux.duke.edu/projects/urlgrabber/help/urlgrabber.grabber.html
http://linux.duke.edu/projects/urlgrabber/examples.ptml

1 yorum:

  1. I used to be able to find good info from your content.
    Also see my page :: perfumes baratos

    YanıtlayınSil