Canım “Web Scraping” ❤

Cansu Altunbas
Kodcular
Published in
3 min readDec 7, 2020

Herkese selamlar!

Yakın zamanda bir makale için yaptığım analizden gaza gelip R ile nasıl web scraping yaptığımı paylaşmak istedim. Umarım kullanacak olanlara yardımcı olur. Hadi başlayalım!

Bir saniye başlamadan;

Web scraping nedir? Web scraping ya da web kazıma web üzerinde bulunan verilerin yapılandırılmış şekilde elde edilme sürecini ifade etmekte (Atan,2018). Özellikle metin madenciliği için vazgeçilmez bir teknik.

İlk olarak web kazıma yapacağımız internet sitesine karar veriyoruz. Sürecin illegal olduğunu düşündüğümden sitenin adresini vermeyeceğim tabi ki. Yanlış düşünüyor olabilirim🤭 kimilerine site tanıdık gelebilir çaktırmayın 😎

Örneğimde bu haber alanındaki başlıkları çekeceğim. Bunun için R kullanacağım. Çünkü R çok seviyorum çünkü veri analizi için bana daha kolay, anlaşılır geliyor çünkü R kullanırken çıldırmak bile eğlenceli.

Web scraping için bizim ihtiyacımız olan iki kütüphanesi var. Bunları indirmemiz gerekiyor. Bunlar;

install.packages(“rvest”)

library(rvest)

install.packages(“stringr”)

library(stringr)

Kütüphaneleri indirip ekledikten sonra internet sitesini okumamız gerekiyor bunun için bulunduğunuz sayfanın web adresinin tamamını kopyalamanız gerekiyor. Ardından;

url_all<-’https://**/**/**'

html_all<-read_html(url_all)

url_all web sitesinin adresini tutuyor ve bu adresi read_html fonksiyonu sayesinde html olarak okuyoruz ve html_all değişkenine atıyoruz.

Benim kullandığım internet sitesinde sayfalama mevcut ve birden fazla sayfadaki haber başlıklarını elde etmek istiyorum.

Sayfalama

Burada dikkat etmemiz gereken bir şey var. Örneğin 2.sayfaya geçtiğimde web sitesinin adres kısmı nasıl değişiyor?

Haber başlıklarını aldığım sitenin adresi şu şekilde değişiyordu.

’https://**/**/**/2'

Yani sayfa her değiştiğinde ana url sonuna “/” ardından sayfa numarası ekleniyor.

İlgili tüm url’lerin listesini çekmek için bir liste yapmam gerekiyor.

list_of_pages_all<-str_c(url_all,’/’,seq(1,5,1))

Burada seq(1,5,1) neyi ifade ediyor? Şöyle ki 1.sayfadan 5.sayfaya kadar sayfa numaralarını 1'er arttırarak listeyi hazırla. Bunun sonunda nasıl birşey elde edeceğiz dediğinizi duyar gibiyim.

https://**/**/**/1 https://**/**/**/2 https://**/**/**/3 https://**/**/**/4 https://**/**/**/5

Tatataamm ! Böylece url listemizi hazırladık. Asıl geldik işin cafcaflı kısmına oley! 🥳

Seçtiğimiz başlık kısmının html kodunu “Xpath” olarak kopyalıyoruz.

//*[@id=”leftColumn”]/div[4]/article[5]/div[1]/a

şeklinde bir kod parçası geliyor. Burada dikkat edilmesi gereken article[5]/div[1] kısmının farklı haber başlıklarında farklı değerler alması. Bu durum haberlerin sayfaya yerleştirilmesinden kaynaklı bir durum. Sayfada bu html koduna sahip tüm haber başlıklarını çekmek istediğim için aşağıdaki gibi bir düzenleme yapıyorum.

get_tables_all<-function(html_df){

as.data.frame(read_html(html_df)%>%

html_nodes(xpath= ‘//*[@id=”leftColumn”]/div[4]/article/div/a’) %>%

xml_attr(“title”))

}

Dikkat edilmesi gereken başka bir durum ise “xml_attr(“title”)”. <a> etiketi ile belirtilen bir html etiketidir ve içerisine “title” olarak adlandırılan ve imleç link üzerine getirildiğinde belirtilen açıklamanın çıkmasını sağlayan bir özellik eklemek mümkündür. Kullandığım internet sitesinde böyle bir özellik olduğu için “xml_attr(“title”)” kullandım. Bu demek oluyor ki ilgili html kodundaki “title” bilgisini al.

data_all<-list_of_pages_all %>%

map(get_tables_all) %>%

bind_rows()

Her şey hazır. Artık verileri çekmenin zamanı geldi. “map” yerine “for” döngüsü de kullanılabilir. Yukarıdaki kodu çalıştırdığımızda “data_all” isimli değişkende haber başlıklarının yer aldığını göreceğiz.🥳

Bu verilerden sonra dilerseniz cümleleri kelimelere ayırın frekans analizi yapın dilerseniz duygu analizi yapın artık size kalmış 🤭.

Sevgiyle😌

KAYNAKÇA

  1. Atan, S. (2018).Haberlerin Kurumsal İmaja Etkisi ve Türkiye’deki Hastaneler Hakkında Medyada Yer Alan Haberlerin Metin Madenciliği ile Analizi. İletişim Kuram ve Araştırma Dergisi, 46, 222–240.

--

--