Web Scraping Menggunakan Software R

Dea Ratu Nursidah
7 min readNov 18, 2020

--

Assalamualaikum Wr.Wb

Hallo Teman-teman Data Enthusiast!

udah pernah dengar web scraping belum? nah kalau belum ayo kita bahas

Web scraping, web harvesting, web data extraction merupakan kegiatan yang dilakukan untuk mengambil data tertentu secara semi-terstruktur dari sebuah halaman website. Halaman tersebut umumnya dibangun menggunakan bahasa markup seperti HTML atau XHTML, proses akan menganalisis dokumen sebelum memulai mengambil data.

Biasanya teknik scraping diimplementasikan pada sebuah bot agar bisa membuat proses yang harusnya dilakukan secara manual menjadi otomatis. Ketika kita menjumpai sebuah situs yang membatasi kuota API (Application Programming Interface) atau bahkan tidak menyediakan sama sekali, maka perayapan web akan sangat dibutuhkan sebagai langkah pengambilan data.

Pertama kali saya menulis medium, saya akan mencoba mengambil data dari IMDb (Internet Movie Database, https://www.imdb.com ) yang disusun berdasar popularitas film di tahun 2015 sampai dengan 2020 dan kemudian menyajikan hasil analisis dalam bentuk grafik,

jika ingin melihat daftar film pada tahun 2015 bisa menggunakan link https://www.imdb.com/search/title/?count=100&release_date=2015,2015&title_type=feature

Buka R kemudian install packages yang diperlukan setelah itu panggil package tersebut

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

Terlihat Output sebagai berikut,

selanjutnya buka halaman website yang ingin di Scrapping di IDMb,

masukkan perintah kedalam R seperti berikut,

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

didapatkan output sebagai berikut,

kemudian kita ingin mengambil data Runtime film yang ada dalam halaman web, maka untuk mengetahui posisi letak runtime dalam halaman html maka kita perlu menggunakan aplikasi “SelectorGadget” yang bisa langsung di download dan ditempelkan dalam Chrome,

setelah itu akan muncul ikon kecil di kanan atas pada halaman google chrome

klik ikon tersebut maka akan muncul jendela kecil yang berisi letak bagian yang kita incar

kemudian gunakan perintah R sebagai berikut,

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

didapatkan output sebagai berikut,

kita bersihkan terlebih dahulu data yang ada kemudian dibuat menjadi tipe numeric menggunakan perintah sebagai berikut,

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

didapatkan output sebagai berikut,

kita akan mengambil data gross(pendapatan kotor) pada tahun 2015 gunakan perintah sebagai berikut,

> gross_data_laman <- html_nodes(lamanweb,'.ghost~ .text-muted+ span')
> gross_data <- html_text(gross_data_laman)
> gross_data

didapatkan output sebagai berikut,

untuk menghilangkan huruf M dan $ digunakan perintah sebagai berikut,

> gross_data<-gsub("M","",gross_data)
> gross_data<-substring(gross_data,2,6)
> gross_data

didapatkan output sebagai berikut,

lihat jumlah banyaknya data pendapatan kotor menggunakan perintah sebagai berikut,

length(gross_data)

didapatkan output sebagai berikut,

dikarenakan terdapat 91 data pendapatan kotor maka dari 100 data yang ada maka terdapat 9 data a yang tidak terdapat data pendapatan kotor tersebut.

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)

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

> for (i in c(3,23,51,66,73,76,85,92,97)){

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)

}

kemudian jalankan perintah sebagai berikut,

> gross_data<-as.numeric(gross_data)
> length(gross_data)
> summary(gross_data)

untuk mengambil data genre gunakan perintah sebagai berikut,

#scraping data genre
genre_data_laman <- html_nodes(lamanweb,'.genre')
genre_data_laman
# kita ambil data text genre
genre_data <- html_text(genre_data_laman)
genre_data
# karena masih banyak memuat tanda "\n" maka kita hilangkan terlebih # dahulu
# kita hilangkan juga spasi kosong
genre_data<-gsub("\n","",genre_data)
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)
genre_data
# kita lihat lagi hasilnya,
head(genre_data)

didapatkan output sebagai berikut,

kemudian,

berikutnya,

terlihat,

untuk mengambil data rating gunakan perintah sebagai berikut,

#screping data rating
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

didapatkan output sebagai berikut,

berikutnya,

terlihat,

kemudian, data dikumpulkan sebagai data frame menggunakan perintah sebagai berikut,

kumpulan_data_film <-data.frame(Genre2015 = genre_data, 
Rating2015 = rating_data)
str(kumpulan_data_film)

didapatkan output sebagai berikut,

kemudian akan dibuat beberapa visualisasi penting , aktifkan package ggplot2 dan gunakan perintah sebagai berikut,

