Web Sayfasından Veri Alma -Web-harvest uygulaması

Bu yazıda web-harvest uygulaması kullanarak web sayfalarından nasıl veri alınabileceğini anlatacağım. Bu yazı tıklayarak kullanılabilen bir uygulamayı anlatmıyor. O nedenle kodlama ile uğraşmak istemeyenler yazının sonundaki danışmanlık bölümüne geçebilirler. Öğrenmek isteyenler yazıyı okumaya devam etsin. İlgilenenler için webden veri almakla ilgili genel kültür amaçlı kısa bir özet geçelim. Bir web sayfasından veri çekip bunu tablo haline getirmek istediğinizde eğer almak istediğiniz veri miktarı azsa hiç alternatif yöntem arayışına girmeden doğrudan kopyala yapıştırla bunu yapabilirsiniz. Ancak veri miktarı büyüdüğünde bu işlem günlerinizi alabilir. Veya çok az bir veri bile olsa bunu her gün yapmanız gerekiyorsa durum çekilmez bir hal alabilir. Elle web sayfasından veri almak yerine bunu sizin yerinize otomatik olarak yapabilecek programlar var. Bu programları kullanım şekillerine göre,

  1. Browser eklentisi
  2. Java, Python tabanlı
  3. Standart uygulama
  4. Excel içinden macro ile

şeklinde sıralayabiliriz. Browser eklentisi olanlardan deneyip çalıştırıp sonuca ulaşabildiğim olmadı. Bu yüzden onlardan bahsetmeyeceğim. Excel içinden çalışanlarda da basic ile macro yazmak gerekiyor ve benim basicle tecrübem olmadığından onu hiç denemedim. Bu yüzden excel macroları da yine bu yazının konusu değil. Standart uygulamalar görsel olarak başarılı. Bunlardan Mozenda ve import.io uygulamalarını denedim. Mozenda ve import.io basit üyelikte belli bir sayıda veriye kadar ücretsiz kullanıma izin veriyor. Eğer basic, C, Java, Phyton gibi dillerde hiç bir programlama tecrübeniz yoksa önceliğiniz bu programlar olsun. İşinizi görüyorsa başka bir arayışa girmeye gerek yok. Sitelerinde nasıl kullanılacağına ilişkin videolar da mevcut. Ancak bu programları denediniz ama ihtiyacınızı karşılamadığını gördünüz veya sizin için gerekli olan veri kullanım miktarı ücretsiz sürümlerinin kotasından fazla ise son seçeneğimiz olan Java, Phyton tabanlı uygulamalarla biraz boğuşmanız gerekiyor.

Web-Harvest uygulması java tabanlı bir uygulama. Özel komutlarla java scriptle kod da yazabiliyorsunuz ama asıl kodlama xml yazımına çok yakın bir dille yapılıyor. Amaca uygun özel komutlar geliştirilmiş. Benim öğrenme sürecim biraz sancılı ve uzun sürdü ama öğrendikten sonra gördüm ki hiç de öyle zor bir dil ve uygulama değilmiş. Webden data almaya yönelik özel hazırlanmış fonksiyonlarla saatler, günler belki haftalar alacak veri toplama işlemi saniyeler için tamamlanıyor. Örnekleri anlamak için de bir hayli kafa yordum ama sonunda gördüm ki onlar da çok akıllıca hazırlanmış güzel örnekler.

Nasıl kullanıldığından bahsedelim:

  • Yazacağınız kod parçası <config> tagının içinde yer almak zorunda
  • İşlemesi ve analizi daha kolay olduğu için html tabanlı sayfa <html-to-xml> elemanı ile xml'e dönüştürülüyor
  • xml'in içinden istenilen verinin adreslenmesi için <xpath> elemanı kullanılılıyor. Xpath konusunda internetten ayrıntılı bilgi bulabilirsiniz ama siz öğreninceye kadar ihtiyacınız olan bilgileri browserlar zaten size sağlayacaktır
  • değişkenler tip belirtmeye gerek kalmadan <var-def name = "variable" > elemanı ile hazırlanıyor
  • değişkenler <var name = "variable" > elemanı ile kullanılıyor
  • aynı tipten birden fazla veri varsa loop elemanı kullanılıyor. List bölümü benzer elemanları bulurken body bölümü de listedeki her bir verinin istenilen özelliklerini ayrıştırmak için kullanılıyor.

