Web Scraping

Pengikisan Data Web dengan R

Pengikisan web adalah proses pengambilan data dari situs web. Dalam R, pengikisan web dapat dilakukan dengan menggunakan paket-paket populer seperti rvest, httr, dan RSelenium. Alat-alat ini memungkinkan pengguna untuk mengumpulkan, memproses,dan menganalisis data web secara efisien.

Alasan penggunaan R untuk Web Scraping

R menjadi pilihan utama untuk web scraping karena kemudahannya dalam menguraikan HTML dengan paket rvest, kemampuannya yang kuat dalam manipulasi serta analisis data, dan kemampuannya mengotomatiskan proses pengikisan untuk pengumpulan data dalam skala besar.

Metode Pengikisan Web di R

Sebelum menerapkan berbagai metode, pastikan perangkat lunak yang diperlukan sudah terpasang, termasuk R dan RStudio, paket rvest untuk scraping data, paket tidyverse untuk manipulasi data, serta ChatGPT sebagai bantuan dalam proses ekstraksi data.

Instalasi dan Persiapan

Sebelum memulai, pastikan R dan RStudio sudah terinstal. Kemudian, instal paket yang dibutuhkan:

install.packages("rvest")
install.packages("httr")
install.packages("xml2")
install.packages("dplyr")

Menyalin Tabel Web Secara Manual di R

Jika sebuah situs web memiliki tabel yang sudah terstruktur dengan baik, data dapat diambil secara langsung dengan langkah-langkah berikut:

1. Pilih seluruh sel dalam tabel menggunakan mouse.
2. Tekan Ctrl + C atau klik kanan dan pilih Copy.
3. Gunakan paket datapasta di R untuk menempelkan data sebagai data frame.

Metode ini adalah cara tercepat untuk mengambil tabel sederhana tanpa perlu memahami struktur HTML.

Pengikisan Data Web Dasar dengan Paket rvest

Untuk scraping data yang lebih kompleks, kita dapat memanfaatkan paket rvest di R. Berikut langkah-langkahnya:

1. Membaca halaman web menggunakan read_html():

library(rvest)  # Memuat paket rvest untuk scraping
page <- read_html("https://example.com")  # Mengambil halaman web

2. Menganalisis struktur HTML dengan fitur Inspect Element di browser untuk mengidentifikasi elemen yang ingin diekstrak.

3. Mengambil tabel dari halaman web:

table <- page %>%  
  html_node("table") %>%  # Menemukan elemen tabel pertama dalam HTML  
  html_table()  # Mengonversi elemen tabel menjadi data frame  

4. Membersihkan data dengan menghapus nilai kosong dan memberi nama kolom yang sesuai:

table <- na.omit(table)  # Menghapus baris dengan nilai NA  
colnames(table) <- c("Kolom1", "Kolom2", "Kolom3")  # Mengganti nama kolom sesuai kebutuhan  

Metode ini memungkinkan kita untuk mengambil data dari situs web dengan lebih fleksibel dan terstruktur.

library(httr)
response <- GET("https://example.com")  # Mengirimkan permintaan GET ke URL
content <- content(response, as = "text")  # Mengambil konten halaman dalam bentuk teks
print(content)  # Menampilkan isi halaman web yang telah diambil

Scraping Data Tabel

Jika ingin mengambil tabel dari website, gunakan:

# Mengambil semua tabel yang ada di dalam halaman dan mengubahnya menjadi data frame
table <- page %>% html_nodes("table") %>% html_table()
print(table)  # Menampilkan isi tabel

Scraping dengan Loop

Untuk mengambil data dari beberapa halaman:

base_url <- "https://example.com/page="
data_list <- list()
for (i in 1:5) {
  url <- paste0(base_url, i)
  page <- read_html(url)
  data <- page %>% html_nodes("p") %>% html_text()
  data_list[[i]] <- data
}

Menyimpan Data ke CSV

write.csv(data_list, "data_scraped.csv", row.names = FALSE)

Pengikisan Data dari Beberapa Halaman Web

