Skip to content

Scrapy ile Veri Madenciliğine Giriş

Bu yazıda scrapy framework nedir, nasıl kurulur, shell ortamında css seçiciler ve xpath ile web sitesinden dönen yanıt içerisindeki verilere erişmeyi öğreneceksiniz.

Scrapy Nedir? scrapy.org'da belirtildiği üzere ihtiyacınız olan verilerin websitelerinden çıkarılması(çekilmesi) için geliştirilmiş açık kaynaklı bir framework'tür. Hızlı, basit ve genişletilebilir bir şekilde.

Scrapy, Python programlama dili ile geliştirilen açık kaynaklı bir web kazıma (web scraping) ve veri toplama framework'üdür. Web scraping, web sitelerinden veri çekme ve bunları yapay zeka modelleri, veri analizi veya başka bir amaç için kullanabilme işlemidir.

Scrapy, web sitelerinde gezinmek, sayfaları indirmek, verileri çekmek ve işlemek için bir dizi özellik sunar. Bu framework'ü kullanarak, web üzerindeki verilere erişebilir, web sitelerini otomatik olarak tarayabilir ve çektiğiniz verileri dilediğiniz şekilde işleyebilirsiniz.

Scrapy'nin temel özellikleri şunlardır:

Hızlı ve verimli: Scrapy, asenkron bir tasarıma ve çoklu iş parçacığı desteğine sahiptir, bu da hızlı ve verimli bir şekilde web sitelerini tarayabilmenizi sağlar.

İş akışı kontrolü: Scrapy, web sitelerinde gezinmek için bir dizi kural tabanlı iş akışı sağlar. Bu sayede hangi sayfaların taranacağını, verilerin nasıl çekileceğini ve nasıl işleneceğini belirleyebilirsiniz.

Otomatik form işleme: Scrapy, web sitelerindeki form sayfalarını otomatik olarak doldurup gönderebilir ve gerekli yanıtları alabilir. Bu, oturum açma veya form tabanlı veri alımı gibi işlemleri otomatikleştirmenizi sağlar.

Veri işleme ve depolama: Scrapy, çektiğiniz verileri dilediğiniz şekilde işleyebilir ve farklı veritabanlarına veya dosya formatlarına kaydedebilir.

Proxy ve kullanıcı oturumu yönetimi: Scrapy, proxy sunucularını kullanarak IP engellemesini önleyebilir ve kullanıcı oturumlarını yönetebilir.

Scrapy'nin güçlü ve esnek yapısı, web scraping projelerini hızlı bir şekilde geliştirmenizi ve özelleştirmenizi sağlar. Ayrıca, Scrapy'nin zengin ekosistemi sayesinde, çeşitli eklentiler ve uzantılar kullanarak fonksiyonelliğini genişletebilirsiniz.

Kurulum

# proje klasörü oluştur
$ mkdir scrapy_proje
# venv adında sanal ortam oluştur
$ python3 -m venv venv
# sanal ortamı aktif et
$ source vent/bin/activate
# scrapy indir ve kur
(venv)$ pip install Scrapy

Shell Ortamında İşlemler

Terminalden scrapy shell diyerek shell ortamında hedef olarak belirttiğiniz sitenin crawl edilmesi sonucu dönen data (response) üzerinde çalışabilirsiniz.

Örnek olarak http://quotes.toscrape.com/random adresini hedef website URL olarak verelim

