Web Scraping Nasıl Yapılır: Yeni Başlayanlar İçin Rehber

Web scraping öğrenmek iyi bir fikir mi? Yüzlerce saatlik işten tasarruf etmek istiyorsanız, kesinlikle öyle. Ayrıca programcı olarak sahip olunması harika bir beceri.

Web scraping, web sitelerinden veri çıkarma işlemidir. Veriler her yerde bulunduğundan, temel ve ileri düzey tekniklerde ustalaşarak bunları alabilir ve etkili bir şekilde işleyebilirsiniz.

Web sitesi yapısını anlamaktan temel tekniklere ve ileri düzey web scraping kavramlarına kadar tüm temel bilgileri içeren bir başlangıç rehberi hazırladık; böylece bu konuda uzmanlaşabilirsiniz.

Web Sitesi Yapısını Anlamak

Scraping işlemine başlamadan önce web sitelerinin nasıl yapılandırıldığını anlamanız gerekir.

Öncelikle web siteleri kod kullanılarak oluşturulur. En yaygın diller HTML (Hypertext Markup Language), CSS (Cascading Style Sheet) ve JavaScript’tir.

HTML kullanımı kolay olduğundan en popüler olanıdır. Etiketlerle temsil edilen öğeleri kullanarak web sayfalarının yapısını ve içeriğini tanımlar.

Örneğin,

  • başlıklar için <h1>,
  • paragraflar için <p>,

bunlardan yalnızca birkaçıdır (ve çok daha fazlası vardır).

HTML kodunun nasıl görüneceğine dair bir örnek:

<html> <head> <title>Example Website</title> </head> <body> <h1>Welcome to my website!</h1> <p>This is a paragraph of text.</p> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul> </body> </html> </body> </html>

Son olarak CSS, HTML öğelerinin stilini tanımlarken JavaScript, web sitelerinin dinamik davranışından sorumludur.

Kullanacağımız scraping aracı, sayfada gezinmek için sayfanın yapısından yararlanacak ve çıkarılacak içeriği belirleyecektir. Daha düzenli ve açıklayıcı bir yapıya sahip siteleri scrape etmek genellikle daha kolaydır. Yeni başlayan biri olarak buna kesinlikle seviniyorsunuzdur, değil mi?

Geliştirme Ortamınızı Kurma

Artık web sitesi yapısı hakkında bir fikriniz olduğuna göre geliştirme ortamınızı kurmaya başlayabilirsiniz.

Öncelikle bir programlama dili seçmeniz gerekir; çünkü tüm diller bu iş için uygun değildir. Python, üst düzey ve kullanımı kolay olduğu, ayrıca harika kütüphanelere, çerçevelere ve yerleşik araçlara sahip olduğu için scraping işlemlerinde en popüler tercihtir.

Bunlar, scraping ile ilgili belirli görevleri çözmenizi sağlar. Örneğin:

  • Requests: hedef web sitesine HTTP istekleri göndermeyi kolaylaştırır.
  • BeautifulSoup: bu kütüphane HTML ve XML belgelerini ayrıştırmak için kullanılır. Ama bir dakika, ayrıştırma nedir? Yapılandırılmış verileri analiz etme ve yorumlama işlemidir.
  • Selenium: insan etkileşimini taklit eden görevleri gerçekleştirmek üzere web tarayıcılarını otomatikleştirmek için kullanılır.
  • Scrapy: bu kapsamlı çerçeve web tarama (veri çıkarmak için URL’leri arama), veri madenciliği ve otomatik test gibi çeşitli görevlerde kullanılabilir.

Nasıl Başlanır?

  1. Ortamı kurma: Python’ın en son sürümünü indirip yükleyin. İşte bu kadar kolay.
  2. Sanal ortam kurma: Projenizin bağımlılıklarını yalıtmak için bir sanal ortam oluşturun. Bir terminal açın ve aşağıdaki komutları çalıştırın:
