Python Scrapy ile Web Crawling

Scrapy_101

Scrapy

Kurulum

  • pip install Scrapy diyerek terminalden kurulumu yapabilirsiniz.

    • Şu anda 1.5 sürümünü kurdum ve python 2.7 ile 3.4+ destekliyor.

Shell Ortamında İşlemler

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

    • Örnek; scrapy shell http://quotes.toscrape.com/random.
    • Bu komutu çalıştırınca aşağıdaki gibi bir sonuç ekranı gelecektir.
 
  • Shell ortamında response.text dediğimiz zaman sayfa içeriği html tag'leri de dahil cevap olarak döner. Aşağıdaki data bize dönen cevap:
 
  • CSS seçicileri kullanarak sayfadaki <small class='author' ..> etiketinde bulunan dataya erişmek için:
 
  • Gördüğünüz üzere bir liste (yani dizi, array) döndü.
 
  • Burada [index] veya extract_first() diyerek string değere erişebiliriz.
 
  • ETIKET.SINIF_ADI::text diyerek etikete ait text'e erişebiliyoruz.
  • Yazara ait alıntı söz <span class='text' ... > etiketinde duruyor. Erişmek için:
 
  • Sayfaya ait a etiketindeki tag class'ında bulunan etiketleri almak için:
 

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.
 
    1. yazdığımız xpath ile div altında a HTML etiketinin tag class'ının href attribute'unu alabiliyoruz. Yani URL adresini a HTML etiketinden alabiliyoruz.
    1. yazdığımız örnekte ise 1. örnekteki gibi yazıp sadece text()'leri aldık.

Scrapy Proje Oluşturma

$ scrapy startproject benim_projem diyerek proje oluşturabilirsiniz.

 
  • adnan_scrapy adında proje oluşturduktan sonra. spiders klasörü altında scrapy genspider OrumcekAdam HEDEF_SITE komutunu vererek, OrumcekAdam isminde spider oluşturduk. Hedef site olarak da toscrape.com sitesini gösterdik.
 
  • spiders/OrumcekAdam.py: Aşağıdaki gibi bir spider python dosyası oluştu.
 
  • Şimdi bu dosyayı düzenleyelim:
 
  • Şimdi scrapy runspider OrumcekAdam.py diyerek spider'ı çalıştırınca, terminalden şöyle bir çıktı alıyoruz:
 
  • Site random quote yayınladığı için bu defa farklı bir quote döndü. Ancak istediğimiz verileri siteden çektik.
  • Dönen datayı json dosyasına yazmak için
  • scrapy runspider OrumcekAdam.py -o DOSYA_ADI.json
  • Dosya içeriği:
 
  • Hedef siteyi değiştirerek çoklu veri çekmeyi görelim.
 
  • start_urls adresinde random subdomaini kaldırdık. Web sayfasını ziyaret ederseniz 10 ade quote sergilendiğini göreceksiniz.
  • Hedef sitede her quote bir div altında bulunduğu için for döngüsü ile bütün quote'lar üzerinde gezebiliriz.
  • Çıktı olarak json dosyasına yazdığımızda aşağıdaki gibi bir sonuç alırız.
 

Pagination with Scrapy

  • Web sayfalarında next, 2, 3 .. gibi sayfalanmış web içeriğini çekmeyi öğrenelim.
 
  • Üstteki kod http://quotes.toscrape.com/ sayfasının source code'unun bir parçası.
 
  • next_page_url ile sonraki sayfanın URL'ini aldık.
  • response.urljoin ile root URL ile birleştirdik.
  • scrapy.Request ile de parse methodunu tekrar çağırıp hedef siteye tekrar istek yaptık.
  • Bu spider'ı çalıştırınca kaç adet sayfa var ise içerisinde gezinip verileri çekecektir. scrapy runspider OrumcekAdam.py -o pagination.json diyerek json dosyasında aldığınız veriyi görebilirsiniz.
  • Terminalden bakınca alınan data adedini: 'item_scraped_count': 100, ekran çıktısı üzerinde görebilirsiniz.

Page Detail

  • Web sayfalarında bir yazarın, ürünün vb. detay sayfası olur ve o kimse veya ürün hakkında açıklamalar yazar.
  • Bu bölümde yazarın detay sayfasından adını ve doğum tarihini alacak kodları görelim.
 
  • Terminalde shell ortamında bir kaç örnek üzerinden bakarsak üstteki kodları anlayabiliriz.
 
  • pprint ile güzel ekran çıktıları görebiliriz.
  • author URL'leri aldıktan sonra urljoin ile absolute URL'i elde ediyoruz.
  • for url in urls içerisinde yield scrapy.Request(url=url, callback=self.parse_details) diyerek detay sayfasına request yapıyoruz. Toplamda 50 tane yazar verisini almış olacağız.

Infinite Scrolling

  • Twitter'daki gibi web browser'ı scroll yapınca(aşağı kaydırdıkça) verilerin yüklenmesi yani infinite scrolling ile verileri nasıl alabileceğimizi göreceğiz.
  • http://quotes.toscrape.com/scroll sayfasında infinite scrolling bulunuyor. Tarayıcı üzerinden mouse sağ tıklayıp "inspect/öğe incele" dedikten sonra network tab'ına geçip scrolling yani aşağı kaydırma yapınca quotes?page=SAYFA_NO göreceksiniz. Üzerinde tıkladığınızda scroll yaparken network bilgilerini göreceksiniz.
  • Request URL olarak: http://quotes.toscrape.com/api/quotes?page=SAYFA_NO göreceksiniz.
  • Şimdi terminal üzerinden bu URL ile çalışalım.
 
  • Yukarıdaki shell ortamında 4.sayfadaki veriler üzerinde çalışabilirsiniz.
  • Python koduna bakalım.
 
  • self.api_url.format(next_page) sonraki url için sayfa numarasını veriyoruz.

Form Submitting

  • quotes.toscrape.com sitesinde Login linkine tıkladığımızda bizi http://quotes.oscrape.com/login sayfasına götürecek ve aşağıdaki kaynak kodun olduğu forma götürecek.
  • Login olmak için herhangi bir değer girebilirsiniz textbox'lara.
 
  • Login olduktan sonra aşağıdaki gibi Goodreads page linkini göreceksiniz. Logged in
  • Python koduna göz atalım:
 
  • Login olduktan sonra her yazarın goodreads linklerini aldık.
 

 

Yorumlar