Matomo ile Kullanıcı Takibi

Standard

Merhabalar;

Günümüzde bir website’si üzerinde geliştirme yaparken, artık sadece ürünü geliştirip hızlıca teslim etmek yerine, önceliklerimizden birisi de kullanıcı memnuniyetini maksimumda tutarak, kullanıcı sorunlarını da mümkün olduğunca gidererek, konforlu bir şekilde ürünü kullanmalarına devam etmelerini sağlamaktır.

Bu amaçla kullanıcılardan bizlere geri bildirim yapmalarını rica eder, bu şekilde ürünlerimizi geliştiririz. Peki sadece bu geri bildirimlere dayanarak geliştirme yapmak yeterli midir?

Okumaya Devam Edeyim Bari…

Saf Python ile Veri Kazıma (Web Scraping)

Standard

Merhaba,

Web üzerinde veri kazıma işlemleri için birçok yöntem bulunmakta. Tabii ki python‘un bu konudaki güçlü çatılarından birisi olan Scrapy bu iş için biçilmiş kaftan konumunda. Ancak işi programlama olmayan, ancak site ya da siteler üzerindeki verileri python ile alabileceğinin bilincinde olan kişi sayısı da günden güne artmakta. Bu da karşımızda, “acaba kapsamlı bir proje değilde basitçe bir site üzerindeki belirli bilgileri çekmek istiyorsak, en az gereksinimle bunu nasıl yapabiliriz?” sorusunu çıkarıyor.

Aslında yakın zamanda yayınlayacağım bir projemin temellerini araştırırken denk geldiğim güzel bir kütüphaneyi kullanarak bu işi yapabileceğimi farketmem, bu makaleyi oluşturmama sebep oldu. Python 3’ün “requests-html” kütüphanesi, bir site üzerindeki xpath ya da CSS desenlerini takip ederek veri elde etmenize imkan tanıyor. Bunun yanında da birçok imkanla beraber sitedeki verileri de indirmenizi mümkün kılıyor.

Okumaya Devam Edeyim Bari…

Yerel Ortamdaki Siteyi İnternete Çıkarma

Standard

Merhaba,

Bir web sitesi üzerinde geliştirme yaparken, geliştirme ortamımız tabii ki bilgisayarımızdır. Ancak üçüncü parti uygulamaların entegrasyonunu yaparken bazı durumlarda ilgili uygulamanın siteye veri dönmesi gereken durumlarda işler biraz karışır. Ya kodu test etmeden test ortamına aktarıp denemeler yapmanız (test ortamınız var ise) ve her hatada kodu güncelleyip tekrar test ortamında ayağa kaldırmanız gerekir ya da daha kötüsü direk canlı ortamda çalışmanız gerekir. Geçen gün üçüncü parti bir uygulama entegrasyonu yaparken yerel ortama bağlantı sağlamam gerekirken bir program keşfettim, ngrok.

Aslında ngrok’un amacı kolayca yerel ağınızda yaptığınız yayın işlemine web ortamına taşımak. Gelelim kullanımına…

Okumaya Devam Edeyim Bari…

MacOSX’de Çoklu Python Sürümleri ile Çalışmak

Standard

Merhaba,

Bu gün bir kodu test etmek için birden fazla sürüme ihtiyacım oldu. MacOSX işletim sisteminde python yüklemek için her seferinde dmg dosyasını indirmek, yüklemek gerektiğinden ve bu iş zaman aldığından daha kolay bir yolu olup olmadığını araştırırken istediğim çözüme ulaştım. Dilerim benim gibi ihtiyacı olanlar için faydası olur.

Pyenv adında bir program sayesinde, tıpkı Docker containerlarındaki gibi birden fazla major ve minör versiyonu 1 satırda indirip, virtualenv ile sistemden yalıtabiliyoruz.

Okumaya Devam Edeyim Bari…

Map, Filter, Reduce Kavramları

Standard

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;

Okumaya Devam Edeyim Bari…

Swagger ile Restful API Dökümanı Oluşturma

Standard

Merhaba;

Restful API oluştururken, kod mimarisini ve işlevlerini açıklamakta kullanılan swagger harika bir arayüze ve kaliteli dokümana sahip güzel bir araç.

Sitesi:

https://swagger.io/

Şu bir gerçek ki geliştiricilerin sıkıntılarından birisi de yazılan kodu  doküman haline getirmektir. İşte bu iş için adamlar düşünmüş “bir sistem oluşturalım, geliştirici isterse önce dokümanı yazsın, oradan aldığı iskeleti IDE’ye aktarıp oradan dokümana uygun yapının gövdesini yazsın, isterse de doctstring’ler üzerinden şemayı biz oluşturalım” demişler ve Swagger’ı çıkartmışlar.

Okumaya Devam Edeyim Bari…

Fonksiyon Deseni ile Hata Yakalama

Standard

Merhaba;

Ş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

Okumaya Devam Edeyim Bari…

Knapsack Probleminin Python ile Döviz Alım-Satımına Uygulanışı

Standard

Merhaba;

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!)

Standard

Merhaba;

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 🙂

banner