Dalam banyak kasus, data yang dibutuhkan tersebar di berbagai halaman web. Contoh berikut menunjukkan cara mengumpulkan data pemain dari empat situs yang berbeda menggunakan langkah-langkah berikut:

1. Identifikasi elemen tabel di setiap halaman menggunakan Inspect Element di browser.
2. Buat daftar URL dan ID elemen HTML yang sesuai dengan halaman yang akan di-scrape.
3. Gunakan loop untuk mengambil dan menggabungkan data dari beberapa halaman.
4. Bersihkan data dengan menghapus kolom yang tidak diperlukan serta menambahkan informasi negara.

Contoh Implementasi

Mengumpulkan Data Pemain dari Beberapa Halaman Web
# Membuat data frame berisi URL dan ID elemen HTML untuk setiap tim nasional
tim_nasional <- data.frame(
  negara = c("Belanda", "Jepang", "Amerika", "Israel"),  # Nama negara
  url_tim = c(
    "https://www.transfermarkt.com/netherlands/kader/verein/3262/saison_id/2023/plus/1",
    "https://www.transfermarkt.com/japan/kader/verein/3375/saison_id/2023/plus/1",
    "https://www.transfermarkt.com/usa/kader/verein/3376/saison_id/2023/plus/1",
    "https://www.transfermarkt.com/israel/kader/verein/3374/saison_id/2023/plus/1"
  ),
  id_html = c("tabel_belanda", "tabel_jepang", "tabel_amerika", "tabel_israel")  # ID elemen tabel di HTML
)

# Menampilkan daftar URL yang akan di-scrape
print(tim_nasional)

Contoh Pengikisan Data dari Halaman Web Lain

Misalkan kita ingin mengambil daftar paket R dari situs CRAN.

# Memuat pustaka yang dibutuhkan
library(rvest)  

# URL sumber data
url <- "https://cran.r-project.org/web/packages/available_packages_by_name.html"

# Membaca halaman HTML
page <- read_html(url)  # Mengambil konten halaman web

# Menemukan elemen tabel dalam HTML
table_node <- page %>% html_node("table")  # Menemukan elemen tabel pertama

# Mengonversi tabel menjadi data frame
package_table <- table_node %>% html_table(fill = TRUE)  

# Menampilkan hasil pertama dari tabel
head(package_table)  # Menampilkan 6 baris pertama

Kode di atas mengambil daftar paket R dari halaman resmi CRAN, lalu mengonversinya menjadi data frame yang dapat digunakan untuk analisis lebih lanjut.

Pengikisan Data Non-Tabular dengan Bantuan ChatGPT

Dalam beberapa kasus, data yang ingin dikumpulkan tidak berbentuk tabel, tetapi tersebar dalam berbagai elemen HTML. Untuk mengatasi masalah ini, ikuti langkah-langkah berikut:

1. Gunakan Inspect Element: untuk mengidentifikasi elemen HTML yang berisi data yang dibutuhkan.
2. Salin struktur HTML tersebut ke ChatGPT: untuk mendapatkan analisis dan kode scraping yang sesuai.
3. Gunakan fungsi scraping: untuk mengekstrak teks dari elemen yang relevan.

Mengambil Data Non-Tabular dari Beberapa Halaman Web

# Memuat pustaka yang diperlukan
library(rvest)

# URL dasar yang memiliki beberapa halaman data
base_url <- "https://example.com/discovery?page="  

# Inisialisasi list untuk menyimpan data dari tiap halaman
data_list <- list()  

# Loop untuk mengambil data dari 5 halaman pertama
for (i in 1:5) {
  # Mengakses halaman web dengan nomor halaman yang berbeda
  halaman <- read_html(paste0(base_url, i))  

  # Mengambil teks dari elemen dengan kelas "community-name"
  nama_komunitas <- halaman %>% html_nodes(".community-name") %>% html_text()  

  # Mengambil teks dari elemen dengan kelas "member-count"
  jumlah_anggota <- halaman %>% html_nodes(".member-count") %>% html_text()  

  # Menyimpan data dalam data frame
  data_list[[i]] <- data.frame(Nama = nama_komunitas, Anggota = jumlah_anggota)  
}

