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 tag
ları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()