scrapy shell http://quotes.toscrape.com/random
- Bu komutu çalıştırınca aşağıdaki gibi bir sonuç ekranı gelecektir. (Bazı kısımları kalabalık bir görüntü olmaması için kaldırdım ve yorum satırı olarak #... ekledim)
2023-06-30 14:07:58 [scrapy.utils.log] INFO: Scrapy 2.9.0 started (bot: scrapybot)
2023-06-30 14:07:58 [scrapy.utils.log] INFO: Versions: lxml 4.9.2.0, libxml2 2.9.4, cssselect 1.2.0, parsel 1.8.1, w3lib 2.1.1, Twisted 22.10.0, Python 3.11.0 (v3.11.0:deaf509e8f, Oct 24 2022, 14:43:23) [Clang 13.0.0 (clang-1300.0.29.30)], pyOpenSSL 23.2.0 (OpenSSL 3.1.1 30 May 2023), cryptography 41.0.1, Platform macOS-12.5.1-arm64-arm-64bit
2023-06-30 14:07:58 [scrapy.crawler] INFO: Overridden settings:
# ...

2023-06-30 14:07:58 [scrapy.utils.log] DEBUG: Using reactor: 
# ...
2023-06-30 14:07:58 [scrapy.middleware] INFO: Enabled extensions:
#...
2023-06-30 14:07:59 [scrapy.middleware] INFO: Enabled downloader middlewares:
# ...
[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
# ...
[s]   view(response)    View response in a browser
>>> 
- Shell ortamında response.text dediğimiz zaman sayfa içeriği html tag'leri de dahil cevap olarak döner.

>>> response.text
- Cevap olarak aşağıdaki gibi bir çıktı görürsünüz.

'<!DOCTYPE html>\n<html lang="en">\n<head>\n\t<meta charset="UTF-8">\n\t<title>Quotes to Scrape</title>\n    <link rel="stylesheet" href="/static/bootstrap.min.css">\n    <link rel="stylesheet" href="/static/main.css">\n</head>\n<body>\n    <div class="container">\n        <div class="row header-box">\n            <div class="col-md-8">\n                <h1>\n                    <a href="/" style="text-decoration: none">Quotes to Scrape</a>\n                </h1>\n            </div>\n            <div class="col-md-4">\n                <p>\n                \n                    <a href="/login">Login</a>\n                \n                </p>\n            </div>\n        </div>\n    \n\n<div class="row">\n    <div class="col-md-8">\n\n    <div class="quote" itemscope itemtype="http://schema.org/CreativeWork">\n        <span class="text" itemprop="text">“To the well-organized mind, death is but the next great adventure.”</span>\n        <span>by <small class="author" itemprop="author">J.K. Rowling</small>\n        <a href="/author/J-K-Rowling">(about)</a>\n        </span>\n        <div class="tags">\n            Tags:\n            <meta class="keywords" itemprop="keywords" content="death,inspirational" /    > \n            \n            <a class="tag" href="/tag/death/page/1/">death</a>\n            \n            <a class="tag" href="/tag/inspirational/page/1/">inspirational</a>\n            \n        </div>\n    </div>\n\n    <nav>\n        <ul class="pager">\n            \n            \n        </ul>\n    </nav>\n    </div>\n    <div class="col-md-4 tags-box">\n        \n    </div>\n</div>\n\n    </div>\n    <footer class="footer">\n        <div class="container">\n            <p class="text-muted">\n                Quotes by: <a href="https://www.goodreads.com/quotes">GoodReads.com</a>\n            </p>\n            <p class="copyright">\n                Made with <span class=\'sh-red\'>❤</span> by <a href="https://scrapinghub.com">Scrapinghub</a>\n            </p>\n        </div>\n    </footer>\n</body>\n</html>'
- Örneğin aşağıdaki html elementindeki veriye erişmeye çalışalım

<small class="author" itemprop="author">J.K. Rowling</small>
- Shell ortamında css seçicileri kullanarak html_elementi.css_class_adi diyerek erişim sağlayabiliriz.

>>> response.css('small.author')
[<Selector query="descendant-or-self::small[@class and contains(concat(' ', normalize-space(@class), ' '), ' author ')]" data='<small class="author" itemprop="autho...'>]
- Gördüğünüz üzere Selector sınıfına ait obje listesine erişebiliyoruz. Bu Selector objeleri birçok fonksiyona sahiptir örneğin; extract(), extract_first()
>>> response.css('small.author').extract()
['<small class="author" itemprop="author">J.K. Rowling</small>']
- Selector objesini string olarak çıkartmak(extract) için bu fonksiyonları kullanabiliriz. small etiketleri arasındaki author classına sahip olan html text'e erişmek için small.author::text erişim yöntemini kullanabiliriz. extract_first fonksiyonu ile de ilk objeye ait veriyi çıkartabiliriz.
>>> response.css('small.author::text').extract()
['J.K. Rowling']
>>> response.css('small.author::text').extract_first()
'J.K. Rowling'
- Şimdi class'ı text olan span elementine erişelim

>>> response.css("span.text").extract()
['<span class="text" itemprop="text">“To the well-organized mind, death is but the next great adventure.”</span>']
- Bu elementin HTML text'ini çıkarmak için span.text::text erişim yöntemini kullanalım

>>> response.css("span.text::text").extract_first()
'“To the well-organized mind, death is but the next great adventure.”'
- Sayfaya ait a etiketindeki tag class'ında bulunan etiketleri almak için

>>> response.css('a.tag::text').extract()
['death', 'inspirational']

XPath ile data üzerinde çalışmak

Hedef siteden verileri CSS seçicileri kullanarak aldığımız gibi xpath kullanarak da alabiliriz. Burada text()'i method(fonksiyon) gibi kullanıyoruz.

>>> response.xpath('//small[@class="author"]/text()').extract()
['J.K. Rowling']
- class'ı tags olan div'lere ait class'ı tag olan elementlerin href değerlerine erişmek için aşağıdaki yöntemi kullanıyoruz.

>>> response.xpath('//div[@class="tags"]/a[@class="tag"]/@href').extract()
['/tag/death/page/1/', '/tag/inspirational/page/1/']
- a elementinin text bilgisine erişmek için aşağıdaki yöntemi kullanıyoruz.

>>> response.xpath('//div[@class="tags"]/a[@class="tag"]/text()').extract()
['death', 'inspirational']