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
Örnek olarak http://quotes.toscrape.com/random adresini hedef website URL olarak verelim
- 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
>>>
'<!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>'
>>> response.css('small.author')
[<Selector query="descendant-or-self::small[@class and contains(concat(' ', normalize-space(@class), ' '), ' author ')]" data='<small class="author" itemprop="autho...'>]
>>> response.css('small.author').extract()
['<small class="author" itemprop="author">J.K. Rowling</small>']
>>> response.css('small.author::text').extract()
['J.K. Rowling']
>>> response.css('small.author::text').extract_first()
'J.K. Rowling'
>>> response.css("span.text").extract()
['<span class="text" itemprop="text">“To the well-organized mind, death is but the next great adventure.”</span>']
>>> response.css("span.text::text").extract_first()
'“To the well-organized mind, death is but the next great adventure.”'
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.
- class'ı tags olan div'lere ait class'ı tag olan elementlerin href değerlerine erişmek için aşağıdaki yöntemi kullanıyoruz. - a elementinin text bilgisine erişmek için aşağıdaki yöntemi kullanıyoruz.