Web Crawler/Spider ve Scrapy


Web Crawler Nedir?

  • Crawl kelimesi “emeklemek, yavaş ilerlemek” anlamına gelmektedir. Belirli bir hedefe, amaca ulaşmak için yapılan bir takım işlemlerdir.
Web Crawler

Web Crawler Nasıl Ortaya Çıktı?

  • Web crawler arama motorlarının doğuşu ile beraber ortaya çıktı. Arama motorlarının internet üzerinden linkleri toplayıp, indexleyip, insanların bilgiye doğru ve hızlı bir şekilde ulaşmasını amaçlamışlar. Kısaca linkleri izlemek ve bilgi toplamak amacıyla ortaya çıkıyor.
Web Crawler / Search Engine

Neden Crawler ve Spider isimleri verilmiş?

  • Aslında yukarıda da söylediğim gibi belirli zaman aralıklarıyla sürekli olarak aynı işlemlerin tekrarlanması(linklerin izlenmesi), crawl kelimesinin bebeklerin ve sürüngenlerin hedefe ulaşmak için yaptıkları bir takım işlemlere benzetilmesi, linklerin izlenmesi ve ağ yapısının büyümesinin örümceklerin ağ örmesine benzetilmesidir.
Crawler/Spider

Web Crawler Basit Çalışma Mantığı Nasıldır?

  1. Web sayfalarını indir
  2. Bağlantıları çıkar
  3. Anahtar kelimeleri çıkar
  4. Kelime ve sayfa bilgisini indexer geçir
  5. Bulunduğun bağlantıdan devam et ve aynı adımları tekrarla.

Web Crawler Basit Çalışma Mantığı

Web Crawler Basit Çalışma Mantığı
  • Web Crawler kendi içinde kategorilere ayrılmaktadır. Şimdilik sadece isimlerini vermek ile yetineceğim ve bu kısımları scrapy ile bir uygulama yazarken ihtiyaçlar dahilinde nasıl kullandığını göstereceğim. Bunlar; DeepCrawl, Full Body Text, Meta Robot Tag, Frame Support, Meta Description, Stop Words, Robots.txt, Meta Keywords gibi..

Web Crawler Kavramları Nelerdir?

  • Kavramlar konusu genişletilebilir fakat genel olarak en çok kullanılan 2 konsept var. Focused Crawler ve Distributed Crawler
Web Crawler Kavramları

Web Crawler vs Web Scraping

  • Kısaca web crawler linkleri izlemek, listelemek, indekslemektir. Google, Yandex, Yahoo, Bing gibi arama motorlarının sitelere gönderdikleri örümcekler, botlar gibi…
  • Web Scraping ise kişinin isteğine bağlı olarak belirli bilgilerin toplanması ve işlenmesidir.
Web Crawler vs Web Scraping

Web Crawling/Scraping Legal mi?

  • Web crawling yasal bir olaydır. İllegal olan kısmı dataların toplanması değil, toplandıktan sonra analiz etmek, datayı anlamlandırmak ve kurumlara satılmasıdır. Bunun dışında bilgi toplarken dikkat etmemiz gereken kurallar vardır.
  • Web crawling doğru şekilde yapılmadığı sürece engellenebilirsiniz daha kötüsü karşı tarafı çökertebilirsiniz. Bir çeşit DDOS saldırı yapabilirsiniz. Bununla ilgili olarak şöyle bir resim paylaşacağım. Altına ufak bir açıklama geçeceğim ve konuyu daha fazla uzatmadan Scrapy kullanımını ve mimarisini anlatmaya başlayacağım.
Web Crawling/Scraping Legal mi?

Dikkat Etmemiz Gerekenler

  • Burada ki dikkat etmemiz gereken nokta bilgi toplarken karşıda ki sistemin kaynaklarını kullanıyor olmamız. Tabi birçok site bu konularla ilgili güvenlik önemleri alıyor, hatta robots.txt içinde siteyi crawl ederken uymanız bazı kurallar bırakırlar. Zaman sınırlaması, user-agent bilgisi gibi. Ama aynı zamanda bu konu ile ilgili çok fazla case var.
  • Örneğin aynı ip adresinden belirli bir süre içinde birden fazla linke ulaşmak istemesi, User-Agent’a göre filtreleme yapma gibi…
  • Sisteminizi, crawlerınızı tasarlarken bunları göz önünde bulundurarak, sisteme saldırıyor gibi değil, insancıl zamanlarla beraber(politeness time) siteleri gezmemiz gerekmektedir.

Crawling için kullanabileceğimiz birden fazla kütüphane, framework var. Bunlardan bazılarını saymak gerekirse;

Crawling Frameworks/Libs
  • Şuan için sadece Scrapy framework anlatacağım. Arada Selenium, requests ve beautifulsoup kütüphanelerine de gönderme yaparız.

Scrapy

Python Scrapy

Scrapy Nedir?

  • Scrapy nedir çok kısaca tekrar edecek olursak, web içeriklerini kolaylıkla ve hızlıca tarayabilmemizi sağlayan gelişmiş bir frameworktur diyebiliriz.
  • Şimdi sistemimize scrapy kurarak başlayalım. Python projeleri üzerinde çalışırken virtualenv oluşturmak daha iyi olacaktır. Bu makaleye özgü bir konu değil ondan direk olarak geçiyorum ama bilmiyorsanız ve öğrenmek istiyorsanız, şunları inceleyebilirsiniz. virtualenv/virtualenvwrapper