<loop item="..." index="...">
    <list>....</list>
    <body>....</body>
</loop>

Hemen bir kaç örnekle devam edelim. Örneği açıklarken google chrome tarayıcısını kullanacağım. Chrome dışındaki tarayıcıların da xpath için yardımcı araçları mevcut.

Chrome üzerinde veri alacağınız sayfa açıkken ctrl+shift+I tuş kombinasyonuna birlikte basarsanız geliştirici araçlarına ulaşırsınız. Veya veri olarak almak istediğiniz bölümün üzerine sağ tıklayıp inspect element seçerseniz yine aynı pencere açılacaktır. Geliştirici araçları penceresinde istediğiniz veriyi bulup üzerine sağ tıklayıp açılan menüden copy xpath seçtiğinizde artık o verinin adresine sahip oluyorsunuz.

Örnek 1: İlk örneğimizde bir sayfadan sadece 1 veri çekeceğiz. Akbank yatırımcı sayfasından dolar alış fiyatını alalım. Webharvest uygulamasında aşağıdaki kodu yazalım. xpath expression kısmı yukarda belirttiğim yöntemle xpathin kopyalanıp yapıştırılması ile hazırlanıyor.

<?xml version="1.0" encoding="UTF-8"?>
<config charset="UTF-8" >
    <xpath expression= '//span[@id="ctl00_s_lblusdAlis"]/text()'>
        <html-to-xml>
            <http url="http://yatirimci.akbank.com/proindex.aspx"/>
        </html-to-xml>
    </xpath>
</config>

Bu kodu çalıştırdığınızda akbank finans sayfasında o anda usd alış fiyatı ne ise web harvest içinde navigasyon penceresinin içinde xpathi açtığınızda o değeri görürsünüz.

Örnek 2: İkinci örneğimizde birbiri ile aynı türde alanlar içinde tutulan benzer birden fazla veri çekeceğiz. Bunun için hisse senedi bölümündeki en çok işlem gören 5 hisse senedini listeleyeceğiz.

<?xml version="1.0" encoding="UTF-8"?>

<config charset="UTF-8" >
    <xpath expression= '//td[@class="eciHisseSutun hisseSutun"]/a/text()'>
        <html-to-xml>
            <http url="http://yatirimci.akbank.com/proindex.aspx"/>
        </html-to-xml>
    </xpath>
</config>

Bu kodu çalıştırdığınızda da o anda ençok işlem görenler listesinde hangi hisseler varsa onları görürsünüz.

Örnek 3: Şimdi de aynı sayfa içinde bir elemana bağlı birden fazla veriyi birlikte nasıl alabiliriz onu inceleyelim.

Yine aynı sayfa içinde dolar alış ve satış fiyatlarını yan yana gösterelim. Bunun için ilk örnekte kullandığımız xpath kod parçasından 2 tane yazacağız ve bunları birer değişgene atayacağız. Sonra da template elemanını kullanarak bu iki veriyi yan yana yazdıracağız.

<?xml version="1.0" encoding="UTF-8"?>
<config charset="UTF-8" >

<var-def name="content">
        <html-to-xml>
            <http url="http://yatirimci.akbank.com/proindex.aspx"/>
        </html-to-xml>
    </var-def>
    
    <var-def name="usdal">
        <xpath expression= '//span[@id="ctl00_s_lblusdAlis"]/text()'>
            <var name = "content"/>
        </xpath>
    </var-def>
    
    <var-def name="usdsat">
        <xpath expression= '//span[@id="ctl00_s_lblusdSatis"]/text()'>
            <var name = "content"/>
        </xpath>
    </var-def>
    <template>${usdal}${sys.tab}${usdsat}</template>
