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 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.

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.

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 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 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 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.

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;

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

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.
pip install scrapy
  • 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

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

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class ExampleItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
id = scrapy.Field()
userID = scrapy.Field()
followers = scrapy.Field()
following = scrapy.Field()

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

# -*- coding: utf-8 -*-

from scrapy import Request
from scrapy.spiders import SitemapSpider

from example.items import ExampleItem


class ExampleSpiderSpider(SitemapSpider):
# Spider ismi -> calistirirken bu ismi kullanacagiz (settings)
name = 'example-spider'

allowed_domains = ['example.com']

# start_urls - Robots.txt kontrol ettikten sonra Sitemap
start_urls = ['http://example.com/']

# sitemap icinde belirli url ayiklamak icin rules yazalim
# /birseyler buldugu linkeri parse fonksiyonuna yollayacak
sitemap_rules = [("/birseyler", "parse")]


def parse(self, response):
# Sitenin yapisina gore parse edelim
# Clean url seklinde alip parse_detail isimli fonksiyona gonderelim

if 'bulunamadi' not in response.body:
# ... filtreler
# ... xpath / css / selector vs kullanimlari

for page in pages:
# ...
# callback function onemli
# parse_detail de istenilen datalari parse edecegiz
yield Request(url=response.url,
callback=self.parse_detail)

# Sayfa paginate mantiginda olabilir
next_page = response.xpath('//filtreleme')
if next_page:
# Bir sonraki sayfayi tekrardan parse kendine gonderecek
yield Request(response.url, callback=self.parse)
else:
return


def parse_detail(self, response):
# Modelimizi kullanalim
item = ExampleItem()
item['id'] = get_id()
item['userID'] = get_userID()
item['followers'] = get_followers()
item['following'] = get_following()
yield item
  • 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.