Scrapy ile Web Scraping(Web kazıma) Nasıl Yapılır? 🕵🏻‍♀️ 👩🏻‍💻

Arzu Yıldız Toprak
5 min readSep 4, 2019

--

Web Scraping (Web Kazıma) Nedir? ⛏

Web Scraping yani Web Kazıma işlemi -bazen Web Hasadı olarakta adlandırılır- Vikipedi ’ ye göre ;

Web kazıma web sitelerinden bilgi çıkartmanın bilgisayar programı tekniğidir.

Yani kısaca Web Scraping kişinin isteğine bağlı olarak belirli bilgilerin toplanması ve işlenmesidir.

Peki amacı ne Web Scraping neden yapılır?

Web scraping, web üzerinde genel verilerin toplanmasını otomatik olarak gerçekleştirir. Veriyi çıkarılıp ⛏ sakladıktan 📘 sonra, istenilen şekilde kullanılabilir. 🥳

Web Scrapy çalışması

Web Scraping Legal mi? 🕵🏻‍♀️ 🤔

Web scraping yasal bir olaydır. İllegal olan kısmı dataların toplanması değil, toplandıktan sonra analiz etmek, veriyi anlamlandırmak ve kurumlara satılmasıdır.

Web crawling doğru şekilde yapılmadığı sürece engellenebilirsiniz daha kötüsü karşı tarafı çökertebilirsiniz.

Ben daha önce banlanmıştım(Sürekli ve yoğun veri kazıma işlemi yaptığım için).🙄

Dikkat etmeniz gereken durumlar var;

  • Veri kazıma ile bilgi toplarken karşıdaki sistemin kaynaklarını kullanıyoruz. Tabiki birçok site bu konuda güvenlik önlemleri alıyor.(Ben Zomato sitesini kazıyamadım bu yüzden) hatta robots.txt içinde uymanız gereken kurallar bırakıyorlar. Robots.txt leri kontrol edebilirsiniz.

Çok güzel şimdi nasıl yapabiliriz bu Web Scraping’i??

Bunun için birçok Kütüphane, Framework var;

Ben Scrapy ile çalıştım ve size Scrapy ‘i anlatacağım. 🥰

Scrapy Nedir, Nasıl Kullanılır?

Scrapy; Web içeriklerini kolaylıkla ve hızlıca tarayabilmemizi sağlayan gelişmiş bir frameworktur diyebiliriz.

Şimdi Scrapy Kuralım

Python ile kodlayacağız. Temel Python bilmiyorsanız göz atmanızda fayda var. Projelerde çalışırken virtualenv oluşturmak iyi olacaktır ama bende birçok virtualenv olduğu için kurmadım. Sanal makine kurmak isterseniz diye link bırakıyorum; virtualenv/virtualenvwrapper

Hatta kullanacağımız önemli linkleri buraya bırakayım 😊

Scrapy 👉 https://scrapy.org/

Scrapy Tutorial 👉 https://docs.scrapy.org/en/latest/

Scrapy Kurulum 👉 https://docs.scrapy.org/en/latest/intro/install.html

Anaconda veya Miniconda kullanıyorsanız , paketi Linux, Windows ve OS X için güncel paketleri olan conda forge kanalından yükleyebilirsiniz .

Ya da Terminalden kurabilirsiniz;

conda install -c conda-forge scrapypip install Scrapy

İşte bu kadar 💪

Scrapy kurduk ve artık projemizi oluşturup kodumuzu yazalım. Scrapy çok geniş bir yapıya sahip ama elimden geldiğince sizlere yardımcı olacağım.

Şimdi bi planlama yapalım ve başlayalım 👩🏻‍💼👩🏻‍💻

  1. Hedef siteyi belirleyelim 👉 https://www.tripadvisor.com.tr/Restaurants-g297977-Bursa.html'
  2. Sitenin robots.txt gözden geçirelim👉 https://www.tripadvisor.com/robots.txt
  3. Scrapy komutları ile projemizi oluşturalım
  4. Model varsa items.py içine tanımlayalım
  5. Spider oluşturalım
  6. Settings dosyasını düzenleyelim
  7. Çalıştırıp ve verileri alalım.

Ben TripAdvisor ‘ı seçtim. TripAdvisor; her gezginin ilk uğradığı sitelerden. dünyanın hemen hemen her bölgesindeki konaklama alternatifleri hakkında bizzat orada kalan müşteriler tarafından derecelendirilmiş ve yorumlarda bulunulmuş site. Bursa da yaşadığım için Bursa da ki restoranlar hakkındaki bilgileri kazımak istiyorum.😍

3-Scrapy komutları ile projemizi oluşturalım

Ben Vs Code kullanıyorum. Vs code da terminal açıp işe koyuluyorum !

scrapy startproject example
Scapy projemizin yapısı

_init_.py 👉 Python’da bir nesne çağırdığınızda otomatik olarak çalışacak ve sadece nesneyi ilk oluşturduğunuzda çalışacak olan dosyadır.

items.py 👉 projemize ait öğeler bu dosyada( items.py içinde hangi verileri çekeceğimizi tanımlayacağız.)

pipelines.py 👉 projemizdeki verileri bu dosya sayesinde paylaştıracağız.

settings.py 👉 projemize ait ayarlar