python -m venv myenv source myenv/bin/activate # For Unix/Linux myenv\Scripts\activate.bat # For Windows

3. Kütüphaneleri ve araçları yükleme: Başlangıç için Requests, Selenium, BeautifulSoup ve Scrapy’yi yüklemenizi öneririm. Bunları “pip install” komutunu kullanarak yükleyebilirsiniz; bir terminal açıp aşağıdakini çalıştırmanız yeterli:

pip install requests beautifulsoup4 scrapy selenium

Web Scraping 101: Etik ve En İyi Uygulamalar

Bir dakika. Teknik konulara geçmeden önce web scraping’in etik sonuçlarını ve en iyi uygulamalarını inceleyelim.

Her scraping uzmanı bunları az çok bilir; ancak yeni başlayanların sınırları aşmamak için aşağıdaki yönergeleri anlaması gerekir:

  • Robots.txt dosyasına uyun: Scraping’in ilk kuralı Robots.txt dosyasına uymaktır. Bu, her sitenin sahip olduğu ve neleri scrape edip edemeyeceğinizi herkese bildiren bir metin dosyasıdır.
  • Sitenin hizmet şartlarına uyun: Web scraping’e izin verilip verilmediğini görmek için sitenin hizmet şartlarını kontrol edin.
  • Scraping sıklığını ve sunucular üzerindeki etkisini sınırlayın: Kısa sürede çok fazla istek göndermekten kaçının. Ayrıca istekler arasında gecikmeler uygulayarak sunucuya aşırı yük bindirmekten kaçının.
  • API’leri kullanın (varsa): Scraping işleminden önce sitenin verilere erişim için bir API sunup sunmadığını kontrol edin. Bir scraper üzerinde çalışıp da API’nin mevcut olduğunu sonradan öğrendiğim, ama kontrol etmeye zahmet etmediğim zamanları anlatayım. API kullanmak çok daha kolaydır (bana güvenin), çünkü yapılandırılmış veriler sağlar.
  • Yasal hususlar: Herhangi bir fikrî mülkiyet hakkını ihlal etmediğinizden veya herhangi bir kuralı çiğnemediğinizden emin olmak için yasaları kontrol edin. Emin değilseniz önce bir avukata danışmanız daha iyi olur.

Web Scraping’e Başlarken: Temel Teknikler

Peki, teori ve kavramları tamamladık; şimdi işe koyulalım. Öğreneceğiniz ilk şey HTTP isteklerinin nasıl gönderileceği.

Python’ın Requests Kütüphanesiyle HTTP İstekleri (GET, POST) Gönderme

Burada Python’daki Requests kütüphanesini kullanacağız. Bir örneğe bakalım:

import requests url = 'https://example.com' response = requests.get(url) html_content = response.text

Burada scrape etmek istediğiniz sayfanın URL’sini belirtiyorsunuz. requests.get () ile bir GET isteği gönderiyoruz ve sayfanın HTML içeriği html_content değişkeninde saklanıyor.

BeautifulSoup ile HTML'yi Ayrıştırma

HTML içeriğine sahip olduğunuzda, belirli verileri çıkarmak için BeautifulSoup kütüphanesini kullanarak içeriği ayrıştırabilirsiniz. İşte bir örnek:

from bs4 import BeautifulSoup soup = BeautifulSoup(html_content, 'html.parser') title = soup.find('h1').text paragraphs = soup.find_all('p')

Bu kodda, HTML içeriğini ve ayrıştırıcıyı (bu durumda ‘html.parser‘) belirterek bir BeautifulSoup nesnesi oluşturuyoruz. Ardından etiketlere veya özniteliklere göre belirli öğeleri bulmak için find() ve find_all() gibi yöntemleri kullanabiliriz.

CSS Seçicileri ve find() ile find_all() Gibi Yöntemlerle Veri Çıkarma