Scrapy -> https://scrapy.org/

Scrapy Tutorial -> https://docs.scrapy.org/en/latest/

Scrapy Kurulumu

  • Sanal ortamımızı oluşturalım. Scrapy paketimizi python paket yöneticisi ile yükleyelim.
  • Eğer yükleme başarılı olduysa scrapy yazdığınızda kullanabileceğiniz komutlar yukarıda ki gibi ekrana gelecektir.
  • Scrapy kurduk ve artık bir proje oluşturup kodumuzu yazmamız gerekiyor. Scrapy çok geniş bir yapıya sahip olduğu için herşeyi burada anlatmamız çok güç olur. Bu yüzden bir tane web sitesi seçelim ve site üzerinde ki linkleri toplayalım.

Planlama Yapalım!!!

  1. Hedef siteyi belirle
  2. Sitenin robots.txt gözden geçir
  3. Scrapy komutları ile projemizi oluştur
  4. Modelin varsa items.py içine tanımla
  5. Spider oluştur
  6. Settings dosyasını düzenle
  7. Çalıştır ve dataları al.

  • Şimdi böyle minimal bir planımız var. Adım adım yapmaya başlıyorum.

1. Hedef siteyi belirle -> https://example.com

2. Sitenin robots.txt gözden geçir -> https://example.com/robots.tx

3. Scrapy projesini oluştur

Scrapy Project Structure

4. Modelimizi items.py içine tanımlayacağız.

  • Modelden kastımız siteyi gezerken, site içerisinden alacağımız verilerin yazılacağı kolonlar gibi düşünebilirsiniz. Biz user isimlerini alalım ve aynı zamanda kaç kişiyi takip ediyorlar, kaç kişi tarafından takip ediliyorlar bilgilerini alalım. Şimdi nasıl olmuş oldu userID, following, followers .. Çıktı olarak json data istiyorum. Tabi siz farklı şekilde çıktılar alabilirsiniz. Database yazabilirsiniz, json, csv olarak alabilirsiniz gibi… Bunun içinde ayrı geliştirme yapmanız gerekiyor.
  • items.py

5. Spider oluştur.

# scrapy genspider SpiderIsmi hedefSite — template=crawl
(scrapyTest) ☁  example  ls example/spiders
__init__.py __pycache__ example_spider.py
  • Şimdi spiderımız oluşturuldu.
  • spider dizini altında example_spider.py isminde python dosyamızı oluşturdu. Biz bunu kendimiz de oluşturabilirdik. Sadece scrapy komutlarını nasıl kullandığımızı da görmenizi istediğim için yaptım. Biz spider kodumuzu kendimize uygun şekilde yazacağız. Spider yazmadan önce miras alacağınız yapıların dökümanlarına bakmak mantıklı olacaktır. Ekstra bir iş yapmamanız açısından sizin içinde zaman kaybı olmamız olur.

Spiders Doc -> https://doc.scrapy.org/en/latest/topics/spiders.html

Spider kodumuzu yazalım

  • Burada bir prototip oluşturduk. SitemapSpider kullandık. Dokümantasyonu okuyarak amaca uygun bir yapıyı kullanmak çok önemli.
  • Biz sitemap.xml dosyasından yola çıkarak sitemap_rules içinde kuralımızı belirttik ve tüm sitemap.xml işleyerek bizim kurallarımıza göre dataları alıp, oluşturduğumuz model yapısını kullanarak dışarıya json, csv data aktarabilir yada direk olarak bir database insert edebiliriz.
  • parse_detail fonksiyonu içerisinde ki get_id() get_userID() gibi fonksiyonlar ExampleSpiderSpider class içerisinde olacaktır. Burada prototip bir uygulama yazdık. Ama pratikte yapacağınızla birebir aynı olacak.

6. Settings dosyasını düzenleyelim

  • Settings dosyasından çok fazla ayar var.
  • Bizim için önemli olanlardan bazıları Concurrent_Requests sayımızı abartmamak. User-Agent kullanmak, Download_Delay 1–3sn arası vermek, Proxy kullanmak gibi…

Settings Doc -> https://doc.scrapy.org/en/latest/topics/settings.html

7. Çalıştır ve dataları al.

scrapy crawl SpiderIsmi -o OutputIsmi.json

Genel olarak yapı böyle. Tabiki de bu sadece SitemapSpider kullanımı için. Dökümantasyonu okuyarak daha fazla bilgi edinebilir, crawler yazabilirsiniz. Eğer takıldığınız, sormak istediğiniz bölümler var ise sorabilirsiniz. Redis, Rethinkdb gibi entegrasyonlar yapacaksanız öncelikle pipeline kısmında bir geliştirme yapmanız gerekecektir. Daha sonra settings kısmını düzenlemeniz yetecektir. Kendiniz proxy yazacaksanız middleware dosyasının içine yazabilirsiniz. Hali hazırda çok fazla middleware yazılmış, siz bir geliştirme yapmadan önce scrapy dökümantasyonlarını okumanızı tavsiye ederim.