Tugas Data Scraping

Logo

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

  1. Instal paket data.pasta di R.
  2. Salin tabel dari website.
  3. Gunakan fitur paste as data frame dari data.pasta di R.

3. Memulai Web Scraping dengan rvest

  1. Instal dan panggil paket rvest:

    install.packages("rvest")
    library(rvest)
  2. Gunakan read_html("URL") untuk membaca halaman web.

  3. Gunakan html_node() untuk memilih elemen spesifik seperti tabel.

  4. Gunakan html_table() untuk mengonversi tabel ke format data frame.

4. Menggunakan Developer Tools (F12) untuk Menemukan Elemen HTML

  1. Tekan F12 di browser untuk membuka Developer Tools.
  2. Buka tab Elements.
  3. Gunakan Element Inspector untuk menyorot tabel atau elemen HTML lain.
  4. Catat elemen yang berisi data (misalnya <table>, <div>, atau ID tertentu).

5. Contoh Scraping Tabel Data R Packages

  1. Buka halaman web yang berisi tabel data.

  2. Gunakan read_html() untuk membaca halaman tersebut:

    url <- "https://example.com"
    page <- read_html(url)
  3. Gunakan html_node() untuk memilih tabel:

    table <- page %>% html_node("table")
  4. Konversi ke format data frame:

    data <- table %>% html_table()

6. Scraping Data dari Beberapa Website

  1. Buat daftar URL dari beberapa halaman web.

  2. 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)
    }
  3. Gabungkan hasil scraping dari beberapa halaman menjadi satu tabel.

7. Scraping Data Non-Tabel dengan ChatGPT

  1. Gunakan F12 > Element Inspector untuk melihat struktur HTML dari data yang diinginkan.

  2. 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()
  3. Simpan data dalam data frame:

    data <- data.frame(Title = title, Price = price)

8. Menggunakan Loop untuk Scraping Banyak Halaman

  1. Identifikasi pola URL yang berubah untuk setiap halaman.

  2. 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)
  3. Gabungkan hasil scraping dari semua halaman menjadi satu dataset.

9. Membersihkan Data & Kesalahan ChatGPT

  1. Periksa data hasil scraping.
  2. Jika ada format angka yang salah, gunakan case_when() di R untuk memperbaikinya.
  3. 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==