CSS seçicileri, bir web sayfasındaki öğeleri bulmanın güçlü bir yolunu sunar. BeautifulSoup, veri çıkarmak için CSS seçicilerini kullanmanıza olanak tanır.

İşte bir örnek:

links = soup.select('a.external-link') for link in links: href = link['href'] text = link.text print(f"Link: {href}, Text: {text}")

Bu kodda, “external-link“ sınıfına sahip tüm etiketleri bulmak için select() yöntemini kullanıyoruz. Ardından seçilen öğeler üzerinde yineleme yapıp istenen öznitelikleri veya metni çıkarabiliriz.

Çıkarılan Verileri Dosyalara Kaydetme

İstenen verileri çıkardıktan sonra, daha ayrıntılı analiz veya işleme için bunları bir dosyaya kaydedebilirsiniz. Verileri bir CSV dosyasına kaydetmeye ilişkin bir örnek:

import csv data = [ ['Name', 'Age', 'City'], ['John', '25', 'New York'], ['Alice', '30', 'London'], ] with open('output.csv', 'w', newline='') as file: writer = csv.writer(file) writer.writerows(data)

Bu kodda, veri satırlarından oluşan bir liste tanımlıyor, “output.csv” adlı dosyayı yazma modunda açıyor, bir CSV yazıcı nesnesi oluşturuyor ve veri satırlarını dosyaya yazıyoruz.

Bunlar uygulamanız gereken temel tekniklerdir. İlerledikçe, dinamik web siteleri veya sayfalandırma gibi veri kazımanın zorlaştığı bazı durumlarla karşılaşacaksınız.

Endişelenmeyin, doğru teknikleri biliyor ve uygun araçlara sahipseniz (neredeyse) her siteden veri kazıyabilirsiniz.

Sayfalandırma ve Birden Fazla Sayfayı Yönetme

“Sayfalandırma” terimi, içeriklerini birden fazla sayfaya bölen siteleri ifade eder. Tüm sayfalardan veri kazımak istiyorsanız, sayfalandırma düzenini belirlemeniz gerekir. Böylece veri kazıma döngünüzü değiştirebilir ve sonuçları alabilirsiniz.

Aşağıdaki teknikleri inceleyin:

  1. URL'lerdeki sayfalandırma düzenlerini belirleme: Sayfa numarasını belirten kalıpları URL yapısında arayın. Örneğin, https://example.com/page/1, https://example.com/page/2 gibi URL'ler belirgin bir sayfalandırma düzenini izler.
  2. Veri kazıma döngüsünü değiştirme: Sayfa numaraları aralığında yineleme yapacak şekilde veri kazıma döngünüzü ayarlayın. Örneğin:
for page in range(1, 11): url = f"https://example.com/page/{page}" # Scrape data from each page

Bu kodda, 1'den 10'a kadar olan sayfa numaraları üzerinde yineleme yapıyor ve her sayfanın URL'sini dinamik olarak oluşturuyoruz.

3. “Sonraki” düğmesinin varlığını tespit etme: Bazı web siteleri, açık sayfa numaraları yerine “Sonraki” düğmesini kullanır. Böyle durumlarda, “Sonraki” düğmesinin var olup olmadığını kontrol edebilir ve düğme kaybolana kadar veri kazımaya devam edebilirsiniz.

Dinamik Web Siteleri ve JavaScript ile Oluşturulan İçeriklerle Başa Çıkma

Bir web kazıyıcı olarak, kullanıcı deneyimini iyileştirmek amacıyla son derece etkileşimli ve karmaşık web siteleriyle mutlaka karşılaşacaksınız. Bu tür siteler büyük ölçüde JavaScript'e dayanır ve genellikle dinamik içerikli web siteleri olarak adlandırılır.

Peki, bunun nesi önemli? Sorun şu ki bu sitelerde kaynak kod, aradığınız verileri içermeyebilir ve bu da kazıma işlemini zorlaştırır.

