Merhaba,
Python’daki varsayılan fonksiyonlar, kod yazarken işlerimizi kolaylaştırdığı gibi, yapılan işleri de hızlandırması ayrıca bir avantaj. Kod yazarken en çok ihtiyaç duyduğumuz işler bir listedeki değerlere işlemler yaptırmak, içlerinden bazılarını değiştirmek, bazılarını filtrelemek gibi işler. İşte Map, filter ve reduce kavramları da tam olarak bu işleri çok daha hızlı yapmak için varlar. O halde örneklerle anlatmaya başlayayım;
python
Fonksiyon Deseni ile Hata Yakalama
StandardMerhaba;
Şu an üzerinde çalıştığım projede (ve genel olarak) hataları yakalama ve düzenli olarak loglama ihtiyacı hissettim, elbette try-except blokları ile bu yapıyı sağlayabilsem de, bir yerden sonra kodun hemen her parçasını try-except yapısına boğduğumu ve bu yapının da kodun okunaklığına ve akışına zarar verdiğini gördüm. Biraz araştırma yapınca, bu kontrol sistemi için güzel bir yapının olduğunu gördüm. Öncelikle fonksiyon deseni hakkında genel bir bilgiye sahip olmak gerekli bu yapıyı kullanabilmek için, bunun için araştırdıklarım arasında en güzel anlatım şu kaynakta
Python’da detaylı hata analizi
StandardMerhabalar;
Bu gün github’da gezerken güzel bir modüle rastladım. Python scriptlerinde hata durumlarını detaylandıran bir modül. Üstelik modülü import etmek dışında herhangi bir şey yapmaya gerek kalmadan, o yorumlama sırasında oluşan hataları detaylandırıp sunuyor;

