Web Scraping Menggunakan R

Pemrograman Sains Data I

Foto Profil

Pendahuluan

Web scraping adalah teknik otomatisasi untuk mengambil data dari situs web dan mengubahnya menjadi informasi terstruktur. Dalam laporan ini, kita akan menggunakan R dan paket rvest untuk melakukan web scraping secara efisien.

1. Instalasi dan Pemanggilan Paket

Sebelum memulai web scraping, pastikan paket rvest telah terinstal. Jika belum, instal terlebih dahulu dengan perintah berikut:

install.packages("rvest")  # Instal paket rvest untuk scraping data
install.packages("dplyr")   # Instal paket dplyr untuk manipulasi data
install.packages("datapasta") # Instal datapasta untuk mempermudah copy-paste data

Selanjutnya, panggil paket-paket yang akan digunakan:

library(rvest)  # Untuk melakukan scraping data dari HTML
library(dplyr)  # Untuk manipulasi data hasil scraping
library(datapasta)  # Untuk manajemen data copy-paste

2. Mengambil Data dari Halaman Web

Misalkan kita ingin mengambil data dari sebuah tabel di sebuah website. Kita perlu membaca HTML halaman tersebut dan mengekstrak tabelnya.

# Definisikan URL halaman web yang akan di-scrape
target_url <- "https://example.com/tabel"

# Baca konten HTML dari halaman web
webpage <- read_html(target_url)

# Cari elemen tabel dalam HTML
scraped_table <- webpage %>% html_node("table") %>% html_table(fill = TRUE)

# Tampilkan data yang diambil
head(scraped_table)  # Melihat beberapa baris pertama dari tabel

Penjelasan kode: - read_html(target_url): Membaca seluruh struktur HTML halaman web. - html_node("table"): Mencari elemen tabel dalam HTML. - html_table(fill = TRUE): Mengubah elemen tabel HTML menjadi data frame. - head(scraped_table): Menampilkan beberapa baris pertama dari data yang telah diambil.

3. Scraping Data dari Beberapa Halaman

Sering kali, data tersebar di beberapa halaman web. Kita dapat mengotomatisasi pengambilan data dari beberapa halaman menggunakan perulangan.

# Buat daftar URL dari beberapa halaman
target_urls <- c("https://example.com/page1",
                 "https://example.com/page2",
                 "https://example.com/page3")

# Buat list kosong untuk menyimpan hasil scraping
all_tables <- list()

# Loop untuk membaca setiap halaman web
i <- 1
for (url in target_urls) {
  page <- read_html(url)  # Membaca HTML halaman
  table <- page %>% html_node("table") %>% html_table(fill = TRUE)  # Ekstraksi tabel
  all_tables[[i]] <- table  # Simpan tabel ke dalam list
  i <- i + 1
}

# Gabungkan semua tabel menjadi satu data frame
final_data <- bind_rows(all_tables)

# Tampilkan data gabungan
head(final_data)

Penjelasan kode: - target_urls: Daftar halaman web yang akan di-scrape. - for (url in target_urls): Perulangan untuk mengambil data dari setiap halaman. - bind_rows(all_tables): Menggabungkan semua data dari beberapa halaman menjadi satu data frame.

4. Scraping Data Non-Tabel (Teks, Judul, dan Harga)

Selain tabel, kita juga bisa mengambil data non-tabel seperti teks, judul artikel, atau harga produk.

# Baca HTML dari halaman produk
page <- read_html("https://example.com/produk")

# Ambil teks dari elemen dengan class "product-title"
product_title <- page %>% html_node(".product-title") %>% html_text(trim = TRUE)

# Ambil harga produk
product_price <- page %>% html_node(".product-price") %>% html_text(trim = TRUE)

# Simpan dalam data frame
data_produk <- data.frame(Title = product_title, Price = product_price)

# Tampilkan hasil
print(data_produk)

Penjelasan kode: - html_node(".product-title"): Mengambil elemen HTML dengan class product-title. - html_text(trim = TRUE): Mengambil teks bersih dari elemen HTML. - data.frame(Title = product_title, Price = product_price): Menyimpan hasil dalam bentuk data frame.

5. Menghindari Pemblokiran Saat Scraping

Beberapa situs melindungi diri dari scraping dengan cara memblokir permintaan otomatis. Untuk menghindari pemblokiran, kita bisa:

  1. Menambahkan jeda antar permintaan menggunakan Sys.sleep().
  2. Menggunakan User-Agent agar permintaan terlihat seperti berasal dari browser asli.