İşte bu noktada Selenium gibi araçları kullanmanız gerekir.

Selenium, web tarayıcılarını otomatikleştirmek için güçlü bir araçtır. Web sayfalarıyla etkileşim kurmanıza, formları doldurmanıza, düğmelere tıklamanıza ve dinamik olarak oluşturulan içeriklerden veri çıkarmanıza olanak tanır.

Selenium'u Kurma

Selenium'u zaten yüklediyseniz, sıradaki adım tercih ettiğiniz tarayıcı için bir web sürücüsü yüklemektir. Örneğin, Google Chrome için ChromeDriver.

İşte nasıl kullanılacağına dair bir örnek:

from selenium import webdriver driver = webdriver.Chrome() # Assumes ChromeDriver is installed and in PATH driver.get('https://example.com') # Perform actions and extract data title = driver.find_element_by_tag_name('h1').text driver.quit()

Bu kodda Chrome web sürücüsünün bir örneğini oluşturuyor, driver.get() kullanarak belirli bir URL'ye gidiyor ve ardından find_element_by_tag_name() gibi Selenium yöntemlerini kullanarak işlemler gerçekleştirip veri çıkarıyoruz.

Öğelerin Yüklenmesini Bekleme

Dinamik sitelerde içeriklerin yüklenmesi genellikle aynı anda gerçekleşmez. Bu nedenle bazı öğeler sayfa yüklendiğinde hemen kullanıma hazır olmayabilir. Selenium'un açık ve örtük bekleme özelliklerini kullanarak bu durumun üstesinden gelebilirsiniz.

from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10)<br>element = wait.until(EC.presence_of_element_located((By.ID, 'my-element-id')))

Bu kodda, zaman aşımı 10 saniye olan bir WebDriverWait nesnesi oluşturuyoruz. Ardından belirli bir ID'ye sahip bir öğenin varlığını beklemek için until() yöntemini kullanıyoruz.

Selenium Alternatifleri

Birçok kullanıcı dinamik siteler için kullanabileceğiniz en iyi aracın Selenium olduğuna inansa da, size en uygun olanı görmek için alternatifleri araştırmalısınız.

Scrapy-Splash bir seçenek olabilir. Bu, başsız bir tarayıcının Scrapy çatısıyla entegrasyonudur. Scrapy'nin engellemeyen ağ altyapısı ve Splash'ın dinamik web sayfalarını hızlıca oluşturmak için sunduğu gelişmiş özellikler sayesinde verileri daha verimli bir şekilde çıkarmanıza olanak tanır.

Requests-html de başka bir alternatiftir; JavaScript ile içerik oluşturma desteği ve web sayfalarıyla etkileşim özellikleri ekleyerek requests kütüphanesinin işlevselliğini genişletir.

Gelişmiş Web Kazıma Teknikleri

İlerleme kaydetmeye başladıkça bazı kazıma senaryolarını çözebildiğinizi, ancak daha gelişmiş teknikler gerektiren karmaşık senaryolarla da karşılaştığınızı göreceksiniz.

Kimlik Doğrulama ve Çerezleri Yönetme

Bazı web siteleri kimlik doğrulaması gerektirir veya kullanıcı oturumlarını yönetmek için çerezleri kullanır. İsteklerinizle giriş bilgilerinizi göndererek kimlik doğrulamasını gerçekleştirebilir ve çerezleri requests veya http.cookiejar gibi kütüphaneler kullanarak yönetebilirsiniz.

Tespit Edilmekten ve Engellenmekten Kaçınma

Web siteleri, web kazıma faaliyetlerini tespit etmek ve engellemek için çeşitli önlemler alabilir. Tespit edilmekten kaçınmak için kullanıcı aracılarını dönüşümlü kullanma, proxy kullanma ve istekler arasında rastgele gecikmeler ekleme gibi tekniklerden yararlanabilirsiniz.

Verileri Veritabanlarında Saklama