Knapsack Probleminin Python ile Döviz Alım-Satımına Uygulanışı
StandardMerhaba;
Bu yıl “genetik algoritmalar” adında bir ders almaktayım. Ders içeriği itibariyle yaygın genetik algoritmaların tanıtmayı ve öğrencilere gruplar halinde bu algoritmaların uygulanmasını hedeflemekte. Biz de grup olarak knapsack algoritmasını seçerek kendimize bir konu belirledik ve uygulamaya başladık. İlk problemimiz kullanacağımız dildi. Zaten hiçbirimiz matlab düşünmedi. Grup 3 kişiden oluşuyordu ve diğer 2 arkadaş C# biliyorlardı. Bense hem C# hem de python biliyordum ancak hassas sayısal hesaplamaların python’da çok daha etkin şekilde yapıldığını bildiğimden python tercih etmekten yanaydım. arkadaşlar şöyle dediler “3’ümüzde C# biliyoruz, ama sadece sen python biliyorsun, kodu C# da yazalım, sen python ile bize güncel kur verilerini xml olarak sağla, sonra da kodun python versiyonunu yazarsın, hocaya çapraz platform bir uygulama olarak sunarız.” Buraya kadar tamamdık. Ne var ki algoritma seçiminin ardından neye uygulanacağı konusunda seçimi ilk hafta yapma mecburiyetimizden kaynaklı olarak bir şansızlık yaşadık. Okumaya Devam Edeyim Bari…
Python/Scrapy ile Veri Kazımak (teşekkürler Türkçe!)
StandardMerhaba;
Son birkaç gündür Scrapy adında mottosu “hızlı, basit geliştirmeye elverişli” olan bir data kazıma framework’ü ile tanıştım. Gugıl ve Ecosia amcada aratmama rağmen hiç Türkçe döküman bulamayınca içime öküz oturuverdi. Ben de birkaç günlük dahi olsa Türkçe olarak bu framework hakkında birşeyler yazmak istedim.
Öncelikle Scrapy bir python framework’u, yaptığı şey sizin gireceğiniz kurallara göre siteyi parçalara ayırıp, sitenin içerisindeki bilgileri size sunmakta. Sitenin içerisinden aldığınız bilgiler ile ne yapacağınız ise size kalmış bir durum. Günümüzde big data kavramınının iyice yaygınlaşması ile beraber Scrapy kesinlikle bu iş için biçilmiş kaftan.
Peki Scrapy ile örnek bir site parse etmek istesek?
Öncelikle Scrapy’ı bilgisayarınıza kurmalısınız, windows’ta nasıl yapılıyor bilmiyorum, eğer windows üzerinde python geliştiriyorsanız STFW 🙂
Apt-get paketli yöneticilerde (debian, ubuntu, mint gibi) ise yapmanız gereken gayet basit, “pip” yani “Python İnstalling Packages” aracı ile şu komutu vermeniz yeterli :
pip install Scrapy
Eğer pip yoksa sorun değil, pipsiz kurulum;
sudo apt-get install python-scrapy
Eğer Arch linux’a kuracaksanız;
yaourt -S scrapy
Daha detaylı kurulum bilgisi için;
http://doc.scrapy.org/en/1.1/intro/install.html
Bu kadar kurulum hikayesinden sonra, gelelim basit bir örümcek oluşturup site crawl etmeye. Aslında kendi sitemi crawl ederek örneklendirmeyi düşündüm başta ancak, yerimde duramayan biri olarak yarın sitenin şemasını değiştirdiğimde anlatıma yazık olacağından direk sitesindeki tutorial’i Türkçeleştirip kendi eklemelerimle anlatacağım;
Öncelikle konsoldan “scrapy” komutu verirseniz Scrapy size neler yapabileceğini söyler;
Scrapy 1.1.2 - no active project Usage: scrapy <command> [options] [args] Available commands: bench Run quick benchmark test commands fetch Fetch a URL using the Scrapy downloader genspider Generate new spider using pre-defined templates runspider Run a self-contained spider (without creating a project) settings Get settings values shell Interactive scraping console startproject Create new project version Print Scrapy version view Open URL in browser, as seen by Scrapy [ more ] More commands available when run from project directory Use "scrapy <command> -h" to see more info about a command
İlk satırda eğer aktif bir scrapy projesi içerisinde iseniz size projeyi yazacaktır, çünkü scrapy’daki kimi komutlar proje bağımlıdırlar, yani proje içerisinde değilseniz çalıştırmanız mümkün olmayacaktır. (mesela crawl gibi, değineceğiz…)
İlk önce projemizin temel yapısını oluşturarak başlayalım, konsoldan scrapy projesini açacağınız dizine girdikten sonra;
$ scrapy startproject tutorial
Komutu verdikten sonra şöyle bir çıktı alacaksınız;
New Scrapy project 'tutorial', using template directory '/usr/local/lib/python2.7/dist-packages/scrapy/templates/project', created in: /home/sezer/Ornek/tutorial You can start your first spider with: cd tutorial scrapy genspider example example.com
Mealen diyor ki, istediğin Scrapy iskeletini falanca dizini örnek alarak /home/sezer/Ornek/tutorial dizini altında oluşturdum, dizine girerek ilk denemeni yapabilirsin, bunun için de gerekli satırlar filanca…
İskeletin içeriğini incelersek;
tutorial/
scrapy.cfg # Scrapy'nin konfigürasyon dosyaları
tutorial/ # Scrapy ana dizini, proejenız burada
__init__.py
items.py # Projede tutacağınız veri iskeleti burada
pipelines.py # Pipeline ile çekeceğiniz kurallar burada
settings.py # Projenin konfigürasyon dosyaları burada
spiders/ # Yazdığınız/yazacağınız spiderlar burada
__init__.py
...
Scrapy yapı olarak OOP bir teknolojiye sahip, Türkçe tabirle “nesne tabanlı bir framework” (olduğu kadar türkçe 🙂 )
Yani bol bol kalıtım ve bol bol metod var işin içinde. Öncelikle kazıyacağımız verileri içerisinde tutmak için bir class oluşturacağız, Scrapy veriyi kazıdıkça bunun içerisinde sözlük olarak tutacak. Ne demiştik ? items.py altında veri iskeletini tutacağız…
Giriyoruz items.py’a ve şöyle bir class oluşturuyoruz;
import scrapy class DmozItem(scrapy.Item): # Scrapy'in Item'ından türettik baslik = scrapy.Field() # sitenin basligi tutacagimiz scrapy degiskeni link = scrapy.Field() # sitenin linkini tutacagimiz scrapy degiskeni icerik = scrapy.Field() # sitenin icerigini tutacagimiz scrapy degiskeni
Farkettiyseniz “Item” class’ından bir class kalıtım alarak türetmiş olduk. temel class’ımıza 3 değişken daha ekledik ve kendimize özgü class’ımızı oluşturmuş olduk.
Şimdi gelelim örümceğimizi yazmaya, şimdi de ”
1 | <span class="pre">tutorial/spiders</span> |
” dizinine gidiyoruz ve dmoz_spider.py adında bir python dosyası oluşturuyoruz, içerisine de örümceğimizin özelliklerini yazıyoruz;
import scrapy from tutorial.items import DmozItem class DmozSpider(scrapy.Spider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" ] def parse(self, response): for sel in response.xpath('//ul/li'): item = DmozItem() item['title'] = sel.xpath('a/text()').extract() item['link'] = sel.xpath('a/@href').extract() item['desc'] = sel.xpath('text()').extract() yield item
Kodda her ne kadar aşikar olsa da açıklamak adına bir daha kodu inceleyelim, class’ı Scrapy’ın spider class’ından kalıtım aldık. Bu class’ın özelliği, parse adında bir metodu zorunlu olarak tanımlamamız gerektiği, çünkü site kazındıktan sonra alınan veri buraya koyulmakta. Önce yukarıda oluşturduğumuz DmozItem adındaki class’I py dosyamıza dahil ettik, ardından hangi siteyi kazıyacağımıza Scrapy’a söyledik, sonra da “xpath” ile içerisinden çekeceğimiz kısımları seçtik. Xpath’in ne olduğuna zamanım olduğunda bir başka makalede değineceğim, bir cümle ile açıklamak gerekirse “Bir html sayfanın istenilen kısmını almayı sağlayan yapı” olarak tanımlarsam çok da yanlış konuşmuş olmam. Son kısımda da yield diye bir anahtar kelime ile bu nesneyi pipeline’a gönderdik.
Şimdi kodumuzu çalıştırmaya geldi sıra, bir çıktı olarak kodu elde etmek için şimdilik en basit yöntemi kullanacağız;
scrapy crawl dmoz -o veri.json
Kodu çalıştırıyoruz ve ta taaa, sitenin içeriği bir json dosyası içerisine aktarılmış durumda !
Elbette bu scrapy için ancak basit bir giriş anlatımı, ilerleyen zamanlarda vakit buldukça genişletmeye çalışacağım, ancak kısaca Scrapy böyle bir framework. Tutorial’in orjinali için;
http://doc.scrapy.org/en/1.1/intro/tutorial.html
İyi çalışmalar 🙂
