Bab 1 Data Collection

1.1 Pengertian Web Scraping

Web scraping adalah teknik otomatisasi penting yang digunakan untuk mengumpulkan data dari situs web. Metode ini membantu dalam ekstraksi informasi yang ditempatkan pada halaman web, kemudian mengubahnya ke dalam format yang lebih mudah dianalisis seperti spreadsheet atau database. Berbagai industri menggunakan web scraping untuk membantu dalam proses pengambilan keputusan berbasis data. Melalui proses scraping data relevan dari sumber luar, seseorang bisa meningkatkan konten situs atau bahkan memperkaya wawasan bisnis.

1.2 Tujuan

  • Memahami konsep dan teknik web scraping.
  • Mempelajari penggunaan paket-paket R seperti rvest, httr, dan RSelenium.
  • Menerapkan web scraping pada studi kasus nyata.
  • Mengidentifikasi tantangan dalam web scraping dan solusi untuk mengatasinya.

1.3 Paket yang Digunakan

  • rvest: Untuk parsing HTML dan ekstraksi data.
  • httr: Untuk mengirim permintaan HTTP.
  • RSelenium: Untuk scraping situs web yang menggunakan JavaScript.

1.4 Metode Web Scraping dengan R

1.4.1 Menggunakan rvest

Paket rvest adalah alat yang paling umum digunakan untuk scraping halaman web statis. Berikut adalah contoh penggunaannya:

# Load library
library(rvest)
## Warning: package 'rvest' was built under R version 4.4.3
# URL target
url <- "https://example.com"

# Gunakan tryCatch untuk menangani kemungkinan error
tryCatch({
  # Baca halaman web
  webpage <- read_html(url)
  
  # Ekstrak judul halaman
  titles <- webpage %>% html_elements("h1") %>% html_text(trim = TRUE)
  
  # Cek apakah ada judul yang ditemukan
  if (length(titles) > 0) {
    print("Judul Halaman:")
    print(titles)
  } else {
    print("Tidak ada elemen <h1> yang ditemukan.")
  }
}, error = function(e) {
  print("Terjadi error saat membaca halaman web:")
  print(e$message)
})
## [1] "Terjadi error saat membaca halaman web:"
## [1] "Timeout was reached: [example.com] SSL/TLS connection timeout"

1.4.2 Penjelasan Kode

  • read_html(url): Membaca konten HTML dari URL yang diberikan.
  • html_nodes("h1"): Memilih semua elemen <h1> dari dokumen HTML.
  • html_text(): Mengekstrak teks dari elemen yang telah dipilih.

1.4.3 Contoh Penggunaan

Misalnya, kita ingin mengambil semua judul artikel dari sebuah blog:

# Load library
library(rvest)

# URL blog (ganti dengan URL blog yang valid)
url <- "https://example-blog.com"

# Gunakan tryCatch untuk menangani kemungkinan error
tryCatch({
  # Baca halaman web
  webpage <- read_html(url)
  
  # Ekstrak judul artikel (misalnya, judul berada dalam tag <h2> dengan class "entry-title")
  titles <- webpage %>% html_elements("h2.entry-title") %>% html_text(trim = TRUE)
  
  # Cek apakah ada judul yang ditemukan
  if (length(titles) > 0) {
    print("Judul Artikel:")
    print(titles)
  } else {
    print("Tidak ada judul artikel yang ditemukan.")
  }
}, error = function(e) {
  print("Terjadi error saat membaca halaman web:")
  print(e$message)
})
## [1] "Tidak ada judul artikel yang ditemukan."

1.4.4 Kelebihan dan Kekurangan

Kelebihan: - Mudah digunakan untuk halaman web statis. - Integrasi yang baik dengan paket tidyverse untuk analisis data.

Kekurangan: - Tidak dapat menangani halaman web yang menggunakan JavaScript. - Rentan terhadap perubahan struktur HTML.

1.5 Menggunakan httr

Paket httr digunakan untuk mengirim permintaan HTTP ke server dan mengambil respons. Berikut contohnya:

# Load library
library(httr)

# URL target
url <- "https://example.com"

# Gunakan tryCatch untuk menangani kemungkinan error
tryCatch({
  # Kirim permintaan GET
  response <- GET(url)
  
  # Periksa status kode HTTP
  if (http_status(response)$category == "Success") {
    # Ambil konten HTML
    content <- content(response, "text", encoding = "UTF-8")
    
    # Tampilkan sebagian konten agar tidak terlalu panjang
    print(substr(content, 1, 500)) # Menampilkan 500 karakter pertama
  } else {
    print(paste("Gagal mengakses halaman. Status HTTP:", http_status(response)$reason))
  }
}, error = function(e) {
  print("Terjadi error saat mengakses halaman web:")
  print(e$message)
})
## [1] "<!doctype html>\n<html>\n<head>\n    <title>Example Domain</title>\n\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <style type=\"text/css\">\n    body {\n        background-color: #f0f0f2;\n        margin: 0;\n        padding: 0;\n        font-family: -apple-system, system-ui, BlinkMacSystemFont, \"Segoe UI\", \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n    "

1.5.1 Penjelasan Kode

  • GET(url): Mengirim permintaan HTTP GET ke URL.
  • content(response, "text"): Mengambil konten HTML dari respons.

1.5.2 Contoh Penggunaan

Misalnya, kita ingin mengambil data JSON dari sebuah API:

# Contoh mengambil data JSON
url <- "https://jsonplaceholder.typicode.com/posts/1"
response <- GET(url)
data <- content(response, "parsed")
print(data)
## $userId
## [1] 1
## 
## $id
## [1] 1
## 
## $title
## [1] "sunt aut facere repellat provident occaecati excepturi optio reprehenderit"
## 
## $body
## [1] "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"

1.5.3 Kelebihan dan Kekurangan

Kelebihan: - Fleksibel untuk berbagai jenis permintaan HTTP. - Dapat menangani autentikasi dan cookies.

Kekurangan: - Tidak memiliki fungsi parsing HTML bawaan (perlu digabung dengan rvest). - Lebih kompleks untuk pemula.

1.6 Menggunakan RSelenium

Untuk situs web yang menggunakan JavaScript, kita perlu menggunakan RSelenium. Berikut contohnya:

# Load library
library(RSelenium)
## Warning: package 'RSelenium' was built under R version 4.4.3
tryCatch({
  # Mulai Selenium server
  driver <- rsDriver(browser = "chrome")
  remDr <- driver[["client"]]

  # Buka URL
  remDr$navigate("https://example.com")

  # Ambil sumber halaman
  page_source <- remDr$getPageSource()[[1]]
  print(page_source)

  # Tutup browser
  remDr$close()
}, error = function(e) {
  print("Terjadi error saat menjalankan RSelenium:")
  print(e$message)
})
## [1] "Terjadi error saat menjalankan RSelenium:"
## [1] "PATH to JAVA not found. Please check JAVA is installed."

1.6.1 Penjelasan Kode

  • rsDriver(browser = "chrome"): Membuka browser Chrome.
  • navigate(url): Membuka URL di browser.
  • getPageSource(): Mengambil sumber HTML halaman.

1.6.2 Contoh Penggunaan

Misalnya, kita ingin mengambil data dari situs e-commerce yang menggunakan JavaScript:

# Load library
library(RSelenium)
library(rvest)

tryCatch({
  # Mulai Selenium server
  driver <- rsDriver(browser = "chrome")
  remDr <- driver[["client"]]

  # Buka URL
  remDr$navigate("https://example-ecommerce.com")

  # Ambil sumber halaman
  page_source <- remDr$getPageSource()[[1]]

  # Parsing HTML dengan rvest
  soup <- read_html(page_source)
  product_names <- soup %>% html_nodes(".product-name") %>% html_text()
  print(product_names)

  # Tutup browser
  remDr$close()
}, error = function(e) {
  print("Terjadi error saat menjalankan RSelenium:")
  print(e$message)
})
## [1] "Terjadi error saat menjalankan RSelenium:"
## [1] "PATH to JAVA not found. Please check JAVA is installed."