Kazınan verileri dosyalara kaydetmek yerine, daha verimli depolama ve erişim için veritabanlarında saklayabilirsiniz. Popüler seçenekler arasında MySQL ve PostgreSQL gibi SQL veritabanları ile MongoDB gibi NoSQL veritabanları bulunur.

API'leri Kazıma ve JSON Verilerini İşleme

Hey! API'yi buldunuz. Ama JSON biçiminde. Ne yapabilirsiniz? API istekleri göndermek için requests gibi kütüphaneleri kullanabilir ve JSON yanıtlarını Python'daki json modülüyle ayrıştırabilirsiniz.

Paralel ve Asenkron Kazıma

Kazıma sürecini hızlandırmak için paralel işleme ve asenkron programlama tekniklerinden yararlanabilirsiniz. Python'daki multiprocessing, threading ve asyncio gibi kütüphaneler bunu başarmanıza yardımcı olabilir.

Hepsini Bir Araya Getirmek: Gerçek Dünya Web Kazıma Projeleri

Acemi biri olarak, kazıma eğitimime başladığımda, yapmam gerekeni tamamen bildiğimi sanıyordum; ta ki gerçekten yapmam gerekene kadar. Sadece okuyup durmanın bir anlamı yok, pratik yaparak becerilerinizi sınamanız gerekir.

Peki bunu gerçek dünya projeleri üzerinde çalışmaktan daha iyi ne sağlayabilir?

Adım adım süreçleriyle birlikte bazı örneklere göz atalım:

Örnek 1: Haber Makalelerini Kazıma ve Duygu Analizi

  1. Kazıma sürecini planlama:
    • Kazınacak haber sitesini belirleyin
    • Makalelerin yapısını belirleyin (başlık, içerik, tarih vb.)
    • Verilerin depolanacağı biçimi planlayın (ör. CSV, veritabanı)
  2. Kazıyıcıyı uygulama:
    • Haber sitesinin HTML içeriğini almak için requests kullanın
    • Makale bilgilerini çıkarmak için HTML'yi BeautifulSoup kullanarak ayrıştırın
    • Sayfalandırmayı yönetin ve birden fazla sayfada gezinin
    • Kazınan verileri seçilen biçimde depolayın
  3. Kazınan verileri analiz etme ve görselleştirme:
    • Makale içeriğinde NLTK veya TextBlob gibi kütüphanelerle duygu analizi yapın
    • Duygu puanlarını Matplotlib veya Plotly gibi kütüphanelerle görselleştirin
    • Haberlerdeki duygu durumunda zaman içinde ortaya çıkan eğilimleri ve örüntüleri belirleyin

Örnek 2: Fiyat Takip Aracı Oluşturma

  1. E-ticaret sitelerinden ürün bilgilerini kazıma:
    • Kazınacak e-ticaret sitelerini belirleyin
    • Ürün bilgilerinin yapısını belirleyin (ad, fiyat, stok durumu vb.)
    • Birden fazla web sitesinden ürün verilerini çıkarmak için web kazıma tekniklerini kullanın
  2. Uyarı ve bildirimleri ayarlama:
    • Her ürün için fiyat eşiklerini veya stok durumu ölçütlerini tanımlayın
    • Kazınan fiyatları tanımlanan eşiklerle karşılaştıracak bir mekanizma uygulayın
    • Fiyatlar düştüğünde veya ürünler yeniden stoklara girdiğinde kullanıcıları uyarmak için e-posta ya da SMS bildirimleri ayarlayın
  3. Kazıyıcıyı buluta dağıtma:
    • Bir bulut platformu seçin (ör. AWS, Google Cloud, Heroku)
    • Gerekli ortamı ve bağımlılıkları yapılandırın
    • Kazıyıcının düzenli aralıklarla çalışmasını planlayın
    • Kolay erişim ve izleme için kazınan verileri bulut tabanlı bir veritabanında depolayın

