Lewati ke konten utama

Web Scraping dengan R dan PhantomJS

Tutorial singkat tentang web scraping data yang dihasilkan Javascript dengan R menggunakan PhantomJS.
· 5 mnt Baca

Jelajahi bersama AI

Ketika Anda perlu melakukan web scraping, Anda biasanya akan menggunakan paket rvest dari Hadley Wickham. Paket ini menyediakan solusi siap pakai yang mudah digunakan untuk mengambil kode html yang menghasilkan sebuah halaman web. Namun, ketika situs atau halaman web menggunakan JavaScript untuk menampilkan data yang Anda minati, paket rvest tidak memiliki fungsionalitas yang diperlukan. Salah satu solusinya adalah menggunakan PhantomJS.

(Ingin berlatih mengimpor lebih banyak data ke R? Coba tutorial ini.)

Muat Paket yang Diperlukan

Sebagai langkah pertama, Anda harus memuat semua paket yang kita perlukan untuk analisis ini ke dalam workspace (jika Anda belum memasang paket-paket ini di sistem lokal, gunakan install.packages() untuk membuatnya tersedia):

library(rvest)
library(stringr)
library(plyr)
library(dplyr)
library(ggvis)
library(knitr)
options(digits = 4)

Web Scraping Data yang Dihasilkan Javascript dengan R

Langkah berikutnya adalah mengumpulkan data TechStars menggunakan PhantomJS. Lihat berkas .js dasar berikut:

// 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();
});

Skrip ini pada dasarnya merender halaman HTML setelah kode javascript di baliknya selesai bekerja, memungkinkan Anda mengambil halaman HTML, lengkap dengan semua tabel di dalamnya. Agar tetap berada di R untuk sisa analisis ini, kami sarankan Anda menggunakan fungsi system() untuk memanggil PhantomJS (Anda harus mengunduh dan memasang PhantomJS dan meletakkannya di working directory Anda):

# Biarkan phantomJS melakukan scraping techstars, keluaran ditulis ke techstars.html
system("./phantomjs scrape_techstars.js")

Setelah penyimpangan kecil ini, akhirnya Anda memiliki sebuah berkas HTML, techstars.html, di sistem lokal kami, yang dapat di-scrape dengan rvest. Pemeriksaan halaman web Techstars menunjukkan bahwa tabel yang kita minati berada di dalam div dengan kelas css batch:

batches <- html("techstars.html") %>%
  html_nodes(".batch")

class(batches)
[1] "XMLNodeSet"

Sekarang Anda memiliki daftar objek XMLNodeSet: setiap objek berisi data untuk satu batch TechStars. Di dalamnya, kita dapat menemukan informasi mengenai lokasi batch, tahun, musim, serta tentang perusahaan, kantor pusat saat ini, status saat ini, dan total pendanaan yang mereka raih. Kami tidak akan masuk ke detail langkah-langkah pengumpulan dan pembersihan data di bawah; Anda dapat mengeksekusi kodenya sendiri dan meninjau apa yang dicapai. Anda akan melihat ada pembersihan kustom untuk memastikan setiap potongan informasi diformat dengan rapi:

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})")
# location info is everything in the batch title that is not year info or season info
batch_location <- sub("\\s+$", "",
                      sub("([[:digit:]]{4})", "",
                          sub("(Fall|Spring|Winter|Summer)","",batch_titles)))

# create data frame with batch info.
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)
})

# Add batch info to breakdown
batch_info_extended <- batch_info[rep(seq_len(nrow(batch_info)),
                                  sapply(breakdown, nrow)),]
breakdown_merged <- rbind.fill(breakdown)

# Merge all information
techstars <- tbl_df(cbind(breakdown_merged, batch_info_extended)) %>%
  mutate(funding = as.numeric(gsub(",","",gsub("\\$","",funding))))

Dengan kombinasi fungsi R inti, rvest, plyr, dan dplyr, kini kita memiliki data frame techstars; sebuah set data semua perusahaan TechStars, dengan semua informasi yang tersedia untuk umum dan telah diformat dengan rapi:

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"

Kesimpulan

Menggunakan kombinasi alat dan kode di atas, kita berhasil melakukan scraping data dari situs web yang menggunakan JavaScript untuk menghasilkan datanya. Seperti yang dapat dilihat, ini adalah proses yang sangat terstruktur dan dapat dilakukan dengan mudah setelah kode awal tersedia. Ingin belajar R, dan mencari tutorial serta kursus data science dan R? Lihat DataCamp

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026