> library(ggplot2)
#buat plot1
> qplot(data = kumpulan_data_film,Rating2015,fill = Genre2015,bins = 30)
> ggplot(kumpulan_data_film,aes(x=Rating2015,y=Genre2015))+
geom_point(aes(size=Rating2015,col=Genre2015))

Disini terdapat 2 ouput visualisasi yaitu diagram batang dan scatterplot.

berdasarkan hasil visualisasi diagram diatas dapat dilihat hubungan antara genre dan rating, dimana genre action mendominasi rating. kemudian dilakukan visualisasi menggunakan scatterplot dengan output sebagai berikut,

Setelah selesai melakukan scraping data tahun 2015, selanjutnya teman-teman bisa menggunakan perintah yang sama untuk mengambil data tahun 2016, 2017, 2018, 2019, dan 2020

setelah didapatkan semua data pendapatan kotor, genre, dan rating dari tahun 2015–2020 ternyata pada tahun 2020 terdapat missing value pada rating gunakan cara yang sama seperti missing value pada pendapatan kotor.

Berikut ini merupakan perintah untuk missing value pada rating 2020

for (i in c(4,5,19,43,46,55,64,81,84,93,95,97)){

a<-rating_data5[0:(i-1)]

b<-rating_data5[i:length(rating_data5)]
for (i in c(4,5,19,43,46,55,64,81,84,93,95,97)){

a<-rating_data5[0:(i-1)]

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

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

rating_data5<-append(rating_data5,b)

}
rating_data5<-append(a,list("NA"))

rating_data5<-append(rating_data5,b)

}

selanjutnya membuat grafik garis untuk data pendapatan kotor menggunakan perintah sebagai berikut,

> summary(gross_data)
> summary(gross_data1)
> summary(gross_data2)
> summary(gross_data3)
> summary(gross_data4)
> summary(gross_data5)
#rata-rata
> rata_gross <- c(95.95, 91.77, 104.18, 103.26, 152.60, 102.79)
> tahun <-c("2015","2016","2017","2018","2019","2020")
> gross <- data.frame(tahun, rata_gross)
> print(gross)
> plot(gross, main = "Rata - rata Pendapatan Kotor Film Tahun 2015 - 2020",
lwd= 2, col = "purple", xlim = c(2015,2020),type="l",pch=15)

didapatkan output sebagai berikut,

Dapat dilihat dari output grafik garis diatas bahwa pendapatan kotor dari tahun ketaun cenderung naik dan pendapatan kotor terbanyak ada pada tahun 2019 memasuki tahun 2020 pendapatan kotor turun drastis dikarenakan adanya wabah COVID-19 sehingga bioskop tutup.

Berikut merupakan beberapa visualisasi penting tahun 2016–2020 menggunakan variabel genre dan rating. Sebelumnya aktifkan package ggplot2 dan gunakan perintah sebagai berikut

#Plot 2
> qplot(data = kumpulan_data_film1,Rating2016,fill = Genre2016,bins = 30)
> ggplot(kumpulan_data_film1,aes(x=Rating2016,y=Genre2016))+
geom_point(aes(size=Rating2016,col=Genre2016))
#plot 3
> qplot(data = kumpulan_data_film2,Rating2017,fill = Genre2017,bins = 30)
> ggplot(kumpulan_data_film2,aes(x=Rating2017,y=Genre2017))+
geom_point(aes(size=Rating2017,col=Genre2017))
#plot 4
> qplot(data = kumpulan_data_film3,Rating2018,fill = Genre2018,bins = 30)
> ggplot(kumpulan_data_film3,aes(x=Rating2018,y=Genre2018))+
geom_point(aes(size=Rating2018,col=Genre2018))
#plot 5
> qplot(data = kumpulan_data_film4,Rating2019,fill = Genre2019,bins = 30)
> ggplot(kumpulan_data_film4,aes(x=Rating2019,y=Genre2019))+
geom_point(aes(size=Rating2019,col=Genre2019))
#plot 6
> qplot(data = kumpulan_data_film5,Rating2020,fill = Genre2020,bins = 30)
> ggplot(kumpulan_data_film5,aes(x=Rating2020,y=Genre2020))+
geom_point(aes(size=Rating2020,col=Genre2020))

Plot tahun 2016

Plot tahun 2017

Plot tahun 2018

Plot tahun 2019

Plot tahun 2020

Jika dilihat pada output scatterplot penonton pada tahun 2015–2020 menyukai film bergenre action sehingga saran saya untuk para produser film yaitu membuat film-film bergenre action.

Terimakasih buat teman-teman yang sudah mau membaca dari awal sampai akhir , semoga bermanfaat ya :)

Wassalamualaikum Wr. Wb.

Referensi :

  1. Hakim, RB.F. (2019, September 25). Web Scrapping dengan R. From Medium.com : https://medium.com/@986110101/web-scraping-dengan-r-53d07fb81fc9

--

--