</config>

Örnek 4: Son örneğimizde de bir sayfada benzer verileri bulup sonrasında bu verilere ait özel linklere erişip bu linklerden bazı veriler alacağız. Bunun için yine en çok gören 5 hisse senedini kullanacağız. Bu senetlere ait linklere erişip bu sayfalardaki istediğimiz her veriyi çekebiliriz. Biz örnek olarak seans raporu tablosundan 1. ve 2. seans kapanış değerleri ve bir üstündeki tablodan değişim oranını alacağız. Tüm bu verileri internetten alıp istediğimiz verileri çektikten sonra bunları bir de dosyaya yazarak kayıt altına alacağız. Tüm bu işlemleri başka bir dil ile yapıyor olsaydık belki yüzlerce satır kod yazmamız gerekecekti. Ama aşağıda gördüğünüz gibi sadece 45 satırda bu işlemler tamamlanabiliyor.

<?xml version="1.0" encoding="UTF-8"?>
<config charset="UTF-8" >
<var-def name="content">
        <html-to-xml>
            <http url="http://yatirimci.akbank.com/proindex.aspx"/>
        </html-to-xml>
    </var-def>
    <loop item="hisse" index="index">
        <list>
            <xpath expression= '//td[@class="eciHisseSutun hisseSutun"]/a/@href'>
                <var name = "content"/>
            </xpath>
        </list>
          <body>
              <var-def name="subcontent">
                  <html-to-xml>
                      <http url= "http://yatirimci.akbank.com/${hisse}"/>
                  </html-to-xml>
              </var-def>
            <var-def name="isim">
                <xpath expression= '//div[@id="gunDegisimBaslik"]/span[2]/text()'>
                    <var name = "subcontent"/>
                </xpath>
            </var-def>
            <var-def name="seans1">
                <xpath expression= '//tr[@class="sdTekSatir"]/td[@class="sdBirinciSutun"]/text()'>
                    <var name = "subcontent"/>
                </xpath>
            </var-def>
            <var-def name="seans2">
                <xpath expression= '//tr[@class="sdTekSatir"]/td[@class="sdIkinciSutun"]/text()'>
                    <var name = "subcontent"/>
                </xpath>
            </var-def>
            <var-def name="yuzde">
                <xpath expression= '//tr[@class="gdTekSatir"]/td[@class="gdDegisimSutun"]/text()'>
                    <var name = "subcontent"/>
                </xpath>
            </var-def>
            <file action="http://elektronart.com/?q=append" type="binary" path="D:\Projects\Scrap\WebHarvest\hisse.txt">
                <template>${isim}${sys.tab}${seans1}${sys.tab}${seans2}${sys.tab}${yuzde}${sys.lf}</template>
            </file>
          </body>
    </loop>
</config>

Eğer almak istediğimiz verilerin ana başlıkları 1 sayfadan daha çok sayfaya dağılmışsa bu sayfaları sırasıyla dolaşarak listemizi oluşturmamız gerekiyor. Bununla ilgili kodlamayı webharvestin kendi sayfasındaki yahoo shopping örneğinde bulabilirsiniz.

Her ne kadar ben çoğunu okumuş olmama rağmen deneme yanılma yöntemi ile programı kullanmayı çözmüş olsam da internet üzerinde programla ilgili olarak çok sayıda İngilizce kaynak var. Programı ve özelliğini beğendiniz ama bir türlü işin içinden çıkamadınız veya kullanabileceğinizi bile deneyecek vaktiniz yoksa adresine almak istediğiniz verileri ve içinde bulunduğu web sayfasını göndererek 70TL'den başlayan fiyatlarla danışmanlık satın alabilirsiniz. Sadece veriler için olduğu gibi kodlama için de danışmanlık alabilirsiniz.