Pemprogram Ilmu Data

Web Scraping di R

Logo

1 Web Scraping di R dengan ChatGPT

Sering kali, data yang ingin kita analisis sudah tersedia dalam format seperti teks, CSV, atau file Excel. Namun, dalam beberapa kasus, data hanya tersedia di berbagai halaman situs web. Dalam situasi seperti ini, kita bisa menggunakan teknik web scraping untuk mengambil data tersebut.

Dalam panduan ini, kita akan membahas cara melakukan web scraping di R menggunakan paket rvest, dengan empat contoh yang kompleks.

2 Contoh 1: Menyalin Data Tabel secara Manual

Jika tabel sudah tersedia dalam bentuk yang dapat disalin, kita bisa langsung menyalinnya dan menggunakan paket datapasta untuk memasukkannya ke dalam R.

# Instalasi dan pemanggilan library datapasta
library(datapasta) # Memanggil library untuk digunakan

# Membuat data frame berisi peringkat medali Olimpiade
olympic_medals <- data.frame(
  Rank = c(1, 2, 3),
  Nation = c("USA", "China", "Japan"),
  Gold = c(39, 38, 27),
  Silver = c(41, 32, 14),
  Bronze = c(33, 18, 17),
  Total = c(113, 88, 58)
)

# Menampilkan isi data frame
print(olympic_medals)
##   Rank Nation Gold Silver Bronze Total
## 1    1    USA   39     41     33   113
## 2    2  China   38     32     18    88
## 3    3  Japan   27     14     17    58

3 Contoh 2: Menggunakan rvest untuk Mengambil Data Tabel dari Website

Untuk scraping data tabel dari website, kita bisa menggunakan paket rvest.

# pemanggilan library rvest
library(rvest)

# Menentukan URL halaman yang akan di-scrape
url <- "https://cran.r-project.org/web/packages/available_packages_by_name.html"

# Membaca halaman HTML dari URL
webpage <- read_html(url)

# Mengambil tabel pertama yang ditemukan di halaman
packages_table <- webpage %>%
  html_node("table") %>%
  html_table()

# Menampilkan beberapa baris pertama dari tabel yang telah diambil
head(packages_table)

4 Contoh 3: Scraping Data dari Beberapa Halaman Web

Ketika data tersebar di beberapa halaman dengan ID tertentu, kita bisa menggunakan loop untuk mengambil data dari berbagai halaman secara otomatis.

# Memanggil library yang dibutuhkan
library(dplyr)
library(rvest)

# Daftar URL dari halaman web yang akan di-scrape
urls <- c(
  "https://fbref.com/en/squads/4a817ac8/Germany",
  "https://fbref.com/en/squads/206d90db/Spain",
  "https://fbref.com/en/squads/5ba8c39d/Italy",
  "https://fbref.com/en/squads/1c896955/France"
)

# Menyimpan hasil scraping dalam list
squad_data <- list()

# Looping melalui setiap URL untuk mengambil data tabel
for (i in 1:length(urls)) {
  tryCatch({
    webpage <- read_html(urls[i])
    table <- webpage %>% html_node("#stats_standard") %>% html_table()
    squad_data[[i]] <- table
  }, error = function(e) {
    message("Gagal mengambil data dari: ", urls[i])
  })
}


# Menggabungkan semua data dari list menjadi satu data frame
total_squad_data <- bind_rows(squad_data)

# Menampilkan beberapa baris pertama dari data yang diperoleh
head(total_squad_data)

5 Contoh 4: Scraping Data dari Elemen Non-Tabel dengan ChatGPT

Terkadang, data yang kita butuhkan tidak berbentuk tabel tetapi tersembunyi dalam berbagai elemen HTML. Kita bisa menggunakan ChatGPT untuk membantu mengidentifikasi elemen yang sesuai dan menulis kode scraping.

# URL dasar dengan parameter halaman
base_url <- "https://www.patreon.com/discover?page="
pages <- 1:5 # Halaman yang ingin diambil

# Menyimpan hasil scraping dalam list
discovery_data <- list()