for (url in target_urls) {
  page <- read_html(url, options = "H")  # Simulasi header request
  Sys.sleep(2)  # Tambahkan jeda 2 detik sebelum request berikutnya
  table <- page %>% html_node("table") %>% html_table(fill = TRUE)
  print(head(table))
}

Kesimpulan

Dengan menggunakan rvest di R, kita dapat mengekstrak berbagai jenis data dari website, baik dalam bentuk tabel maupun teks. Teknik ini berguna untuk analisis data, riset pasar, dan pengumpulan informasi dari berbagai sumber.

LS0tDQp0aXRsZTogIldlYiBTY3JhcGluZyBNZW5nZ3VuYWthbiBSIg0Kc3VidGl0bGU6ICJQZW1yb2dyYW1hbiBTYWlucyBEYXRhIEkiDQphdXRob3I6ICJKT0FOUyBIRU5LWSBTRVJWQVRJVVMgU0lNQU5VTExBTkciDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAic3R5bGUxLmNzcyINCi0tLQ0KDQo8aW1nIHNyYz0iZm90by5qcGVnIiBzdHlsZT0iZGlzcGxheTogYmxvY2s7IG1hcmdpbjogYXV0bzsgd2lkdGg6IDM2MHB4OyBoZWlnaHQ6IDQ4MHB4OyIgYWx0PSJGb3RvIFByb2ZpbCI+DQoNCiMgKipQZW5kYWh1bHVhbioqDQoNCldlYiBzY3JhcGluZyBhZGFsYWggdGVrbmlrIG90b21hdGlzYXNpIHVudHVrIG1lbmdhbWJpbCBkYXRhIGRhcmkgc2l0dXMgd2ViIGRhbiBtZW5ndWJhaG55YSBtZW5qYWRpIGluZm9ybWFzaSB0ZXJzdHJ1a3R1ci4gRGFsYW0gbGFwb3JhbiBpbmksIGtpdGEgYWthbiBtZW5nZ3VuYWthbiBSIGRhbiBwYWtldCBgcnZlc3RgIHVudHVrIG1lbGFrdWthbiB3ZWIgc2NyYXBpbmcgc2VjYXJhIGVmaXNpZW4uDQoNCiMjICoqMS4gSW5zdGFsYXNpIGRhbiBQZW1hbmdnaWxhbiBQYWtldCoqDQoNClNlYmVsdW0gbWVtdWxhaSB3ZWIgc2NyYXBpbmcsIHBhc3Rpa2FuIHBha2V0IGBydmVzdGAgdGVsYWggdGVyaW5zdGFsLiBKaWthIGJlbHVtLCBpbnN0YWwgdGVybGViaWggZGFodWx1IGRlbmdhbiBwZXJpbnRhaCBiZXJpa3V0Og0KDQpgYGByDQppbnN0YWxsLnBhY2thZ2VzKCJydmVzdCIpICAjIEluc3RhbCBwYWtldCBydmVzdCB1bnR1ayBzY3JhcGluZyBkYXRhDQppbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpICAgIyBJbnN0YWwgcGFrZXQgZHBseXIgdW50dWsgbWFuaXB1bGFzaSBkYXRhDQppbnN0YWxsLnBhY2thZ2VzKCJkYXRhcGFzdGEiKSAjIEluc3RhbCBkYXRhcGFzdGEgdW50dWsgbWVtcGVybXVkYWggY29weS1wYXN0ZSBkYXRhDQpgYGANCg0KU2VsYW5qdXRueWEsIHBhbmdnaWwgcGFrZXQtcGFrZXQgeWFuZyBha2FuIGRpZ3VuYWthbjoNCg0KYGBgcg0KbGlicmFyeShydmVzdCkgICMgVW50dWsgbWVsYWt1a2FuIHNjcmFwaW5nIGRhdGEgZGFyaSBIVE1MDQpsaWJyYXJ5KGRwbHlyKSAgIyBVbnR1ayBtYW5pcHVsYXNpIGRhdGEgaGFzaWwgc2NyYXBpbmcNCmxpYnJhcnkoZGF0YXBhc3RhKSAgIyBVbnR1ayBtYW5hamVtZW4gZGF0YSBjb3B5LXBhc3RlDQpgYGANCg0KIyMgKioyLiBNZW5nYW1iaWwgRGF0YSBkYXJpIEhhbGFtYW4gV2ViKioNCg0KTWlzYWxrYW4ga2l0YSBpbmdpbiBtZW5nYW1iaWwgZGF0YSBkYXJpIHNlYnVhaCB0YWJlbCBkaSBzZWJ1YWggd2Vic2l0ZS4gS2l0YSBwZXJsdSBtZW1iYWNhIEhUTUwgaGFsYW1hbiB0ZXJzZWJ1dCBkYW4gbWVuZ2Vrc3RyYWsgdGFiZWxueWEuDQoNCmBgYHINCiMgRGVmaW5pc2lrYW4gVVJMIGhhbGFtYW4gd2ViIHlhbmcgYWthbiBkaS1zY3JhcGUNCnRhcmdldF91cmwgPC0gImh0dHBzOi8vZXhhbXBsZS5jb20vdGFiZWwiDQoNCiMgQmFjYSBrb250ZW4gSFRNTCBkYXJpIGhhbGFtYW4gd2ViDQp3ZWJwYWdlIDwtIHJlYWRfaHRtbCh0YXJnZXRfdXJsKQ0KDQojIENhcmkgZWxlbWVuIHRhYmVsIGRhbGFtIEhUTUwNCnNjcmFwZWRfdGFibGUgPC0gd2VicGFnZSAlPiUgaHRtbF9ub2RlKCJ0YWJsZSIpICU+JSBodG1sX3RhYmxlKGZpbGwgPSBUUlVFKQ0KDQojIFRhbXBpbGthbiBkYXRhIHlhbmcgZGlhbWJpbA0KaGVhZChzY3JhcGVkX3RhYmxlKSAgIyBNZWxpaGF0IGJlYmVyYXBhIGJhcmlzIHBlcnRhbWEgZGFyaSB0YWJlbA0KYGBgDQoNCioqUGVuamVsYXNhbiBrb2RlOioqDQotIGByZWFkX2h0bWwodGFyZ2V0X3VybClgOiBNZW1iYWNhIHNlbHVydWggc3RydWt0dXIgSFRNTCBoYWxhbWFuIHdlYi4NCi0gYGh0bWxfbm9kZSgidGFibGUiKWA6IE1lbmNhcmkgZWxlbWVuIHRhYmVsIGRhbGFtIEhUTUwuDQotIGBodG1sX3RhYmxlKGZpbGwgPSBUUlVFKWA6IE1lbmd1YmFoIGVsZW1lbiB0YWJlbCBIVE1MIG1lbmphZGkgKmRhdGEgZnJhbWUqLg0KLSBgaGVhZChzY3JhcGVkX3RhYmxlKWA6IE1lbmFtcGlsa2FuIGJlYmVyYXBhIGJhcmlzIHBlcnRhbWEgZGFyaSBkYXRhIHlhbmcgdGVsYWggZGlhbWJpbC4NCg0KIyMgKiozLiBTY3JhcGluZyBEYXRhIGRhcmkgQmViZXJhcGEgSGFsYW1hbioqDQoNClNlcmluZyBrYWxpLCBkYXRhIHRlcnNlYmFyIGRpIGJlYmVyYXBhIGhhbGFtYW4gd2ViLiBLaXRhIGRhcGF0IG1lbmdvdG9tYXRpc2FzaSBwZW5nYW1iaWxhbiBkYXRhIGRhcmkgYmViZXJhcGEgaGFsYW1hbiBtZW5nZ3VuYWthbiBwZXJ1bGFuZ2FuLg0KDQpgYGByDQojIEJ1YXQgZGFmdGFyIFVSTCBkYXJpIGJlYmVyYXBhIGhhbGFtYW4NCnRhcmdldF91cmxzIDwtIGMoImh0dHBzOi8vZXhhbXBsZS5jb20vcGFnZTEiLA0KICAgICAgICAgICAgICAgICAiaHR0cHM6Ly9leGFtcGxlLmNvbS9wYWdlMiIsDQogICAgICAgICAgICAgICAgICJodHRwczovL2V4YW1wbGUuY29tL3BhZ2UzIikNCg0KIyBCdWF0IGxpc3Qga29zb25nIHVudHVrIG1lbnlpbXBhbiBoYXNpbCBzY3JhcGluZw0KYWxsX3RhYmxlcyA8LSBsaXN0KCkNCg0KIyBMb29wIHVudHVrIG1lbWJhY2Egc2V0aWFwIGhhbGFtYW4gd2ViDQppIDwtIDENCmZvciAodXJsIGluIHRhcmdldF91cmxzKSB7DQogIHBhZ2UgPC0gcmVhZF9odG1sKHVybCkgICMgTWVtYmFjYSBIVE1MIGhhbGFtYW4NCiAgdGFibGUgPC0gcGFnZSAlPiUgaHRtbF9ub2RlKCJ0YWJsZSIpICU+JSBodG1sX3RhYmxlKGZpbGwgPSBUUlVFKSAgIyBFa3N0cmFrc2kgdGFiZWwNCiAgYWxsX3RhYmxlc1tbaV1dIDwtIHRhYmxlICAjIFNpbXBhbiB0YWJlbCBrZSBkYWxhbSBsaXN0DQogIGkgPC0gaSArIDENCn0NCg0KIyBHYWJ1bmdrYW4gc2VtdWEgdGFiZWwgbWVuamFkaSBzYXR1IGRhdGEgZnJhbWUNCmZpbmFsX2RhdGEgPC0gYmluZF9yb3dzKGFsbF90YWJsZXMpDQoNCiMgVGFtcGlsa2FuIGRhdGEgZ2FidW5nYW4NCmhlYWQoZmluYWxfZGF0YSkNCmBgYA0KDQoqKlBlbmplbGFzYW4ga29kZToqKg0KLSBgdGFyZ2V0X3VybHNgOiBEYWZ0YXIgaGFsYW1hbiB3ZWIgeWFuZyBha2FuIGRpLXNjcmFwZS4NCi0gYGZvciAodXJsIGluIHRhcmdldF91cmxzKWA6IFBlcnVsYW5nYW4gdW50dWsgbWVuZ2FtYmlsIGRhdGEgZGFyaSBzZXRpYXAgaGFsYW1hbi4NCi0gYGJpbmRfcm93cyhhbGxfdGFibGVzKWA6IE1lbmdnYWJ1bmdrYW4gc2VtdWEgZGF0YSBkYXJpIGJlYmVyYXBhIGhhbGFtYW4gbWVuamFkaSBzYXR1IGRhdGEgZnJhbWUuDQoNCiMjICoqNC4gU2NyYXBpbmcgRGF0YSBOb24tVGFiZWwgKFRla3MsIEp1ZHVsLCBkYW4gSGFyZ2EpKioNCg0KU2VsYWluIHRhYmVsLCBraXRhIGp1Z2EgYmlzYSBtZW5nYW1iaWwgZGF0YSBub24tdGFiZWwgc2VwZXJ0aSB0ZWtzLCBqdWR1bCBhcnRpa2VsLCBhdGF1IGhhcmdhIHByb2R1ay4NCg0KYGBgcg0KIyBCYWNhIEhUTUwgZGFyaSBoYWxhbWFuIHByb2R1aw0KcGFnZSA8LSByZWFkX2h0bWwoImh0dHBzOi8vZXhhbXBsZS5jb20vcHJvZHVrIikNCg0KIyBBbWJpbCB0ZWtzIGRhcmkgZWxlbWVuIGRlbmdhbiBjbGFzcyAicHJvZHVjdC10aXRsZSINCnByb2R1Y3RfdGl0bGUgPC0gcGFnZSAlPiUgaHRtbF9ub2RlKCIucHJvZHVjdC10aXRsZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpDQoNCiMgQW1iaWwgaGFyZ2EgcHJvZHVrDQpwcm9kdWN0X3ByaWNlIDwtIHBhZ2UgJT4lIGh0bWxfbm9kZSgiLnByb2R1Y3QtcHJpY2UiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKQ0KDQojIFNpbXBhbiBkYWxhbSBkYXRhIGZyYW1lDQpkYXRhX3Byb2R1ayA8LSBkYXRhLmZyYW1lKFRpdGxlID0gcHJvZHVjdF90aXRsZSwgUHJpY2UgPSBwcm9kdWN0X3ByaWNlKQ0KDQojIFRhbXBpbGthbiBoYXNpbA0KcHJpbnQoZGF0YV9wcm9kdWspDQpgYGANCg0KKipQZW5qZWxhc2FuIGtvZGU6KioNCi0gYGh0bWxfbm9kZSgiLnByb2R1Y3QtdGl0bGUiKWA6IE1lbmdhbWJpbCBlbGVtZW4gSFRNTCBkZW5nYW4gY2xhc3MgYHByb2R1Y3QtdGl0bGVgLg0KLSBgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKWA6IE1lbmdhbWJpbCB0ZWtzIGJlcnNpaCBkYXJpIGVsZW1lbiBIVE1MLg0KLSBgZGF0YS5mcmFtZShUaXRsZSA9IHByb2R1Y3RfdGl0bGUsIFByaWNlID0gcHJvZHVjdF9wcmljZSlgOiBNZW55aW1wYW4gaGFzaWwgZGFsYW0gYmVudHVrICpkYXRhIGZyYW1lKi4NCg0KIyMgKio1LiBNZW5naGluZGFyaSBQZW1ibG9raXJhbiBTYWF0IFNjcmFwaW5nKioNCg0KQmViZXJhcGEgc2l0dXMgbWVsaW5kdW5naSBkaXJpIGRhcmkgc2NyYXBpbmcgZGVuZ2FuIGNhcmEgbWVtYmxva2lyIHBlcm1pbnRhYW4gb3RvbWF0aXMuIFVudHVrIG1lbmdoaW5kYXJpIHBlbWJsb2tpcmFuLCBraXRhIGJpc2E6DQoNCjEuICoqTWVuYW1iYWhrYW4gamVkYSBhbnRhciBwZXJtaW50YWFuKiogbWVuZ2d1bmFrYW4gYFN5cy5zbGVlcCgpYC4NCjIuICoqTWVuZ2d1bmFrYW4gVXNlci1BZ2VudCoqIGFnYXIgcGVybWludGFhbiB0ZXJsaWhhdCBzZXBlcnRpIGJlcmFzYWwgZGFyaSBicm93c2VyIGFzbGkuDQoNCmBgYHINCmZvciAodXJsIGluIHRhcmdldF91cmxzKSB7DQogIHBhZ2UgPC0gcmVhZF9odG1sKHVybCwgb3B0aW9ucyA9ICJIIikgICMgU2ltdWxhc2kgaGVhZGVyIHJlcXVlc3QNCiAgU3lzLnNsZWVwKDIpICAjIFRhbWJhaGthbiBqZWRhIDIgZGV0aWsgc2ViZWx1bSByZXF1ZXN0IGJlcmlrdXRueWENCiAgdGFibGUgPC0gcGFnZSAlPiUgaHRtbF9ub2RlKCJ0YWJsZSIpICU+JSBodG1sX3RhYmxlKGZpbGwgPSBUUlVFKQ0KICBwcmludChoZWFkKHRhYmxlKSkNCn0NCmBgYA0KDQojIyAqKktlc2ltcHVsYW4qKg0KDQpEZW5nYW4gbWVuZ2d1bmFrYW4gYHJ2ZXN0YCBkaSBSLCBraXRhIGRhcGF0IG1lbmdla3N0cmFrIGJlcmJhZ2FpIGplbmlzIGRhdGEgZGFyaSB3ZWJzaXRlLCBiYWlrIGRhbGFtIGJlbnR1ayB0YWJlbCBtYXVwdW4gdGVrcy4gVGVrbmlrIGluaSBiZXJndW5hIHVudHVrIGFuYWxpc2lzIGRhdGEsIHJpc2V0IHBhc2FyLCBkYW4gcGVuZ3VtcHVsYW4gaW5mb3JtYXNpIGRhcmkgYmVyYmFnYWkgc3VtYmVyLg0KDQojIyAqKlJlZmVyZW5zaSoqDQoNCi0gaHR0cHM6Ly9ib29rZG93bi5vcmcvZHNjaWVuY2VsYWJzL2RhdGFfc2NpZW5jZV9wcm9ncmFtbWluZy8wNC1EYXRhX0NvbGxlY3Rpb24uaHRtbA0KLSBodHRwczovL3d3dy5nZWVrc2ZvcmdlZWtzLm9yZy93ZWItc2NyYXBpbmctaW4tci8NCi0gaHR0cHM6Ly93d3cuZGV3YXdlYi5jb20vYmxvZy93ZWItc2NyYXBpbmctcGFuZHVhbi1kYW4tdGVrbmlrLXRla25pa255YS8=