rvest: R ile Web Sayfalarından Kolay Veri Çekimi

Web kazıma veya bilinen adıyla Web Scraping, çeşitli yazılım ve metotlar ile web sitelerinden içerik kopyalama veya belli bilgileri alma işlemini sağlayan yöntemlere denir. Bu yöntemlerle, web üzerinde yer alan sitelerden veri içe aktarımını, kopyala yapıştır yaparken yaşanacak tüm sorunlar ortadan kaldırılarak sağlayabilirsiniz. Ayrıca, hızlı şekilde onlarca sayfadaki içeriği tek bir kodla otomatik olarak içeri aktarabilirsiniz. Bu yazıda, webden doğrudan R ortamına veri çekimini sağlayacak bir paket olan rvest‘ten bahsedeceğiz.

Kurulum

Kurulum yapmak için aşağıdaki komutları R ortamına girerek, paketin kurulumunu ve yüklenmesini sağlıyoruz.

> install.packages("rvest")
> library("rvest")
Uygulama #1

Öncelikle, üzerinden veri çekeceğimiz web sitesinin kaynak kodunu R ortamına kaydederek başlıyoruz. Burada örnek olarak “Contact” adlı filmin verilerini IMDB’den çekmeye çalışacağız. Bu amaçla öncelikle read_html fonksiyonunu kullanacağız. Bu fonksiyon, bir web sitesinin (.html) kaynak verilerini veya .xml uzantılı dosyasının kaynağını R ortamına aktarılmasını sağlar.

> contact_movie <- read_html("http://www.imdb.com/title/tt0118884/")

Bir sonraki basamakta, web sayfasındaki hangi veriyi çekeceğimizi belirtmemiz gerekiyor. Bunun için kaynak dosya içinde R’ın nereye bakması gerektiğini söylememiz gerek.

İçeri aktardığımız kaynak kod içinde onlarca farklı veri, onlarca farklı adresler içinde bulunur. En basit haliyle bu adreslere node adı verilir. İlgilendiğimiz verinin hangi node içinde bulunduğunu kaynak kod içinde arayarak bulabiliriz. Ama bu işi daha kolaylaştıran programlar da mevcut. Node’lar içinde hangisinin bizim aradığımız veriyi içerdiğini bulmak için Selector Gadget adlı bir Chrome eklentisinden faydalanabiliriz. Kurulumunu da bu adresten yapabilirsiniz.

Selector Gadget ile ilgilendiğimiz verinin node adresini görebiliyoruz. Eklenti butonuna bastıktan sonra fare imleciniz ile çekilmesini istediğiniz veriyi içeren en küçük kutuya tıklıyorsunuz. Alttaki adres satırı ve kutunun yanındaki konum, değerin adresini gösteriyor. Bu örnekte adresiminiz “strong span” olduğunu görüyoruz.

Bundan sonraki basamakta, bulduğumuz adresi R’a belirtip, o konumdaki veriyi çekmesini sağlayacağız. Bu amaçla, önce  html_node fonksiyonunu kullanacağız. Bu fonksiyon, bir html veya xml dosyası içindeki belli bir adresi tamamen çekmemizi sağlar. Bu adresin “strong span” olduğunu az önce öğrendik.

> contact_node  <- html_nodes(contact_movie, "strong span")

Bu fonksiyonun çıktısını incelersek, verdiğimiz adresteki node yapısını görürüz.

> contact_node

{xml_nodeset (1)}
[1] <span itemprop="ratingValue">7.4</span>

Artık elimizde IMDB skoru var. Ama veri içinde span etiketi de var. Bu node yapısının içinden sadece ilgilendiğimiz değeri çekmek için de html_text fonksiyonunu kullanabiliriz.

> contact_score <- html_text(contact_node)

Bu fonksiyonun çıktısı bize, doğrudan ilgili node içindeki değer ne ise (bizim örneğimizde IMDB skorunu) onu verecektir.

> contact_score

[1] "7.4"
Uygulama #2

Şimdi de başka bir uygulama deneyelim. Bu sefer bir ekşi sözlük başlığındaki entry’lerin giriş tüm tarihlerini çekelim. Benzer şekilde web sayfasını önce R ortamına indiriyoruz. Bunun için ekşi sözlükteki r başlığını kullanacağız.

Bunun için daha önce yaptığımız gibi Selector Gadget uygulaması ile entry’lerin tarihlerini belirten en küçük kutucuğa tıklıyoruz.

Bu şekilde tarih bilgisinin .permalink adresinde yer aldığını öğreniyoruz. Herhangi bir tarih seçtiğimizde, diğer tüm entry’lerdeki tarihlerin de sarı renk ile işaretlendiğini göreceksiniz. Sarı ile işaretli kutular aynı adresteki (.permalink adresli) diğer verileri göstermektedir. Biz tüm verileri çekmek istediğimiz için bu .permalink adresi kullanacağız.

Benzer şekilde sayfadaki kullanıcıların takma adlarının adresini öğrenmek isteseydik, onun adresinin de .entry-author olduğunu görecektik. Siz de deneyebilirsiniz.

Daha önce uyguladığımız fonksiyonları aynı şekilde kullanıyoruz. Tek fark, bu sefer birden fazla veri çekeceğimiz için html_node yerine html_nodes fonksiyonunu kullanıyoruz.

> eksi_entry <- read_html("http://www.imdb.com/title/tt0118884/")
> eksi_node  <- html_nodes(eksi_entry, ".permalink")
> eksi_time  <- html_text(eksi_node)

Yukarıdaki işlemlerden sonra verinin çıktısına baktığımızda, ilgili sayfadaki tüm zaman kayıtlarını dökümünü alıyoruz.

> eksi_time

 [1] "25.01.2017 02:58 ~ 05:04" "18.09.2004 23:06" "17.01.2008 12:30 ~ 18.01.2008 16:30"
 [4] "08.03.2014 13:41 ~ 13:45" "23.10.2013 01:17 ~ 21.12.2013 02:04" "28.10.2010 12:40 ~ 13.07.2013 01:59"
 [7] "06.03.2002 16:34 ~ 16.02.2007 03:12" "07.02.2017 20:25" "04.12.2012 03:15" 
[10] "11.03.2013 11:29"

Bu yöntemle yapılabileceklerin gerçekten sınırı yok. Bir haber sitesindeki özetlerdeki kelimelerin kullanım sıklığını hesaplamaktan, spor bahis sitesindeki oranlara yönelik analiz yapmaya kadar web üzerinde ne kadar veri varsa indirip analiz edebilirsiniz.

Moleküler Biyolog ve Genetikçi.İstanbul Teknik Üniversitesi'nde doktora öğrencisi. 5 yıldır biyoinformatik ve yeni nesil dizileme üzerine çalışıyor. Genetik ve biyoinformatik üzerine Variant adlı blogda yazıyor.

Yorum bırakın:

Your email address will not be published.

Site Footer

Sliding Sidebar

Hakkımda

Hakkımda

Moleküler Biyolog ve Genetikçi. İstanbul Teknik Üniversitesi'nde doktora öğrencisi. 5 yıldır biyoinformatik ve yeni nesil dizileme üzerine çalışıyor.

Tweets

Message: Invalid or expired token., Please check your Twitter Authentication Data or internet connection.