4- Model varsa items.py içine tanımlayalım

Ben TripAdvisor sitesinden restorana ait restoran adı, adresi, ülke, il, ilçe, telefon numarası, mutfak türü, puanı, yorum başlıkları ve yorum içeriklerini çekiyorum. Bu yüzden items.py dosyamda bu öğeleri Scrapy dosyası olarak tanımladım.

5-Spider oluşturalım

Örümcekler, taramanın nasıl gerçekleştirileceğini ve yapılandırılmış verilerin sayfalarından nasıl çıkarılacağını içeren belirli bir sitenin nasıl kazınacağını tanımlayan sınıflardır.

Yani Örümcekler, belirli bir sitenin sayfalarını taramak ve ayrıştırmak için özel davranışları tanımladığımız yerdir.

scrapy genspider SpiderIsmi hedefSite — template=crawlYani;scrapy genspider example2 https://www.tripadvisor.com.tr/Restaurants-g297977-Bursa.html
Spider oluşturulduktan sonraki proje yapısı

example2.py 👉 Web kazıma kodlarımızı yazacağımız dosya.

Bence şimdi size senaryomu anlatmalıyım ama kenardan TripAdvisor ı açmanızı öneririm.

Veri Kazımaya başlayacağımız site

Yukarıdaki fotoğrafta gördüğünüz gibi birçok alt link var yani bu sayfadan herhangi bir restorana tıklayıp açılan sayfadan veri kazıyacağız. Yani burdaki bütün restoran linklerini toplamalıyız. Artı olarak sonraki sayfalardaki verileri de toplamalıyız. Mesela Bursa Kebapçısına tıklayınca çıkan verileri kazıdığımızı düşünelim.

Hedefim Bursadaki bütün restoranların verilerini kazımak. 😎

Şimdi geçelim kodlamaya 💪 👩🏻‍💻

spiders/example2.py dosyamı açıyorum.

Github : https://github.com/yildizarzu/Scrapy-TripAdvisor

import işlemleri

Gerekli kütüphaneleri vs. import edip örümceğimize ekliyoruz.

import scrapy 👉 Scrapy i projemize ekliyoruz.

from ..items import ExampleItem 👉 2 klasör üstteki items.py dosyasından ExampleItem ‘ı projemize ekliyoruz.

from scrapy import Request 👉 Veri kazıma isteiğini gönderebeilmek için Scraapy den Reqıest’i projemize import ettik.

from urlparse import urljoin 👉 Url leri birleştirmek için kullanacağız(yeni linkler oluşturup kazıma yapmamız gerekiyor(bütün restoranları kazıyabilmek için))

from urlparse import urlparse 👉 Url leri parse etmek için kullanacağız.

Parse Fonksiyonu

Örümcek Sınıfımızı yazmaya başlıyoruz 🥰

Yukarıdaki yazdığımız Spider oluşturma özelliklerini görüyoruz;

name 👉Örümceğimizin ismi bunlar otomarik geliyor.

start_urls 👉 Web kazımaya başlayacağımız ilk site

Şimdi sıra geldi bütün restoran ve restoranları gösteren sayfaların linklerini almakta!

xpath ‘i bilmiyorsanız güzelce araştırıp öğrenmelisiniz çünkü bence püf nokta o. Hangi verileri çekeceğimize xpath kodu ile karar veriyoruz. Anahtar kelimeler ile kısa bir xpath yazmakta fayda var. xpath i öğrendikten sonra kazıyacağınız sayfanın üzerinde öğeyi incele diyip xpath’ini bulabilirsiniz.

Parse fonksiyonunda ;

ilk for döngüsünde 1 sayfadaki restoranların linkini topluyor ve verileri çekebilmek için Parse_page fonksiyonunu çağırıyor.

İkinci for döngüsünde sonraki sayfalara erişiyor ve sonra oradaki restoranların linklerini topluyor.

Parse_page fonksiyonu

Parse_page fonksiyonu ile Restoranların verilerini kazıyoruz. sonra bu verileri items.py deki öğelere yüklüyoruz.

Buraya spiders/example2.py kodlarının hepsini bırakıyorum.

6-Settings dosyasını düzenleyelim

Ben şuanlık pek bir değişiklik yapmadım ama karşıdaki siteyi yormamak adına Concurrent_Requests sayımızı abartmamak, User-Agent kullanmak, Download_Delay 1–3sn arası vermek, Proxy kullanmak gibi… ayarlar yapabilirsiniz.

settings.py

7-Çalıştırıp ve verileri alalım

scrapy crawl SpiderIsmi -o OutputIsmi.jsonYani
scrapy crawl example2 -o yeni.json

Kazıdığımız verileri json olarak aldım isterseniz Csv gibi başka formatlardada alabilirsiniz.

yeni.json

Umarım Faydalı olmuştur. Ben Scrapy ile çalışmaya başladığımda Türkçe pek kaynak bulamamıştım ve sizler için ufakta olsa Türkçe bir kaynak bırakmak istedim. Sabrınız için teşekkür ederim. Kodlamaktan vazgeçmeyin 💪

--

--

Arzu Yıldız Toprak

Yapay Zeka Mühendisi *Chatbots *Dialogflow *Scrapy *FASTAPI *Computer Vision