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

One thought on “Python/Scrapy ile Veri Kazımak (teşekkürler Türkçe!)

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir