Categories
Rehber Yazılım

Python Web Scraping Kullanarak İnternetten Veri Nasıl Çekilir?

İnternetten bilgi toplamanın pek çok farklı çeşidi vardır. World Wide Web üzerinden veri toplamak için en popüler iki yöntem API (Applicaiton Programming Interface/Uygulama Programlama Arayüzü) ve Web Scraping (Web Kazıma) dir. Bu iki yöntemin arasındaki temel fark, sunulan verinin muhatabıdır.

Web Scraping vs API Çağrıları

API çağrılarında size verileri rahatça çekip kendi uygulamanızda kullanabilmeniz için end-pointler (uç noktaları) vardır.

Bu end-pointlere çeşitli HTTP/S istekleri göndererek istediğiniz verilere standart bir formatta ( genellikle JSON) ulaşabilirsiniz.

Öte yandan Web Scrapingde veriler bir web sitesinin çalışabilmesi için, websitesi tarafından tarayıcınıza gönderilir, renderlanır ve bu veriler buradan bu web sitesinin üzerinden adeta “kazınarak” toplanır.

Hedef Belirleme

Bu projemiz için n11.com üzerindeki bütün masaüstü bilgisayarların bilgilerini çekeceğiz. Öncelikle yapmanız gereken ilk iş hedefimizi tanımak. İstediğimiz verilerin nerelerde olduğunu belirlemek.

web sitesinde elementin kodu inceleniyor

Burada görebileceğimiz üzere ürünlerimizin hepsi, “column” class’ına sahip birer div ile kaplı. Bu sayede siteden hangi elementleri seçerek başlayacağımızı bulmuş olduk.

Sıradaki işimiz, her bir ürüne ait istediğimiz verileri tutan elementleri bulmak.

yazılmış kodlar inceleniyor

Yine geliştirici konsolumuzun yardımıyla ihtiyacımız olan elementleri belirmiş durumdayız. Bu örneğiniz için ihtiyacımız olan elementler şunlardır.

<h3 class="productName"> // Ürünümüzün adı
<a class="oldPrice"> // Ürünümüzün indirimsiz fiyatı
<a class="newPrice"> // Ürünümüzün indirimli fiyatı
<a class="plink"> // Ürünümüzün sayfasının linki

Fakat ihtiyacımız olan bir element daha var. Bir sayfada sadece belirli bir miktarda ürün listelendiğinden diğer ürünleri görebilmemiz için bir diğer sayfaya geçmemiz gerekiyor.

Bunun için de ürünlerin hemen altında bulunan sayfa butonlarını kullanacağız.sayfa sayıları görünüyor birinci sayfada sayfa sayıları var ellinci sayfada

Resimde de görüldüğü gibi son sayfaya gelene kadar next butonunu kullanabiliriz.

Bu sayede bir sayfadaki ürünleri bitirdiğimizde next butonunu kullanarak bir sonraki sayfaya geçip oradaki ürünleri çekmeye devam edebiliriz.

Gerekli bütün ön taramayı yaptıktan sonra artık kodlama kısmına geçebiliriz.

import requests
from bs4 import BeautifulSoup
import csv

site = requests.get("https://www.n11.com/bilgisayar/masaustu-bilgisayar")

soup = BeautifulSoup(site.content)

with open('laptops.csv', mode='w',encoding='utf-8') as laptops:
    laptopWriter = csv.writer(laptops, delimiter=',')
    laptopWriter.writerow(["Laptop Adı","Eski Fiyatı","Yeni Fiyatı","Link"]

page = soup.find(class_="next")

while page:
    site = requests.get(page["href"])
    soup = BeautifulSoup(site.content)
    products = soup.find_all(class_="column")

    for product in products:
        name = product.find(class_="productName")
        if name:
            name = name.get_text().strip()
            
        else:
            break
        oldPrice = product.find(class_="oldPrice")
        newPrice = product.find(class_="newPrice").get_text().strip()
        if oldPrice:
            oldPrice = oldPrice.get_text().strip()
        else:
            oldPrice = newPrice

        link = product.find(class_="plink")["href"]

        with open('laptops.csv', mode='a',encoding='utf-8') as laptops:
                laptopWriter = csv.writer(laptops, delimiter=',')
                laptopWriter.writerow([name,oldPrice,newPrice,link])
    page = soup.find(class_="next")

Kodumuzun üzerinden gidip ne yaptığına sırayla bir bakalım:


import requests
from bs4 import BeautifulSoup
import csv

Requests modülü sayesinde bir websitesinin raw (ham) HTML halini çekebilriz. Daha sonra bu raw HTML’i BeautifulSoup gibi bir HTML parser’ı kullanarak içerisinden ihtiyacımız olan verileri çıkarabiliriz.

Son olarak da csv modülü sayesinde, topladığımız verileri bir CSV (Comma Seperated Values/Virgülle Ayrılmış Değerler) dosyasına yazıp kullanabiliriz.

site = requests.get("https://www.n11.com/bilgisayar/masaustu-bilgisayar")

soup = BeautifulSoup(site.content)

with open('laptops.csv', mode='w',encoding='utf-8') as laptops:
    laptopWriter = csv.writer(laptops, delimiter=',')
    laptopWriter.writerow(["Laptop Adı","Eski Fiyatı","Yeni Fiyatı","Link"])

page = soup.find(class_="next")

Burada ise masaüstü bilgisayarların olduğu ilk sayfayı requests ile çekip BeautifulSoup ile işlenmeye hazır hale getiriyoruz.

Daha sonra bir CSV dosyası açıp içine başlılarımızı yazıp kapatıyoruz.

Burada dikkat etmemiz gereken bir husus ise Türkçe karakter kullandığımız için dosyayı utf-8 modunda açmamız gerektiğidir.

Aksi takdirde hata alabiliriz. Son olarak, sayfalar arasında ileri gitmemizi sağlayacak olan next butonunu bulup bir değişkene atıyoruz.

while page:
    site = requests.get(page["href"])
    soup = BeautifulSoup(site.content)
    products = soup.find_all(class_="column")

    for product in products:
        name = product.find(class_="productName")
        if name:
            name = name.get_text().strip()
            
        else:
            break
        oldPrice = product.find(class_="oldPrice")
        newPrice = product.find(class_="newPrice").get_text().strip()
        if oldPrice:
            oldPrice = oldPrice.get_text().strip()
        else:
            oldPrice = newPrice

        link = product.find(class_="plink")["href"]

        with open('laptops.csv', mode='a',encoding='utf-8') as laptops:
                laptopWriter = csv.writer(laptops, delimiter=',')
                laptopWriter.writerow([name,oldPrice,newPrice,link])
    page = soup.find(class_="next")

Döngümüzün içinde ilk önce next butonumuzun işaret ettiği sayfayı request ile çekip BeautifulSoup ile işlemeye hazır hale getiriyoruz.

Daha sonra, daha önceden belirlemiş olduğumuz ürün class’ımızı kullanarak bütün ürünlerimizin olduğu elementleri çekiyoruz.

İkinci döngümüzde ise bu ürünlerimizin içerinde teker teker gezip ihtiyacımız olan bilgileri çekiyoruz.

Bir ürünün bütün bilgilerini çektikten sonra en başta açtığımız CSV dosyasını tekrar açıp ekliyoruz.

Burada dikkat etmemiz gereken kısım dosyayı “w” (write/yazma) moduyla değil “a” (append/ekleme) moduyla açmamız gerektiğidir zira daha önce yazdığımız bütün verilerimizin üzerine yazarız.

Son olarak, şu anda ürünlerini çektiğimiz sayfanın next butonunu alıp ilk döngümüze geri dönüyoruz. Bu süreç “page” değişkeni yani next butonumuz boş olana kadar devam edecek.

Bunun olmasının tek yolu sitede en son sayfaya gelmiş olmamızdır.

Sonuç: Örnek Çıktı

Laptop Adı,Eski Fiyatı,Yeni Fiyatı,Link

Dell G5DT-B70W165N i7-10700F 16GB 512GB SSD 6GB GTX 1660 W10H,"12.499,99 TL","11.879,99
                TL",https://urun.n11.com/masaustu-bilgisayar/dell-g5dt-b70w165n-i7-10700f-16gb-512gb-ssd-6gb-gtx-1660-w10h-P469658715

"Zeiron Sn107 İ5-650 3,46Ghz 8GB 120GB SSD 18.5 Masaüstü Bilgisaya","4.450,00 TL","2.249,00
                TL",https://urun.n11.com/masaustu-bilgisayar/zeiron-sn107-i5-650-346ghz-8gb-120gb-ssd-185-masaustu-bilgisaya-P456175492

"Zeiron Sn108 İ5-650 Turbo 3,46Ghz 8GB 500GB 18.5 Masaüstü Bilgisa","4.250,00 TL","2.199,00
                TL",https://urun.n11.com/masaustu-bilgisayar/zeiron-sn108-i5-650-turbo-346ghz-8gb-500gb-185-masaustu-bilgisa-P456176226

"i5 8GB Ram 128GB Ssd 18,5"" Monitör Masaüstü Bilgisayar - EBA TV","2.429,00 TL","2.022,58
                TL",https://urun.n11.com/masaustu-bilgisayar/i5-8gb-ram-128gb-ssd-185-monitor-masaustu-bilgisayar-eba-tv-P368648481

Dragos ATM9922509 i3 10100f 8GB Ram 240GB Ssd 4GB GTX1650 Oyun Bi,"4.650,64
                TL","4.650,64
                TL",https://urun.n11.com/masaustu-bilgisayar/dragos-atm9922509-i3-10100f-8gb-ram-240gb-ssd-4gb-gtx1650-oyun-bi-P463168484

Yukarıdaki küçük pyhon script’imiz sayesinde yaklaşık olarak 4.000 masaüstü bilgisayarın bilgilerini dakikalar içerisinde çekmiş olduk. Yazımızda öğrendiğimiz teknikleri kullanarak bu script’i benzer sitelere uyarlayabilir veya farklı bir web scraping ihtiyacınız için kendi scriptinizi kolaylıkla yazabilirsiniz.

Leave a Reply

Your email address will not be published. Required fields are marked *