Pemrograman Sains Data
March 14, 2025
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, danRSelenium. - 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:
## 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.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.6 Menggunakan RSelenium
Untuk situs web yang menggunakan JavaScript, kita perlu menggunakan RSelenium. Berikut contohnya:
## 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.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.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.