Kurs
Web kazıma yapmanız gerektiğinde, normalde Hadley Wickham’ın rvest paketinden yararlanırsınız. Bu paket, bir web sayfasını oluşturan html kodunu almak için kullanıma hazır, kolay bir çözüm sunar. Ancak, ilginizi çeken verileri görüntülemek için web sitesi veya web sayfası JavaScript kullanıyorsa, rvest paketi gerekli işlevselliği sunmaz. Çözümlerden biri PhantomJS kullanmaktır.
(R’a daha fazla veri aktarma alıştırması yapmak ister misiniz? bu öğreticiyi deneyin.)
Gerekli Paketleri Yükleyin
İlk adım olarak, bu analiz için ihtiyaç duyduğumuz tüm paketleri çalışma alanına yüklemeniz gerekir (bu paketleri yerel sisteminize henüz kurmadıysanız, kullanılabilir hale getirmek için install.packages() kullanın):
library(rvest)
library(stringr)
library(plyr)
library(dplyr)
library(ggvis)
library(knitr)
options(digits = 4)
R ile Javascript Tarafından Üretilen Verileri Kazıma
Sıradaki adım, PhantomJS kullanarak TechStars verilerinin toplanmasıdır. Aşağıdaki temel .js dosyasına göz atın:
// scrape_techstars.js
var webPage = require('webpage');
var page = webPage.create();
var fs = require('fs');
var path = 'techstars.html'
page.open('http://www.techstars.com/companies/stats/', function (status) {
var content = page.content;
fs.write(path,content,'w')
phantom.exit();
});
Betik, temel olarak, alttaki javascript kodu işini bitirdikten sonra HTML sayfasını oluşturur; böylece içindeki tüm tablolarla birlikte HTML sayfasını almanıza olanak tanır. Analizin geri kalanında R içinde kalmak için, PhantomJS’i çağırmak üzere system() fonksiyonunu kullanmanızı öneririz (PhantomJS’i indirip kurmanız ve çalışma dizininize koymanız gerekir):
# phantomJS'in techstars'ı kazımasına izin verin, çıktı techstars.html dosyasına yazılır
system("./phantomjs scrape_techstars.js")
Bu küçük dolambaçtan sonra, sonunda yerel sistemimizde techstars.html adlı ve rvest ile kazınabilecek bir HTML dosyanız var. Techstars web sayfasının incelenmesi, ilgilendiğimiz tabloların batch css sınıfına sahip div’ler içinde yer aldığını gösterir:
batches <- html("techstars.html") %>%
html_nodes(".batch")
class(batches)
[1] "XMLNodeSet"
Artık elinizde XMLNodeSet nesnelerinden oluşan bir liste var: her nesne tek bir TechStars grubuna ait verileri içeriyor. İçinde grup konumu, yıl, mevsim ile şirketler, mevcut merkezleri, mevcut durumları ve topladıkları toplam yatırım miktarı gibi bilgiler bulunur. Aşağıdaki veri toplama ve temizleme adımlarının ayrıntılarına girmeyeceğiz; kodu kendiniz çalıştırabilir ve neler yaptığını inceleyebilirsiniz. Her bir bilginin düzgün biçimlendirildiğinden emin olmak için bazı özel temizlik işlemlerinin yapıldığını göreceksiniz:
batch_titles <- batches %>%
html_nodes(".batch_class") %>%
html_text()
batch_season <- str_extract(batch_titles, "(Fall|Spring|Winter|Summer)")
batch_year <- str_extract(batch_titles, "([[:digit:]]{4})")
# konum bilgisi, grup başlığındaki yıl veya mevsim dışındaki her şeydir
batch_location <- sub("\\s+$", "",
sub("([[:digit:]]{4})", "",
sub("(Fall|Spring|Winter|Summer)","",batch_titles)))
# grup bilgileriyle bir veri çerçevesi oluşturun.
batch_info <- data.frame(location = batch_location,
year = batch_year,
season = batch_season)
breakdown <- lapply(batches, function(x) {
company_info <- x %>% html_nodes(".parent")
companies_single_batch <- lapply(company_info, function(y){
as.list(gsub("\\[\\+\\]\\[\\-\\]\\s", "", y %>%
html_nodes("td") %>%
html_text()))
})
df <- data.frame(matrix(unlist(companies_single_batch),
nrow=length(companies_single_batch),
byrow=T,
dimnames = list(NULL, c("company","funding","status","hq"))))
return(df)
})
# Grup bilgilerini döküm verisine ekleyin
batch_info_extended <- batch_info[rep(seq_len(nrow(batch_info)),
sapply(breakdown, nrow)),]
breakdown_merged <- rbind.fill(breakdown)
# Tüm bilgileri birleştirin
techstars <- tbl_df(cbind(breakdown_merged, batch_info_extended)) %>%
mutate(funding = as.numeric(gsub(",","",gsub("\\$","",funding))))
Çekirdek R, rvest, plyr ve dplyr işlevlerinin bir kombinasyonuyla artık elimizde techstars veri çerçevesi var; tüm TechStars şirketlerine ait, kamuya açık bilgilerin düzgün biçimlendirildiği bir veri seti:
techstars
## Source: local data frame [535 x 7]
##
## company funding status hq location year season
## 1 Accountable 110000 Active Fort Worth, TX Austin 2013 Fall
## 2 Atlas 1180000 Active Austin, TX Austin 2013 Fall
## 3 Embrace 110000 Failed Austin, TX Austin 2013 Fall
## 4 Filament Labs 1490000 Active Austin, TX Austin 2013 Fall
## 5 Fosbury 300000 Active Austin, TX Austin 2013 Fall
## 6 Gone! 840000 Active San Francisco, CA Austin 2013 Fall
## 7 MarketVibe 110000 Acquired Austin, TX Austin 2013 Fall
## 8 Plum 1630000 Active Austin, TX Austin 2013 Fall
## 9 ProtoExchange 110000 Active Austin, TX Austin 2013 Fall
## 10 Testlio 1020000 Active Austin, TX Austin 2013 Fall
## .. ... ... ... ... ... ... ...
names(techstars)
## [1] "company" "funding" "status" "hq" "location" "year"
## [7] "season"
Sonuç
Yukarıdaki araç ve kod kombinasyonunu kullanarak, verilerini üretmek için bir JavaScript betiği kullanan bir web sitesinden veri kazımayı başardık. Görüldüğü gibi bu, başlangıç kodu hazır olduğunda kolayca yapılabilecek, oldukça yapılandırılmış bir süreçtir. R öğrenmek ve veri bilimi ile R üzerine öğretici ve kurslar mı arıyorsunuz? DataCamp’e göz atın