# Looping untuk mengambil data dari beberapa halaman
for (page in pages) {
  url <- paste0(base_url, page) # Menggabungkan URL dengan nomor halaman
  webpage <- read_html(url) # Membaca halaman web
  
  # Mengambil elemen HTML berdasarkan class tertentu
  titles <- webpage %>% html_nodes(".sc-jEACwC.bITNer") %>% html_text()
  descriptions <- webpage %>% html_nodes(".sc-gEvEer") %>% html_text()
  members <- webpage %>% html_nodes(".sc-dsQDmV") %>% html_text()
  
  # Menyimpan data dalam bentuk data frame
  discovery_data[[page]] <- data.frame(titles, descriptions, members)
}

# Menggabungkan semua data dari list menjadi satu data frame
final_discovery_data <- bind_rows(discovery_data)

# Menampilkan beberapa baris pertama dari data yang diperoleh
head(final_discovery_data)

6 Kesimpulan

Web scraping di R dapat dilakukan dengan berbagai cara, dari metode manual hingga otomatisasi menggunakan rvest. Dengan bantuan ChatGPT, kita bisa lebih mudah memahami struktur halaman web dan menulis kode scraping yang lebih efektif. Namun, perlu diingat bahwa banyak situs web memiliki aturan ketat terkait scraping, jadi gunakan teknik ini dengan bijak agar tidak terkena pemblokiran.

