İçeriğe geç
Home » Blog » R ile Statik Web Kazıma: rvest & data.table

R ile Statik Web Kazıma: rvest & data.table

Giriş

Bu eğitimde, R programlama dilindervest ve data.table paketlerini kullanarak statik web sayfalarından veri kazımayı (web scraping) örneklendireceğiz. Eğer henüz okumadıysanız web kazımada dikkat edilmesi gerekenler yazımıza da mutlaka göz atın. İlgili yazıda dinamik ve statik web kazımanın farklılıklarına ilişkin daha fazla bilgi bulabilirsiniz.

Bu çalışmarı takip edebilmek için bilgisayarınızda R ve RStudio kurulu olmalıdır. R’ı indirmek için CRAN‘ı ziyaret edebilirsiniz. RStudio ise R için özel olarak tasarlanmış bir IDE’dir. Tabii ki diğer IDE’leri de kullanabilirsiniz ancak benim R için tercihim her zaman RStudio’dur.

Ayrıca temel R/python programlama bilginizin olması bu çalışmayı takip ederken çok yardımcı olacaktır. Henüz hiç kodlama yapmadıysanız endişelenmeyin. Buradaki ücretsiz eğitimleri takip ederek hızlıca bilgi edinebilirsiniz. Unutmayın en uzun yolculuklar o ilk adımla başlar!

1. Gerekli Paketlerin Yüklenmesi

R’da statik web kazıma için benim tercihim her zaman rvest olmuştur. rvest kullanarak zincirleme biçimde css/html filtreleri ekleyebileceğiniz bir araç olarak öne çıkıyor. Ben indirilen verileri data.table kullanarak işleyeceğim ancak siz dplyr da kullanabilirsiniz.

# Gerekli paketlerin CRAN'dan indirilmesi ve yüklenmesi
install.packages("rvest") # Web kazıma için
install.packages("data.table") # Veri işleme için
install.packages("dplyr") # Veri manipülasyonu için (opsiyonel)

# Paketlerin çalışma ortamına çağırılması
library(rvest)
library(data.table)
library(dplyr)

2. Temel Web Kazıma Adımları

2.1. Web Sayfasını Okuma

Burada example.com yerine veri toplamak istediğiniz web sitesinin URL adresini yazmalısınız. Daha sonra read_html fonksiyonunu kullanarak statik olarak barındırılan sayfayı okuyabilirsiniz. Unutmayın bu fonksiyon dinamik olara yüklenen web sayfalarında çalışmayacaktır. Bu tür dinamik web sitelerini toplamak için Selenium veya Puppeteer gibi daha gelişmiş araçları kullanmanız gereklidir.

# Örnek bir URL
url <- "https://example.com"

# Web sayfasını okuma
web_page <- read_html(url)

2.2. HTML Elementlerini Seçme

%>% operatörünü kullanarak zincirleme biçimde html taglarını, css değerlerini veya doğrudan xpath kullanarak filtreleme yapabilirsiniz. Daha sonra html_text veya html_table gibi fonksiyonlarla ulaşmak istediğiniz elementleri seçebilirsiniz. Ancak her web sitesinde içerikler farklı biçimlerde tutulduğu için mutlaka web tarayıcınızda toplamak istediğiniz sayfayı denetle/incele seçeneğiyle inceleyin!

# CSS seçicileri kullanarak elementleri seçme
titles <- web_page %>% 
  html_nodes("h2.title") %>%  # CSS seçici
  html_text()  # Metni çıkarma

links <- web_page %>% 
  html_nodes("a") %>% 
  html_attr("href")  # href attribute'unu çıkarma

2.3. Tablo Verisi Çekme

# HTML tablosunu çekme
table_data <- web_page %>% 
  html_nodes("table") %>% 
  html_table() %>% 
  .[[1]]  # İlk tabloyu seçme

# data.table'a dönüştürme
dt_table <- as.data.table(table_data)

3. Veriyi Temizleme ve Düzenleme

Veriyi düzenlemek ve temizlemek büyük veri çalışmalarının en zorlu ve en zahmetli kısmıdır. Aşağıda çok basit bir darih ve fiyat dönüşüm kodu bulunmaktadır. Ancak her çalışma, her web sitesi, her web sayfası veri temizleme sürecinde çarpan etkisi yaratır, yani bu parametreler ne kadar fazlaysa veri temizliğine ayırmanız gereken süre de o kadar fazla olmalıdır!

# Örnek veri temizleme
clean_data <- dt_table %>%
  mutate(
    Price = gsub("\\$", "", Price) %>% as.numeric(),
    Date = as.Date(Date, format = "%Y-%m-%d")
  ) %>%
  filter(!is.na(Price))

4. Birden Çok Sayfadan Veri Kazıma

Bir sayfadan veri topladıktan sonra artık benzer sayfalardan benzer içerikleri çekmek için algoritmalar yazmanız lazım. Burada da for veya while döngülerini kullanmanız gerekmektedir. Örneğin bir internet gazetesinin gündem kategorisi altındaki 100 sayfada bulunan 3000 sayfa haberi tek tek toplayamazsınız, bunu otomatize etmeniz gereklidir. Unutmamanız gereken en önemli nokta veri topladığınız platforma saygı duymalı ve döngünün her bir adımlamasında belirli bir süre beklemelisiniz. R’da bunu Sys.sleep fonksiyonuyla yapabilirsiniz.

# Çoklu sayfa kazıma örneği
all_data <- data.table()

for (page in 1:5) {  # İlk 5 sayfa
  page_url <- paste0("https://example.com/products?page=", page)
  page_data <- read_html(page_url) %>%
    html_nodes(".product") %>%
    html_text() %>%
    as.data.table()
  
  all_data <- rbind(all_data, page_data)
  
  # Sayfalar arasında bekleme (etik kurallar)
  Sys.sleep(2)
}

5. Veriyi Kaydetme

CSV‘ye veri kaydetme ve okuma oldukça hızlıdır. Özellikle data.table’ın fwrite ve fread fonksiyonları milyonlar ve hatta milyarlarca satır veriyle çalışırken oldukça kullanışlı olabilir. Buna karşın seri veri formatı olan RDS ise çok daha az yer kaplamarken okuma/yazma hızı CSV’ye göre oldukça düşüktür. İhtiyaçlarınıza göre bir tanesini seçerek kullanabilirsiniz.

# CSV olarak kaydetme
fwrite(all_data, "scraped_data.csv")

# RDS olarak kaydetme
saveRDS(all_data, "scraped_data.rds")

Örnek

Vikipedi üzerinden çekilecek bir sayfayla her şeyi bir araya getirmeye çalışalım:


library(rvest)
library(data.table)


# Örnek bir URL
url <- "https://tr.wikipedia.org/wiki/Portakal"

# Web sayfasını okuma
web_page <- read_html(url)


# CSS seçicileri kullanarak elementleri seçme
titles <- web_page %>% 
  html_nodes("h2") %>%  # CSS seçici
  html_text()  # Metni çıkarma

links <- web_page %>% 
  html_nodes("a") %>% 
  html_attr("href")  # href attribute'unu çıkarma


# HTML tablosunu çekme
table_data <- web_page %>% 
  html_nodes("table.wikitable") %>% html_table()

# data.table'a dönüştürme
dt_table <- as.data.table(table_data)


# Örnek veri temizleme
text_data <- web_page %>% html_nodes(xpath='/html/body/div[2]/div/div[3]/main/div[3]/div[3]/div[1]/ul') %>% html_text()





LANGUAGES »