1.6.3 Kelebihan dan Kekurangan

Kelebihan: - Dapat menangani halaman web dinamis. - Fleksibel untuk interaksi kompleks.

Kekurangan: - Membutuhkan setup yang lebih rumit (browser driver). - Lebih lambat dibandingkan metode lain.

1.7 Studi Kasus Serupa

1.7.1 Scraping Data Cuaca

Kita dapat menggunakan web scraping untuk mengambil data cuaca dari situs web tertentu. Misalnya, mengambil suhu harian dari situs cuaca:

# Load library
library(rvest)

# URL situs cuaca (ganti dengan URL yang valid)
url <- "https://example-weather.com"

tryCatch({
  # Baca halaman web
  webpage <- read_html(url)

  # Ekstrak suhu (sesuaikan selector CSS dengan struktur HTML situs cuaca)
  temperatures <- webpage %>% html_nodes(".temperature") %>% html_text()

  # Tampilkan suhu
  print("Suhu Harian:")
  print(temperatures)
}, error = function(e) {
  print("Terjadi error saat mengambil data cuaca:")
  print(e$message)
})
## [1] "Terjadi error saat mengambil data cuaca:"
## [1] "Could not resolve host: example-weather.com"

1.7.2 Scraping Data Produk E-commerce

Contoh lain adalah mengambil data produk (nama, harga, rating) dari situs e-commerce:

# Load library
library(rvest)

# URL situs e-commerce (ganti dengan URL yang valid)
url <- "https://example-ecommerce.com"

tryCatch({
  # Baca halaman web
  webpage <- read_html(url)

  # Ekstrak nama produk (misalnya, nama produk berada dalam tag <h2> dengan class "product-name")
  product_names <- webpage %>% html_nodes("h2.product-name") %>% html_text()

  # Ekstrak harga produk (misalnya, harga produk berada dalam tag <span> dengan class "price")
  product_prices <- webpage %>% html_nodes("span.price") %>% html_text()

  # Ekstrak rating produk (misalnya, rating produk berada dalam tag <div> dengan class "rating")
  product_ratings <- webpage %>% html_nodes("div.rating") %>% html_text()

  # Gabungkan data ke dalam data frame
  products <- data.frame(
    Nama = product_names,
    Harga = product_prices,
    Rating = product_ratings
  )

  # Tampilkan data produk
  print("Data Produk:")
  print(products)
}, error = function(e) {
  print("Terjadi error saat mengambil data produk:")
  print(e$message)
})
## [1] "Terjadi error saat mengambil data produk:"
## [1] "SSL peer certificate or SSH remote key was not OK: [example-ecommerce.com] schannel: SNI or certificate check failed: SEC_E_WRONG_PRINCIPAL (0x80090322) - The target principal name is incorrect."

1.8 Tantangan dan Solusi

1.8.1 Tantangan dalam Web Scraping

  • Pemblokiran IP: Situs web dapat memblokir IP jika terlalu banyak permintaan.
  • Struktur HTML yang Berubah: Struktur HTML situs web dapat berubah sewaktu-waktu.
  • JavaScript Rendering: Beberapa situs web menggunakan JavaScript untuk memuat data.

1.8.2 Solusi

  • Rate Limiting: Mengatur jeda waktu antara permintaan.
  • Pemantauan Rutin: Memeriksa struktur HTML secara berkala.
  • Menggunakan RSelenium: Untuk scraping situs web yang menggunakan JavaScript.

1.9 Kesimpulan

Web scraping adalah teknik yang sangat berguna untuk mengumpulkan data dari situs web. Dengan menggunakan R dan paket-paket seperti rvest, httr, dan RSelenium, kita dapat mengekstrak data dengan efisien. Setiap metode memiliki kelebihan dan kekurangan tersendiri. Dengan memahami teknik dan tantangan ini, kita dapat memanfaatkan web scraping untuk berbagai keperluan analisis data.