Code
Tugas Data Scraping
Langkah-Langkah Web Scraping di R dengan
ChatGPT
Tujuan Pembelajaran
Setelah mempelajari panduan ini, Anda akan dapat:
Memahami konsep dasar web scraping dan bagaimana menggunakannya di
R.
Menggunakan paket rvest untuk mengambil data dari
halaman web.
Menemukan elemen HTML yang relevan dengan Developer Tools
di browser.
Melakukan scraping tabel serta data non-tabel dari website.
Menggunakan loop untuk mengotomatisasi scraping dari banyak halaman
web.
Membersihkan dan mengolah data hasil scraping di R.
Menghindari kesalahan umum dan mencegah pemblokiran saat
scraping.
1. Pendahuluan
Web scraping digunakan untuk mengambil data dari website ketika data
tidak tersedia dalam format rapi seperti CSV atau Excel.
Kita akan menggunakan paket rvest untuk melakukan
scraping di R.
2. Metode Cepat: Copy-Paste Data dari Tabel
Instal paket data.pasta di R.
Salin tabel dari website.
Gunakan fitur paste as data frame dari
data.pasta di R.
3. Memulai Web Scraping dengan rvest
Instal dan panggil paket rvest:
install.packages ("rvest" )
library (rvest)
Gunakan read_html("URL") untuk membaca halaman
web.
Gunakan html_node() untuk memilih elemen spesifik
seperti tabel.
Gunakan html_table() untuk mengonversi tabel ke
format data frame .
5. Contoh Scraping Tabel Data R Packages
Buka halaman web yang berisi tabel data.
Gunakan read_html() untuk membaca halaman
tersebut:
url <- "https://example.com"
page <- read_html (url)
Gunakan html_node() untuk memilih tabel:
table <- page %>% html_node ("table" )
Konversi ke format data frame :
data <- table %>% html_table ()
6. Scraping Data dari Beberapa Website
Buat daftar URL dari beberapa halaman web.
Gunakan loop for untuk membaca tiap halaman:
urls <- c ("urls <- data.frame(
country = c(" Germany", " Spain", " Italy", " France"),
url = c(
" https: // www.transfermarkt.com/ germany/ kader/ verein/ 3262 / saison_id/ 2023 / plus/ 1 ",
" https: // www.transfermarkt.com/ spain/ kader/ verein/ 3375 / saison_id/ 2023 / plus/ 1 ",
" https: // www.transfermarkt.com/ italy/ kader/ verein/ 3376 / saison_id/ 2023 / plus/ 1 ",
" https: // www.transfermarkt.com/ spain/ kader/ verein/ 3375 / saison_id/ 2023 / plus/ 1 "
)
for (url in urls) {
page <- read_html(url)
table <- page %>% html_node(" table") %>% html_table()
print(table)
}
Gabungkan hasil scraping dari beberapa halaman menjadi satu
tabel.
7. Scraping Data Non-Tabel dengan ChatGPT
Gunakan F12 > Element Inspector untuk melihat
struktur HTML dari data yang diinginkan.
Gunakan html_nodes() untuk mengambil elemen tertentu
seperti judul atau harga:
title <- page %>% html_node (".title-class" ) %>% html_text ()
price <- page %>% html_node (".price-class" ) %>% html_text ()
Simpan data dalam data frame :
data <- data.frame (Title = title, Price = price)
8. Menggunakan Loop untuk Scraping Banyak Halaman
Identifikasi pola URL yang berubah untuk setiap halaman.
Buat daftar URL atau buat fungsi yang menambahkan nomor halaman
ke URL:
base_url <- "" https: // www.transfermarkt.com/ germany/ kader/ verein/ 3262 / saison_id/ 2023 / plus/ 1 ",
" https: // www.transfermarkt.com/ spain/ kader/ verein/ 3375 / saison_id/ 2023 / plus/ 1 ",
" https: // www.transfermarkt.com/ italy/ kader/ verein/ 3376 / saison_id/ 2023 / plus/ 1 ",
" https: // www.transfermarkt.com/ spain/ kader/ verein/ 3375 / saison_id/ 2023 / plus/ 1 "
)"
all_pages <- list ()
for (i in 1 : 5 ) {
url <- paste0 (base_url, i)
page <- read_html (url)
table <- page %>% html_node ("table" ) %>% html_table ()
all_pages[[i]] <- table
}
final_data <- do.call (rbind, all_pages)
Gabungkan hasil scraping dari semua halaman menjadi satu
dataset.
9. Membersihkan Data & Kesalahan ChatGPT
Periksa data hasil scraping.
Jika ada format angka yang salah, gunakan case_when()
di R untuk memperbaikinya.
Gunakan separate() untuk memisahkan informasi dalam
satu kolom menjadi beberapa kolom.
10. Peringatan: Hindari Diblokir saat Scraping
Jangan scraping terlalu banyak halaman dalam waktu singkat.
Gunakan delay antara permintaan dengan
Sys.sleep(2).
Pastikan scraping tidak membebani server website.
Kesimpulan & Sumber
Kesimpulan
Dengan menggunakan rvest di R, kita dapat melakukan web
scraping untuk mendapatkan data dari berbagai website, baik dalam bentuk
tabel maupun non-tabel. Pastikan untuk memahami struktur HTML halaman
dan berhati-hati agar tidak diblokir oleh website yang memiliki proteksi
terhadap scraping.
LS0tDQp0aXRsZTogIlR1Z2FzIERhdGEgU2NyYXBpbmciDQpzdWJ0aXRsZTogIiINCmF1dGhvcjogIk0uIFJhZ2lsIFJpemtpIE11bHlhICg1MjI0MDAyNykiDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogInN0eWxlLmNzcyINCi0tLQ0KDQo8aW1nIGlkPSJsb2dvLXV0YW1hIiBzcmM9IkNvdmVyIFR1Z2FzLmpwZz9yYXc9dHJ1ZSIgYWx0PSJMb2dvIiBzdHlsZT0id2lkdGg6MjAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ij4NCg0KIyAqKkxhbmdrYWgtTGFuZ2thaCBXZWIgU2NyYXBpbmcgZGkgUiBkZW5nYW4gQ2hhdEdQVCoqDQoNCiMjICAqKlR1anVhbiBQZW1iZWxhamFyYW4qKg0KU2V0ZWxhaCBtZW1wZWxhamFyaSBwYW5kdWFuIGluaSwgQW5kYSBha2FuIGRhcGF0Og0KDQotIE1lbWFoYW1pIGtvbnNlcCBkYXNhciB3ZWIgc2NyYXBpbmcgZGFuIGJhZ2FpbWFuYSBtZW5nZ3VuYWthbm55YSBkaSBSLg0KLSBNZW5nZ3VuYWthbiBwYWtldCBgcnZlc3RgIHVudHVrIG1lbmdhbWJpbCBkYXRhIGRhcmkgaGFsYW1hbiB3ZWIuDQotIE1lbmVtdWthbiBlbGVtZW4gSFRNTCB5YW5nIHJlbGV2YW4gZGVuZ2FuICpEZXZlbG9wZXIgVG9vbHMqIGRpIGJyb3dzZXIuDQotIE1lbGFrdWthbiBzY3JhcGluZyB0YWJlbCBzZXJ0YSBkYXRhIG5vbi10YWJlbCBkYXJpIHdlYnNpdGUuDQotIE1lbmdndW5ha2FuIGxvb3AgdW50dWsgbWVuZ290b21hdGlzYXNpIHNjcmFwaW5nIGRhcmkgYmFueWFrIGhhbGFtYW4gd2ViLg0KLSBNZW1iZXJzaWhrYW4gZGFuIG1lbmdvbGFoIGRhdGEgaGFzaWwgc2NyYXBpbmcgZGkgUi4NCi0gTWVuZ2hpbmRhcmkga2VzYWxhaGFuIHVtdW0gZGFuIG1lbmNlZ2FoIHBlbWJsb2tpcmFuIHNhYXQgc2NyYXBpbmcuDQoNCg0KIyMgMS4gUGVuZGFodWx1YW4NCi0gV2ViIHNjcmFwaW5nIGRpZ3VuYWthbiB1bnR1ayBtZW5nYW1iaWwgZGF0YSBkYXJpIHdlYnNpdGUga2V0aWthIGRhdGEgdGlkYWsgdGVyc2VkaWEgZGFsYW0gZm9ybWF0IHJhcGkgc2VwZXJ0aSBDU1YgYXRhdSBFeGNlbC4NCi0gS2l0YSBha2FuIG1lbmdndW5ha2FuIHBha2V0IGBydmVzdGAgdW50dWsgbWVsYWt1a2FuIHNjcmFwaW5nIGRpIFIuDQoNCiMjIDIuIE1ldG9kZSBDZXBhdDogQ29weS1QYXN0ZSBEYXRhIGRhcmkgVGFiZWwNCjEuIEluc3RhbCBwYWtldCBgZGF0YS5wYXN0YWAgZGkgUi4NCjIuIFNhbGluIHRhYmVsIGRhcmkgd2Vic2l0ZS4NCjMuIEd1bmFrYW4gZml0dXIgKnBhc3RlIGFzIGRhdGEgZnJhbWUqIGRhcmkgYGRhdGEucGFzdGFgIGRpIFIuDQoNCiMjIDMuIE1lbXVsYWkgV2ViIFNjcmFwaW5nIGRlbmdhbiBgcnZlc3RgDQoxLiBJbnN0YWwgZGFuIHBhbmdnaWwgcGFrZXQgYHJ2ZXN0YDoNCiAgIGBgYHINCiAgIGluc3RhbGwucGFja2FnZXMoInJ2ZXN0IikNCiAgIGxpYnJhcnkocnZlc3QpDQogICBgYGANCjIuIEd1bmFrYW4gYHJlYWRfaHRtbCgiVVJMIilgIHVudHVrIG1lbWJhY2EgaGFsYW1hbiB3ZWIuDQozLiBHdW5ha2FuIGBodG1sX25vZGUoKWAgdW50dWsgbWVtaWxpaCBlbGVtZW4gc3Blc2lmaWsgc2VwZXJ0aSB0YWJlbC4NCjQuIEd1bmFrYW4gYGh0bWxfdGFibGUoKWAgdW50dWsgbWVuZ29udmVyc2kgdGFiZWwga2UgZm9ybWF0ICpkYXRhIGZyYW1lKi4NCg0KIyMgNC4gTWVuZ2d1bmFrYW4gRGV2ZWxvcGVyIFRvb2xzIChGMTIpIHVudHVrIE1lbmVtdWthbiBFbGVtZW4gSFRNTA0KMS4gVGVrYW4gKipGMTIqKiBkaSBicm93c2VyIHVudHVrIG1lbWJ1a2EgKkRldmVsb3BlciBUb29scyouDQoyLiBCdWthIHRhYiAqKkVsZW1lbnRzKiouDQozLiBHdW5ha2FuICoqRWxlbWVudCBJbnNwZWN0b3IqKiB1bnR1ayBtZW55b3JvdCB0YWJlbCBhdGF1IGVsZW1lbiBIVE1MIGxhaW4uDQo0LiBDYXRhdCBlbGVtZW4geWFuZyBiZXJpc2kgZGF0YSAobWlzYWxueWEgYDx0YWJsZT5gLCBgPGRpdj5gLCBhdGF1IElEIHRlcnRlbnR1KS4NCg0KIyMgNS4gQ29udG9oIFNjcmFwaW5nIFRhYmVsIERhdGEgUiBQYWNrYWdlcw0KMS4gQnVrYSBoYWxhbWFuIHdlYiB5YW5nIGJlcmlzaSB0YWJlbCBkYXRhLg0KMi4gR3VuYWthbiBgcmVhZF9odG1sKClgIHVudHVrIG1lbWJhY2EgaGFsYW1hbiB0ZXJzZWJ1dDoNCiAgIGBgYHINCiAgIHVybCA8LSAiaHR0cHM6Ly9leGFtcGxlLmNvbSINCiAgIHBhZ2UgPC0gcmVhZF9odG1sKHVybCkNCiAgIGBgYA0KMy4gR3VuYWthbiBgaHRtbF9ub2RlKClgIHVudHVrIG1lbWlsaWggdGFiZWw6DQogICBgYGByDQogICB0YWJsZSA8LSBwYWdlICU+JSBodG1sX25vZGUoInRhYmxlIikNCiAgIGBgYA0KNC4gS29udmVyc2kga2UgZm9ybWF0ICpkYXRhIGZyYW1lKjoNCiAgIGBgYHINCiAgIGRhdGEgPC0gdGFibGUgJT4lIGh0bWxfdGFibGUoKQ0KICAgYGBgDQoNCiMjIDYuIFNjcmFwaW5nIERhdGEgZGFyaSBCZWJlcmFwYSBXZWJzaXRlDQoxLiBCdWF0IGRhZnRhciBVUkwgZGFyaSBiZWJlcmFwYSBoYWxhbWFuIHdlYi4NCjIuIEd1bmFrYW4gbG9vcCBgZm9yYCB1bnR1ayBtZW1iYWNhIHRpYXAgaGFsYW1hbjoNCiAgIGBgYHINCiAgIHVybHMgPC0gYygidXJscyA8LSBkYXRhLmZyYW1lKA0KICBjb3VudHJ5ID0gYygiR2VybWFueSIsICJTcGFpbiIsICJJdGFseSIsICJGcmFuY2UiKSwNCiAgdXJsID0gYygNCiAgICAiaHR0cHM6Ly93d3cudHJhbnNmZXJtYXJrdC5jb20vZ2VybWFueS9rYWRlci92ZXJlaW4vMzI2Mi9zYWlzb25faWQvMjAyMy9wbHVzLzEiLA0KICAgICJodHRwczovL3d3dy50cmFuc2Zlcm1hcmt0LmNvbS9zcGFpbi9rYWRlci92ZXJlaW4vMzM3NS9zYWlzb25faWQvMjAyMy9wbHVzLzEiLA0KICAgICJodHRwczovL3d3dy50cmFuc2Zlcm1hcmt0LmNvbS9pdGFseS9rYWRlci92ZXJlaW4vMzM3Ni9zYWlzb25faWQvMjAyMy9wbHVzLzEiLA0KICAgICJodHRwczovL3d3dy50cmFuc2Zlcm1hcmt0LmNvbS9zcGFpbi9rYWRlci92ZXJlaW4vMzM3NS9zYWlzb25faWQvMjAyMy9wbHVzLzEiDQogICkNCg0KICAgZm9yICh1cmwgaW4gdXJscykgew0KICAgICAgIHBhZ2UgPC0gcmVhZF9odG1sKHVybCkNCiAgICAgICB0YWJsZSA8LSBwYWdlICU+JSBodG1sX25vZGUoInRhYmxlIikgJT4lIGh0bWxfdGFibGUoKQ0KICAgICAgIHByaW50KHRhYmxlKQ0KICAgfQ0KICAgYGBgDQozLiBHYWJ1bmdrYW4gaGFzaWwgc2NyYXBpbmcgZGFyaSBiZWJlcmFwYSBoYWxhbWFuIG1lbmphZGkgc2F0dSB0YWJlbC4NCg0KIyMgNy4gU2NyYXBpbmcgRGF0YSBOb24tVGFiZWwgZGVuZ2FuIENoYXRHUFQNCjEuIEd1bmFrYW4gKipGMTIgPiBFbGVtZW50IEluc3BlY3RvcioqIHVudHVrIG1lbGloYXQgc3RydWt0dXIgSFRNTCBkYXJpIGRhdGEgeWFuZyBkaWluZ2lua2FuLg0KMi4gR3VuYWthbiBgaHRtbF9ub2RlcygpYCB1bnR1ayBtZW5nYW1iaWwgZWxlbWVuIHRlcnRlbnR1IHNlcGVydGkganVkdWwgYXRhdSBoYXJnYToNCiAgIA0KICAgYGBgcg0KICAgdGl0bGUgPC0gcGFnZSAlPiUgaHRtbF9ub2RlKCIudGl0bGUtY2xhc3MiKSAlPiUgaHRtbF90ZXh0KCkNCiAgIHByaWNlIDwtIHBhZ2UgJT4lIGh0bWxfbm9kZSgiLnByaWNlLWNsYXNzIikgJT4lIGh0bWxfdGV4dCgpDQogICBgYGANCjMuIFNpbXBhbiBkYXRhIGRhbGFtICpkYXRhIGZyYW1lKjoNCiAgIA0KICAgYGBgcg0KICAgZGF0YSA8LSBkYXRhLmZyYW1lKFRpdGxlID0gdGl0bGUsIFByaWNlID0gcHJpY2UpDQogICBgYGANCg0KIyMgOC4gTWVuZ2d1bmFrYW4gTG9vcCB1bnR1ayBTY3JhcGluZyBCYW55YWsgSGFsYW1hbg0KMS4gSWRlbnRpZmlrYXNpIHBvbGEgVVJMIHlhbmcgYmVydWJhaCB1bnR1ayBzZXRpYXAgaGFsYW1hbi4NCjIuIEJ1YXQgZGFmdGFyIFVSTCBhdGF1IGJ1YXQgZnVuZ3NpIHlhbmcgbWVuYW1iYWhrYW4gbm9tb3IgaGFsYW1hbiBrZSBVUkw6DQogICANCiAgIGBgYHINCiAgIGJhc2VfdXJsIDwtICIiaHR0cHM6Ly93d3cudHJhbnNmZXJtYXJrdC5jb20vZ2VybWFueS9rYWRlci92ZXJlaW4vMzI2Mi9zYWlzb25faWQvMjAyMy9wbHVzLzEiLA0KICAgICJodHRwczovL3d3dy50cmFuc2Zlcm1hcmt0LmNvbS9zcGFpbi9rYWRlci92ZXJlaW4vMzM3NS9zYWlzb25faWQvMjAyMy9wbHVzLzEiLA0KICAgICJodHRwczovL3d3dy50cmFuc2Zlcm1hcmt0LmNvbS9pdGFseS9rYWRlci92ZXJlaW4vMzM3Ni9zYWlzb25faWQvMjAyMy9wbHVzLzEiLA0KICAgICJodHRwczovL3d3dy50cmFuc2Zlcm1hcmt0LmNvbS9zcGFpbi9rYWRlci92ZXJlaW4vMzM3NS9zYWlzb25faWQvMjAyMy9wbHVzLzEiDQogICkiDQogICBhbGxfcGFnZXMgPC0gbGlzdCgpDQoNCiAgIGZvciAoaSBpbiAxOjUpIHsNCiAgICAgICB1cmwgPC0gcGFzdGUwKGJhc2VfdXJsLCBpKQ0KICAgICAgIHBhZ2UgPC0gcmVhZF9odG1sKHVybCkNCiAgICAgICB0YWJsZSA8LSBwYWdlICU+JSBodG1sX25vZGUoInRhYmxlIikgJT4lIGh0bWxfdGFibGUoKQ0KICAgICAgIGFsbF9wYWdlc1tbaV1dIDwtIHRhYmxlDQogICB9DQoNCiAgIGZpbmFsX2RhdGEgPC0gZG8uY2FsbChyYmluZCwgYWxsX3BhZ2VzKQ0KICAgYGBgDQozLiBHYWJ1bmdrYW4gaGFzaWwgc2NyYXBpbmcgZGFyaSBzZW11YSBoYWxhbWFuIG1lbmphZGkgc2F0dSBkYXRhc2V0Lg0KDQojIyA5LiBNZW1iZXJzaWhrYW4gRGF0YSAmIEtlc2FsYWhhbiBDaGF0R1BUDQoxLiBQZXJpa3NhIGRhdGEgaGFzaWwgc2NyYXBpbmcuDQoyLiBKaWthIGFkYSBmb3JtYXQgYW5na2EgeWFuZyBzYWxhaCwgZ3VuYWthbiBgY2FzZV93aGVuKClgIGRpIFIgdW50dWsgbWVtcGVyYmFpa2lueWEuDQozLiBHdW5ha2FuIGBzZXBhcmF0ZSgpYCB1bnR1ayBtZW1pc2Foa2FuIGluZm9ybWFzaSBkYWxhbSBzYXR1IGtvbG9tIG1lbmphZGkgYmViZXJhcGEga29sb20uDQoNCiMjIDEwLiBQZXJpbmdhdGFuOiBIaW5kYXJpIERpYmxva2lyIHNhYXQgU2NyYXBpbmcNCi0gSmFuZ2FuIHNjcmFwaW5nIHRlcmxhbHUgYmFueWFrIGhhbGFtYW4gZGFsYW0gd2FrdHUgc2luZ2thdC4NCi0gR3VuYWthbiAqKmRlbGF5IGFudGFyYSBwZXJtaW50YWFuKiogZGVuZ2FuIGBTeXMuc2xlZXAoMilgLg0KLSBQYXN0aWthbiBzY3JhcGluZyB0aWRhayBtZW1iZWJhbmkgc2VydmVyIHdlYnNpdGUuDQoNCi0tLQ0KDQojICoqS2VzaW1wdWxhbiAmIFN1bWJlciAqKg0KDQojIyAqKktlc2ltcHVsYW4qKg0KDQpEZW5nYW4gbWVuZ2d1bmFrYW4gYHJ2ZXN0YCBkaSBSLCBraXRhIGRhcGF0IG1lbGFrdWthbiB3ZWIgc2NyYXBpbmcgdW50dWsgbWVuZGFwYXRrYW4gZGF0YSBkYXJpIGJlcmJhZ2FpIHdlYnNpdGUsIGJhaWsgZGFsYW0gYmVudHVrIHRhYmVsIG1hdXB1biBub24tdGFiZWwuIFBhc3Rpa2FuIHVudHVrIG1lbWFoYW1pIHN0cnVrdHVyIEhUTUwgaGFsYW1hbiBkYW4gYmVyaGF0aS1oYXRpIGFnYXIgdGlkYWsgZGlibG9raXIgb2xlaCB3ZWJzaXRlIHlhbmcgbWVtaWxpa2kgcHJvdGVrc2kgdGVyaGFkYXAgc2NyYXBpbmcuDQoNCiMjICoqU3VtYmVyKioNCi0gaHR0cHM6Ly9ib29rZG93bi5vcmcvZHNjaWVuY2VsYWJzL2RhdGFfc2NpZW5jZV9wcm9ncmFtbWluZy8wNC1EYXRhX0NvbGxlY3Rpb24uaHRtbA0KLSBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PU1IZE1GeFV5R2RrDQoNCg0KYGANCg0KDQoNCg==