Web Kazıma Çerçeveleri ve Araçları

“Çerçeve” ve “kütüphane” terimlerinin birbirinin yerine kullanıldığını biliyorum; ancak farklı anlamlara gelir ve farklı amaçlarla kullanılırlar.

Request veya BeautifulSoup gibi kütüphanelerle web kazıyıcıları sıfırdan oluşturabilirsiniz. Ancak çerçeveler, araç ve kütüphane koleksiyonları oldukları için süreci basitleştirebilir.

Şöyle düşünebilirsiniz: kütüphaneler, size tam kontrol sağlayan ancak kullanmak için daha fazla çaba ve beceri gerektiren manuel vitesli arabalar gibidir. Çerçeveler ise otomatik vitesli arabalar gibidir; kazımanın zahmetli yönlerinin çoğunu basitleştirerek daha akıcı ve verimli bir deneyim sunarlar.

En popüler seçeneklerden bazıları şunlardır:

Scrapy

Scrapy, ölçeklenebilir ve verimli web kazıyıcıları oluşturmak için eksiksiz bir ekosisteme sahip bir Python çerçevesidir. Öne çıkan özellikleri şunlardır:

  • Tasarımdan gelen yüksek hız.
  • CSV, JSON ve diğer dosyaları oluşturmak için kod eklemeniz gerekmez.
  • XPath ve CSS Seçicileri desteği.
  • Middleware desteği gibi kapsamlı bir eklenti ekosistemi.
  • Veri işleme ve depolama için öğe işlem hatlarıyla entegrasyon

PySpider

PySpider da bir Python çerçevesidir; ancak Scrapy'den farklı olarak JavaScript ile uyumludur ve en güçlü özelliği de budur. Yeni başlayanlar için de oldukça uygundur. Öne çıkan özellikleri şunlardır:

  • PhantomJS veya Puppeteer kullanarak JavaScript işleme desteği
  • Dahili görev kuyruğu ve zamanlayıcı
  • Veritabanları ve ileti kuyruğu sistemleriyle entegrasyon
  • Eşzamanlılığı destekler

Web Kazıma Araçları ve Hizmetleri

Çerçevelere ek olarak, kazımayı kolaylaştıran bazı araçlar ve hizmetler de vardır. En güzel yanı, çok az kodlama gerektirmeleridir. Bazı seçenekler şunlardır:

  • Octoparse: Web sitelerinden veri çıkarmak için tıklama tabanlı bir arayüze sahip bulut tabanlı bir web kazıma aracı.
  • ParseHub: Bir web sayfasındaki öğeleri görsel olarak seçerek web kazıyıcıları oluşturmanıza olanak tanıyan bir masaüstü uygulaması.
  • Import.io: Web sitelerinden ve API'lerden veri çıkarmaya yönelik araçlar sunan web tabanlı bir platform.

Web Kazımanın Temel Noktalarını Özetlemek

Bu rehberde; web sitesi yapısını anlama, etik hususlar, temel ve ileri düzey teknikler, ayrıca ek araçlar ve çerçeveler gibi web kazımanın temel noktalarını genel hatlarıyla ele aldık.

Başlamaya hazırsınız; ancak kütüphane ve çerçevelerin resmî belgeleri ile web kazıma eğitimleri gibi ek kaynakları okuyarak bilginizi genişletmeyi düşünebilirsiniz.

Ayrıca kazıma topluluklarında ve forumlarda deneyimli kazıyıcılardan rehberlik almaya çalışın. Kendinizi soyutlamayın; birbirimize ihtiyacımız var.

Hepimiz bir zamanlar acemiydik; bu yüzden kendinize karşı anlayışlı olun, küçük adımlarla başlayın ve düzenli olarak pratik yapın. Yeterince pratik ve özveriyle, ilerledikçe daha karmaşık projelerin üstesinden nasıl gelebileceğinizi göreceksiniz.