Web Scraping dengan R

RB Fajriya Hakim
5 min readSep 25, 2019

--

Contoh Sederhana Mengambil Data dari Web dengan “rvest”

Assalamuálaikum teman-teman yang suka data…

Kali ini kita akan mencoba mengambil data dari IMDb (Internet Movie Database, https://www.imdb.com ) yang disusun berdasar popularitas film di tahun 2018 dan kemudian menyajikan hasil analisis dalam bentuk tabel,

jika kita ingin melihat daftar popularitas film-film pada tahun 2018, bisa dilihat melalui tautan ini

kemudian kita ingin melihat data antara gross (pendapatan kotor) dengan runtime dan genrenya.

Siapkan terlebih dahulu R nya serta install package yang diperlukan

> install.packages("xml2")
> library(xml2)
> install.packages("rvest")
> library(rvest)

nampak seperti berikut,

dan instalasi package “rvest”

kemudian kita lihat alamat dari halaman website yang kita inginkan di IMDb,

masukkan dalam R seperti berikut,

> alamatweb <- '  https://www.imdb.com/search/title/?count=100&release_date=2018,2018&title_type=feature'> lamanweb <- read_html(alamatweb)
> lamanweb

nampak hasilnya seperti berikut,

kemudian kita ingin mengambil data Runtime film yang ada dalam halaman web,

maka untuk mengetahui posisi dimana letak runtime dalam halaman html maka kita perlu menggunakan aplikasi “SelectorGadget” yang bisa langsung di download dan ditempelkan dalam Chrome,

kemudian tinggal ditambahkan dalam chrome, sehingga terlihat ikon kecil kanan atas pada halaman chrome bahwa “SelectorGadget” telah terpasang,

kemudian klik ikon tersebut sehingga muncul jendela kecil satu baris yang berisi letak bagian yang akan kita incar.

sehingga, perintah dalam R yang kita jalankan adalah seperti berikut,

> runtime_data_laman <- html_nodes(lamanweb,'.runtime')
> runtime_data_laman
> runtime_data <- html_text(runtime_data_laman)
> head(runtime_data)

nampak seperti berikut,

kemudian, kita bersihkan terlebih dahulu data tersebut, dan kemudian membuatnya menjadi bertipe numerik

> runtime_data <- gsub(" min","",runtime_data)
> runtime_data
> runtime_data<-as.numeric(runtime_data)
> runtime_data

nampak seperti berikut,

dari halaman website tersebut kita telah berhasil mendapatkan data runtime untuk 100 film popular. Jadi kurang lebih langkah-langkah tersebut yang akan kita gunakan untuk mengambil data-data berikutnya dari halaman website tersebut

> genre_data_laman <- html_nodes(lamanweb,'.genre')
> genre_data_laman
# kita ambil data text genre
> genre_data <- html_text(genre_data_laman)
# kemudian kita lihat data tersebut
> genre_data
# karena masih banyak memuat tanda "\n" maka kita hilangkan terlebih # dahulu> genre_data<-gsub("\n","",genre_data)# kita hilangkan juga spasi kosong
> genre_data<-gsub(" ","",genre_data)
# karena satu film bisa beberapa genre, maka setiap film hanya
# dikategorikan pada deskripsi genre yang pertama saja
> genre_data<-gsub(",.*","",genre_data)
> genre_data# mengkonversi data genre berupa text menjadi faktor
> genre_data<-as.factor(genre_data)
# kita lihat lagi hasilnya,
> head(genre_data)

seperti berikut,

kemudian,

berikutnya,

berikutnya,

terlihat,

sehingga data genre sudah kita dapatkan,

Berikutnya untuk data rating seperti berikut,

> rating_data_laman <- html_nodes(lamanweb,'.ratings-imdb-rating strong')
> rating_data_laman
# mengambil data text rating
> rating_data <- html_text(rating_data_laman)
> rating_data
# dikonversi dalam numerik
> rating_data<-as.numeric(rating_data)
> rating_data

nampak seperti berikut,

berikutnya,

kemudian,

kemudian akan diambil data gross dari film-film popular tersebut,

> gross_data_laman <- html_nodes(lamanweb,'.ghost~ .text-muted+ span')> gross_data <- html_text(gross_data_laman)
> gross_data
# menghilangkan huruf M dan $
> gross_data<-gsub("M","",gross_data)
> gross_data<-substring(gross_data,2,6)
> gross_data# cek jumlah data gross_data, karena tidak semua film memuat gross
# data
> length(gross_data)

nampak seperti berikut,

kemudian,

kemudian,

ternyata hanya 81 film yang memuat nilai gross pendapatannya,

kita coba kembali ke halaman web nya dan memeriksa nomer berapa sajakah yang tidak ada nilai gross nya (perlu diingat bahwa popularitas film bergerak terus, sehingga bisa jadi urutan film ketika materi ini dibuat akan berbeda dengan ketika anda mencoba saat ini)

kemudian nilai-nilai yang kosong itu di rekap secara manual dan diganti dengan nilai “NA” dengan menggunakan perintah berikut,

> # Missing data diganti dengan nilai NA
> for (i in c(2,9,12,25,29,31,47,48,50,56,57,62,70,75,80,86,87,93,94)){

a<-gross_data[1:(i-1)]

b<-gross_data[i:length(gross_data)]

gross_data<-append(a,list("NA"))

gross_data<-append(gross_data,b)

}
>

seperti berikut,

kemudian dijalankan perintah berikut,

> # data gross dikonversi menjadi numerik
> gross_data<-as.numeric(gross_data)
> length(gross_data)
> summary(gross_data)

nampak hasilnya seperti berikut,

kemudian, data kita kumpulkan sebagai data frame

> kumpulan_data_film <-data.frame(Runtime = runtime_data,
Genre = genre_data, Rating = rating_data,
Gross_Pendapatan = gross_data)
> str(kumpulan_data_film)

hasilnya,

kemudian akan kita buat beberapa visualisasi yang penting,

> library('ggplot2')> qplot(data = kumpulan_data_film,Runtime,fill = Genre,bins = 30)

nampak hasilnya adalah seperti berikut,

dan visualisasi data berikutnya adalah,

> ggplot(kumpulan_data_film,aes(x=Runtime,y=Gross_Pendapatan))+
geom_point(aes(size=Rating,col=Genre))

hasilnya adalah seperti berikut,

sehingga nampak bahwa film dengan Genre Action mendapatkan Gross tinggi dan Rating yang tinggi, sementara film dengan Genre drama kebanyakan mendapatkan Gross rendah. Visualisasi data yang lain masih dapat ditampilkan.

Sekian dulu materi kali ini, semoga bermanfaat

Referensi Utama:

  1. “Beginner’s Guide on Web Scraping in R (using rvest) with hands-on example”, Saurav Kaushik, Analytics Vidhya (2017)

--

--