LS0tDQp0aXRsZTogIlBlbXByb2dyYW0gSWxtdSBEYXRhIg0Kc3VidGl0bGU6ICJXZWIgU2NyYXBpbmcgZGkgUiINCmF1dGhvcjogDQogIC0gIk5vdmEgU2l0b3J1cyA1MjI0MDAyMyINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOiAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAic3R5bGUvc3R5bGUgY3NzLmNzcyINCi0tLQ0KDQo8c3R5bGU+DQogIGJvZHkgew0KICAgIHRleHQtYWxpZ246IGp1c3RpZnk7DQogIH0NCjwvc3R5bGU+DQoNCjxpbWcgc3JjPSJOT1ZBLmpwZyIgYWx0PSJMb2dvIiBzdHlsZT0id2lkdGg6NTAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ii8+DQoNCg0KDQojIFdlYiBTY3JhcGluZyBkaSBSIGRlbmdhbiBDaGF0R1BUDQoNClNlcmluZyBrYWxpLCBkYXRhIHlhbmcgaW5naW4ga2l0YSBhbmFsaXNpcyBzdWRhaCB0ZXJzZWRpYSBkYWxhbSBmb3JtYXQgc2VwZXJ0aSB0ZWtzLCBDU1YsIGF0YXUgZmlsZSBFeGNlbC4gTmFtdW4sIGRhbGFtIGJlYmVyYXBhIGthc3VzLCBkYXRhIGhhbnlhIHRlcnNlZGlhIGRpIGJlcmJhZ2FpIGhhbGFtYW4gc2l0dXMgd2ViLiBEYWxhbSBzaXR1YXNpIHNlcGVydGkgaW5pLCBraXRhIGJpc2EgbWVuZ2d1bmFrYW4gdGVrbmlrIHdlYiBzY3JhcGluZyB1bnR1ayBtZW5nYW1iaWwgZGF0YSB0ZXJzZWJ1dC4NCg0KRGFsYW0gcGFuZHVhbiBpbmksIGtpdGEgYWthbiBtZW1iYWhhcyBjYXJhIG1lbGFrdWthbiB3ZWIgc2NyYXBpbmcgZGkgUiBtZW5nZ3VuYWthbiBwYWtldCBgYGBydmVzdGBgYCwgZGVuZ2FuIGVtcGF0IGNvbnRvaCB5YW5nIGtvbXBsZWtzLg0KDQoNCiMgQ29udG9oIDE6IE1lbnlhbGluIERhdGEgVGFiZWwgc2VjYXJhIE1hbnVhbA0KDQpKaWthIHRhYmVsIHN1ZGFoIHRlcnNlZGlhIGRhbGFtIGJlbnR1ayB5YW5nIGRhcGF0IGRpc2FsaW4sIGtpdGEgYmlzYSBsYW5nc3VuZyBtZW55YWxpbm55YSBkYW4gbWVuZ2d1bmFrYW4gcGFrZXQgZGF0YXBhc3RhIHVudHVrIG1lbWFzdWtrYW5ueWEga2UgZGFsYW0gUi4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEluc3RhbGFzaSBkYW4gcGVtYW5nZ2lsYW4gbGlicmFyeSBkYXRhcGFzdGENCmxpYnJhcnkoZGF0YXBhc3RhKSAjIE1lbWFuZ2dpbCBsaWJyYXJ5IHVudHVrIGRpZ3VuYWthbg0KDQojIE1lbWJ1YXQgZGF0YSBmcmFtZSBiZXJpc2kgcGVyaW5na2F0IG1lZGFsaSBPbGltcGlhZGUNCm9seW1waWNfbWVkYWxzIDwtIGRhdGEuZnJhbWUoDQogIFJhbmsgPSBjKDEsIDIsIDMpLA0KICBOYXRpb24gPSBjKCJVU0EiLCAiQ2hpbmEiLCAiSmFwYW4iKSwNCiAgR29sZCA9IGMoMzksIDM4LCAyNyksDQogIFNpbHZlciA9IGMoNDEsIDMyLCAxNCksDQogIEJyb256ZSA9IGMoMzMsIDE4LCAxNyksDQogIFRvdGFsID0gYygxMTMsIDg4LCA1OCkNCikNCg0KIyBNZW5hbXBpbGthbiBpc2kgZGF0YSBmcmFtZQ0KcHJpbnQob2x5bXBpY19tZWRhbHMpDQpgYGANCg0KIyBDb250b2ggMjogTWVuZ2d1bmFrYW4gYGBgcnZlc3RgYGAgdW50dWsgTWVuZ2FtYmlsIERhdGEgVGFiZWwgZGFyaSBXZWJzaXRlDQoNClVudHVrIHNjcmFwaW5nIGRhdGEgdGFiZWwgZGFyaSB3ZWJzaXRlLCBraXRhIGJpc2EgbWVuZ2d1bmFrYW4gcGFrZXQgYGBgcnZlc3RgYGAuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBwZW1hbmdnaWxhbiBsaWJyYXJ5IHJ2ZXN0DQpsaWJyYXJ5KHJ2ZXN0KQ0KDQojIE1lbmVudHVrYW4gVVJMIGhhbGFtYW4geWFuZyBha2FuIGRpLXNjcmFwZQ0KdXJsIDwtICJodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvYXZhaWxhYmxlX3BhY2thZ2VzX2J5X25hbWUuaHRtbCINCg0KIyBNZW1iYWNhIGhhbGFtYW4gSFRNTCBkYXJpIFVSTA0Kd2VicGFnZSA8LSByZWFkX2h0bWwodXJsKQ0KDQojIE1lbmdhbWJpbCB0YWJlbCBwZXJ0YW1hIHlhbmcgZGl0ZW11a2FuIGRpIGhhbGFtYW4NCnBhY2thZ2VzX3RhYmxlIDwtIHdlYnBhZ2UgJT4lDQogIGh0bWxfbm9kZSgidGFibGUiKSAlPiUNCiAgaHRtbF90YWJsZSgpDQoNCiMgTWVuYW1waWxrYW4gYmViZXJhcGEgYmFyaXMgcGVydGFtYSBkYXJpIHRhYmVsIHlhbmcgdGVsYWggZGlhbWJpbA0KaGVhZChwYWNrYWdlc190YWJsZSkNCmBgYA0KDQojIENvbnRvaCAzOiBTY3JhcGluZyBEYXRhIGRhcmkgQmViZXJhcGEgSGFsYW1hbiBXZWINCg0KS2V0aWthIGRhdGEgdGVyc2ViYXIgZGkgYmViZXJhcGEgaGFsYW1hbiBkZW5nYW4gSUQgdGVydGVudHUsIGtpdGEgYmlzYSBtZW5nZ3VuYWthbiBsb29wIHVudHVrIG1lbmdhbWJpbCBkYXRhIGRhcmkgYmVyYmFnYWkgaGFsYW1hbiBzZWNhcmEgb3RvbWF0aXMuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW1hbmdnaWwgbGlicmFyeSB5YW5nIGRpYnV0dWhrYW4NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJ2ZXN0KQ0KDQojIERhZnRhciBVUkwgZGFyaSBoYWxhbWFuIHdlYiB5YW5nIGFrYW4gZGktc2NyYXBlDQp1cmxzIDwtIGMoDQogICJodHRwczovL2ZicmVmLmNvbS9lbi9zcXVhZHMvNGE4MTdhYzgvR2VybWFueSIsDQogICJodHRwczovL2ZicmVmLmNvbS9lbi9zcXVhZHMvMjA2ZDkwZGIvU3BhaW4iLA0KICAiaHR0cHM6Ly9mYnJlZi5jb20vZW4vc3F1YWRzLzViYThjMzlkL0l0YWx5IiwNCiAgImh0dHBzOi8vZmJyZWYuY29tL2VuL3NxdWFkcy8xYzg5Njk1NS9GcmFuY2UiDQopDQoNCiMgTWVueWltcGFuIGhhc2lsIHNjcmFwaW5nIGRhbGFtIGxpc3QNCnNxdWFkX2RhdGEgPC0gbGlzdCgpDQoNCiMgTG9vcGluZyBtZWxhbHVpIHNldGlhcCBVUkwgdW50dWsgbWVuZ2FtYmlsIGRhdGEgdGFiZWwNCmZvciAoaSBpbiAxOmxlbmd0aCh1cmxzKSkgew0KICB0cnlDYXRjaCh7DQogICAgd2VicGFnZSA8LSByZWFkX2h0bWwodXJsc1tpXSkNCiAgICB0YWJsZSA8LSB3ZWJwYWdlICU+JSBodG1sX25vZGUoIiNzdGF0c19zdGFuZGFyZCIpICU+JSBodG1sX3RhYmxlKCkNCiAgICBzcXVhZF9kYXRhW1tpXV0gPC0gdGFibGUNCiAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICAgbWVzc2FnZSgiR2FnYWwgbWVuZ2FtYmlsIGRhdGEgZGFyaTogIiwgdXJsc1tpXSkNCiAgfSkNCn0NCg0KDQojIE1lbmdnYWJ1bmdrYW4gc2VtdWEgZGF0YSBkYXJpIGxpc3QgbWVuamFkaSBzYXR1IGRhdGEgZnJhbWUNCnRvdGFsX3NxdWFkX2RhdGEgPC0gYmluZF9yb3dzKHNxdWFkX2RhdGEpDQoNCiMgTWVuYW1waWxrYW4gYmViZXJhcGEgYmFyaXMgcGVydGFtYSBkYXJpIGRhdGEgeWFuZyBkaXBlcm9sZWgNCmhlYWQodG90YWxfc3F1YWRfZGF0YSkNCmBgYA0KDQoNCiMgQ29udG9oIDQ6IFNjcmFwaW5nIERhdGEgZGFyaSBFbGVtZW4gTm9uLVRhYmVsIGRlbmdhbiBDaGF0R1BUDQoNClRlcmthZGFuZywgZGF0YSB5YW5nIGtpdGEgYnV0dWhrYW4gdGlkYWsgYmVyYmVudHVrIHRhYmVsIHRldGFwaSB0ZXJzZW1idW55aSBkYWxhbSBiZXJiYWdhaSBlbGVtZW4gSFRNTC4gS2l0YSBiaXNhIG1lbmdndW5ha2FuIENoYXRHUFQgdW50dWsgbWVtYmFudHUgbWVuZ2lkZW50aWZpa2FzaSBlbGVtZW4geWFuZyBzZXN1YWkgZGFuIG1lbnVsaXMga29kZSBzY3JhcGluZy4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFVSTCBkYXNhciBkZW5nYW4gcGFyYW1ldGVyIGhhbGFtYW4NCmJhc2VfdXJsIDwtICJodHRwczovL3d3dy5wYXRyZW9uLmNvbS9kaXNjb3Zlcj9wYWdlPSINCnBhZ2VzIDwtIDE6NSAjIEhhbGFtYW4geWFuZyBpbmdpbiBkaWFtYmlsDQoNCiMgTWVueWltcGFuIGhhc2lsIHNjcmFwaW5nIGRhbGFtIGxpc3QNCmRpc2NvdmVyeV9kYXRhIDwtIGxpc3QoKQ0KDQojIExvb3BpbmcgdW50dWsgbWVuZ2FtYmlsIGRhdGEgZGFyaSBiZWJlcmFwYSBoYWxhbWFuDQpmb3IgKHBhZ2UgaW4gcGFnZXMpIHsNCiAgdXJsIDwtIHBhc3RlMChiYXNlX3VybCwgcGFnZSkgIyBNZW5nZ2FidW5na2FuIFVSTCBkZW5nYW4gbm9tb3IgaGFsYW1hbg0KICB3ZWJwYWdlIDwtIHJlYWRfaHRtbCh1cmwpICMgTWVtYmFjYSBoYWxhbWFuIHdlYg0KICANCiAgIyBNZW5nYW1iaWwgZWxlbWVuIEhUTUwgYmVyZGFzYXJrYW4gY2xhc3MgdGVydGVudHUNCiAgdGl0bGVzIDwtIHdlYnBhZ2UgJT4lIGh0bWxfbm9kZXMoIi5zYy1qRUFDd0MuYklUTmVyIikgJT4lIGh0bWxfdGV4dCgpDQogIGRlc2NyaXB0aW9ucyA8LSB3ZWJwYWdlICU+JSBodG1sX25vZGVzKCIuc2MtZ0V2RWVyIikgJT4lIGh0bWxfdGV4dCgpDQogIG1lbWJlcnMgPC0gd2VicGFnZSAlPiUgaHRtbF9ub2RlcygiLnNjLWRzUURtViIpICU+JSBodG1sX3RleHQoKQ0KICANCiAgIyBNZW55aW1wYW4gZGF0YSBkYWxhbSBiZW50dWsgZGF0YSBmcmFtZQ0KICBkaXNjb3ZlcnlfZGF0YVtbcGFnZV1dIDwtIGRhdGEuZnJhbWUodGl0bGVzLCBkZXNjcmlwdGlvbnMsIG1lbWJlcnMpDQp9DQoNCiMgTWVuZ2dhYnVuZ2thbiBzZW11YSBkYXRhIGRhcmkgbGlzdCBtZW5qYWRpIHNhdHUgZGF0YSBmcmFtZQ0KZmluYWxfZGlzY292ZXJ5X2RhdGEgPC0gYmluZF9yb3dzKGRpc2NvdmVyeV9kYXRhKQ0KDQojIE1lbmFtcGlsa2FuIGJlYmVyYXBhIGJhcmlzIHBlcnRhbWEgZGFyaSBkYXRhIHlhbmcgZGlwZXJvbGVoDQpoZWFkKGZpbmFsX2Rpc2NvdmVyeV9kYXRhKQ0KYGBgDQoNCiMgS2VzaW1wdWxhbg0KDQpXZWIgc2NyYXBpbmcgZGkgUiBkYXBhdCBkaWxha3VrYW4gZGVuZ2FuIGJlcmJhZ2FpIGNhcmEsIGRhcmkgbWV0b2RlIG1hbnVhbCBoaW5nZ2Egb3RvbWF0aXNhc2kgbWVuZ2d1bmFrYW4gYGBgcnZlc3RgYGAuIERlbmdhbiBiYW50dWFuIENoYXRHUFQsIGtpdGEgYmlzYSBsZWJpaCBtdWRhaCBtZW1haGFtaSBzdHJ1a3R1ciBoYWxhbWFuIHdlYiBkYW4gbWVudWxpcyBrb2RlIHNjcmFwaW5nIHlhbmcgbGViaWggZWZla3RpZi4gTmFtdW4sIHBlcmx1IGRpaW5nYXQgYmFod2EgYmFueWFrIHNpdHVzIHdlYiBtZW1pbGlraSBhdHVyYW4ga2V0YXQgdGVya2FpdCBzY3JhcGluZywgamFkaSBndW5ha2FuIHRla25payBpbmkgZGVuZ2FuIGJpamFrIGFnYXIgdGlkYWsgdGVya2VuYSBwZW1ibG9raXJhbi4=