# Menggabungkan semua data menjadi satu data frame
data_akhir <- do.call(rbind, data_list)  

# Menampilkan hasil akhir
print(data_akhir)

Terkadang, informasi tersebar di beberapa halaman web. Kita bisa menggunakan loop untuk mengakses dan menggabungkan data dari banyak URL.

Contoh Pengikisan Data dari Beberapa Halaman

# Memuat pustaka yang diperlukan
library(rvest)
library(dplyr)  # Untuk manipulasi data

# Daftar URL yang akan di-scrape
daftar_url <- c("https://www.topendsports.com/events/summer/medal-tally/all-time-all.htm#google_vignette")

# Inisialisasi list untuk menyimpan data dari tiap halaman
semua_data <- list()

# Loop untuk mengambil data dari setiap URL dalam daftar
for (i in seq_along(daftar_url)) {
  # Membaca halaman web
  halaman <- read_html(daftar_url[i])

  # Mencari elemen tabel dalam halaman
  elemen_tabel <- halaman %>% html_node("table")

  # Jika tabel ditemukan, ekstrak data dan simpan dalam list
  if (!is.null(elemen_tabel)) {
    semua_data[[i]] <- elemen_tabel %>% html_table(fill = TRUE)
  }
}

# Menggabungkan semua data menjadi satu data frame
data_final <- bind_rows(semua_data)  

# Menampilkan hasil akhir
print(data_final)

Penanganan Tantangan dalam Web Scraping

Dalam proses web scraping, sering kali muncul berbagai kendala yang dapat menghambat pengambilan data. Berikut adalah beberapa tantangan umum beserta solusinya:

1. Halaman Tidak Ditemukan (404 Error)

Kesalahan ini biasanya terjadi ketika URL yang digunakan tidak valid atau halaman telah dihapus. Pastikan untuk:

  • Memeriksa kembali URL dengan membukanya langsung di browser.
  • Menggunakan mekanisme pengecekan kesalahan dalam kode untuk menangani kasus ketika halaman tidak dapat diakses.

2. Data Tidak Ditemukan di Halaman Web

Terkadang elemen yang dicari, seperti tabel, tidak muncul seperti yang diharapkan. Solusi yang dapat diterapkan:

  • Gunakan html_nodes("table") untuk melihat daftar tabel yang tersedia di halaman.
  • Coba variasi selector HTML yang lebih spesifik jika elemen tidak ditemukan.

3. Situs Web Memblokir Scraping

Beberapa situs memiliki perlindungan untuk mendeteksi dan memblokir aktivitas scraping yang dianggap tidak wajar. Cara mengatasinya:

  • Tambahkan jeda waktu antar permintaan menggunakan Sys.sleep() untuk menghindari deteksi otomatis.
  • Batasi jumlah permintaan dalam periode tertentu agar tidak terdeteksi sebagai bot.
# Menambahkan jeda waktu untuk menghindari deteksi scraping
Sys.sleep(2)

4. Struktur HTML yang Kompleks

Pada beberapa situs, struktur HTML yang tidak terorganisir dengan baik bisa menyulitkan proses pengambilan data. Solusinya:

  • Gunakan fitur Inspect Element pada browser untuk memahami elemen HTML yang menyimpan data.
  • Jika masih sulit, salin struktur HTML dan gunakan ChatGPT untuk membantu menganalisis serta menyesuaikan kode scraping.

Dengan memahami tantangan ini dan menerapkan solusi yang tepat, proses web scraping dapat dilakukan dengan lebih efisien dan minim hambatan.

Kesimpulan

Web scraping dengan R, terutama menggunakan rvest, mempermudah pengambilan data dari situs web. Data tabel lebih mudah diekstrak, sedangkan data non-tabular memerlukan pemahaman struktur HTML. ChatGPT dapat membantu mempercepat penulisan kode, tetapi etika dan kebijakan situs tetap harus diperhatikan. Dengan teknik ini, pengumpulan dan analisis data dapat dilakukan lebih efisien.

Referensi

1. The Data Digest. (2024, September). Web scraping in R with ChatGPT (4 Examples) no HTML … [https://youtu.be/MHdMFxUyGdk]. YouTube.