Pada kesempatan kali ini saya akan membagikan sedikit tips untuk melakukan scraping dari sosial media Youtube. Teknik ini saya lakukan karena untuk kepentingan edukasi semata.

Insert Library

Untuk memulai proses scraping data dari yotube, ada 3 package yang kita butuhkan yakni

library(RSelenium)
library(tidyverse)
library(rvest)

setelah berhasil memanggil seluruh package yang dibutuhkan, selanjutnya kita harus membuat wadah untuk dijadikan tempat seluruh data yang akan kita scrap kedepannya

dataset_final = NULL

Set keyword

langkah selanjutnya kita akan membuat keyword yang digunakan, disini saya akan menggunakan keyword “bansos jakarta”

keyword = "bansos Jakarta"

Setelah seluruh persiapan diatas selesai, kita akan memasuki tahap awal menggunakan Selenium

Open Selenium

driver = rsDriver(port = 2903L, 
                  browser = "firefox")
demDr = driver$client

lalu kita akan mengarahkan web driver tersebut menuju link youtube

demDr$navigate("https://www.youtube.com/")

code dibawah ini berguna agar keyword yang kita masukan di awal tadi dapat di search secara otomatis oleh bot di selenium

key = demDr$findElement(using = "name",
                        value = "search_query")
key$sendKeysToElement(list(keyword))

Sys.sleep(3)
demDr$findElement(using = "id",
                  value = "search-icon-legacy")$clickElement()

Automatic Filter

setelah keyword berhasil di search, selanjutnya kita akan memfilter vidio yang akan kita inginkan. Disini saya menggunakan filter berdasarkan jumlah tayangan dan hanya vidio bulan ini saja yang ingin saya ambil

demDr$findElement(using = "xpath",
                  value = "//yt-formatted-string[contains(text(),'Filter')]")$clickElement()
Sys.sleep(3)
demDr$findElement(using = "xpath",
                  value = "//yt-formatted-string[contains(text(),'Jumlah tayangan')]")$clickElement()
Sys.sleep(3)
demDr$findElement(using = "xpath",
                  value = "//yt-formatted-string[contains(text(),'Filter')]")$clickElement()
Sys.sleep(3)
demDr$findElement(using = "xpath",
                  value = "//yt-formatted-string[contains(text(),'Bulan ini')]")$clickElement()

Automatic click

Setelah seluruh step diatas selesai dijalan kan, kita akan memprogram selenium agar dapat melakukan click pada tiap sub komentar secara otomatis

dat = NULL
dat_pola = NULL

for(i in seq(nrow(pola))) {
  
  tryCatch({
    
    h <-  demDr$findElement(
      "xpath",
      as.character(interaction(
        pola[i,], sep = "")
      )
    )$getElementText() %>% unlist()
    
    dat = data.frame(coment_ke = i,
                     jumlah_balasan = h,
                     xpath = as.character(interaction(
                       pola[i,], sep = "")
                     ))
    
    dat_pola = rbind(dat_pola, dat)
    h = NULL
    
  }, message = function(m) {},
  error = function(e) {})
}

Sys.sleep(3)
#Click tiap balasan di komentar
for(i in seq(nrow(dat_pola))) {
demDr$findElement("xpath",
                  dat_pola$xpath[i])$clickElement()
  Sys.sleep(1)}

Scraping content

Step dibawah ini adalah step untuk proses scraping data yang ada di youtube secara keseluruhan

#mengubah html menjadi format yang bisa digunakan
signals2 <- read_html(demDr$getPageSource()[[1]])
Sys.sleep(2)

#mengambil nama orang yang coment
signals2 %>%
  html_nodes("#author-text .ytd-comment-renderer") %>%
  html_text(trim = T) -> nama

#mengambil isi text
Sys.sleep(1)
signals2 %>%
  html_nodes("#expander #content , #content-text") %>%
  html_text(trim = T) -> text

text[-seq(1,length(text),2)] -> text

#mengambil tanggal coment
Sys.sleep(1)
signals2 %>%
  html_nodes("#header-author .yt-formatted-string") %>%
  html_text(trim = T) -> dated

#mengambil text utama
Sys.sleep(1)
signals2 %>%
  html_nodes("#comment #content , #comment #content-text") %>%
  html_text(trim = T) -> text_utama

text_utama[-seq(1,length(text_utama),2)] -> text_utama

#mengambil nama utama
Sys.sleep(1)
signals2 %>%
  html_nodes("#comment #author-text .ytd-comment-renderer") %>%
  html_text(trim = T) -> nama_utama

dataset <- data.frame(nama, text, dated)
dataset$source1 = paste0(dataset$nama,dataset$text)

setelah berhasil mengambil seluruh konten yang ingin kita analisis, kita juga harus melakukan cleansing dan merapikan data data kita. code dibawah berguna untuk merapikan dataset akhir kita

left_join(dataset, 
          data.frame(source1 = paste0(nama_utama, text_utama),
                     coment_ke = seq(length(nama_utama))),
          by = "source1") %>% 
  dplyr::select(-source1) %>% 
  fill(coment_ke, .direction = "down") -> dataset

Design variable for SNA

disini saya mendesain data yang diambil agar dapat digunakan untuk proses social network analysis (SNA), maka data yang diperlukan juga harus di modifikasi agar dapat digunakan proses SNA, langkah yang diperlukan adalah sebagai berikut

names = unique(nama)
names = gsub("[\\{}]", "", names)
lll = NULL
ck = NULL
for(i in seq(nrow(dataset))) {
  for(a in seq(length(names))) {
    
    bn <- print(str_extract(dataset$text[i], names[a]))
    ck = rbind(ck,bn)
  }
  ck[is.na(ck) == TRUE] <- ""
  llj = data.frame(nama = names(sort(table(ck), decreasing = F)[1]))
  lll = rbind(lll, llj)
  ck=NULL
  
}

dataset$target = lll$nama
dataset$no = seq(nrow(dataset))

pengambilan link vidio

demDr$findElement("xpath",
                  "/html[1]/body[1]/ytd-app[1]/div[1]/ytd-page-manager[1]/ytd-watch-flexy[1]/div[5]/div[1]/div[1]/div[7]/div[2]/ytd-video-secondary-info-renderer[1]/div[1]/div[1]/ytd-video-owner-renderer[1]/div[1]/ytd-channel-name[1]")$getElementText() %>% 
  unlist() -> sumber

menjadikan jaringan coment utama ke sumber vidio

dataset$target = as.character(dataset$target)

dataset[dataset %>%
          group_by(coment_ke) %>%
          slice(1) %>%
          ungroup() %>% 
          select(no) %>% unlist(),]$target = sumber

mengisi target yang kosong dengan nama_utama, hal ini dilakukan agar variabel target tidak kosong

dataset %>%
  filter(nchar(target) <= 2) %>%
  dplyr::select(coment_ke, target)-> a

dataset %>%
  group_by(coment_ke) %>%
  slice(1) %>%
  dplyr::select(nama, coment_ke)-> b

dataset[nchar(
  dataset$target) <= 2,]$target <- left_join(a,
                                            b, 
                                            by = "coment_ke")$nama %>%  as.character()

Final

beberapa variabel yang telah kita scrap, dan rapikan masih belum urut. Maka dari itu kita akan mengurutkan beberapa variabel agar menjadi semakin mudah dipahami

dataset %>%
  dplyr::select(1,5,2,3,4) %>%
  rename("source" = nama) -> dataset

dataset_final = rbind(dataset_final, dataset)

Finally, kita telah berhasil melakukan scraping dari media sosial Youtube. ini adalah contoh data yang berhasil kita ambil

## # A tibble: 129 x 7
##    source  target  text      link_source     comment_id  time_post time_scraping
##    <chr>   <chr>   <chr>     <chr>           <chr>       <chr>     <chr>        
##  1 Destia~ Destia~ "source ~ /groups/859979~ This is ma~ -         2021-10-05 2~
##  2 Rini P~ Destia~ "Keren d~ /groups/859979~ 9141143358~ 2 minggu~ 1633447656.7~
##  3 Kang L~ Destia~ "Jika be~ /groups/859979~ 9143626091~ 2 minggu~ 1633447656.7~
##  4 Farida~ Destia~ "Smoga p~ /groups/859979~ 9147155291~ 2 minggu~ 1633447656.7~
##  5 Destia~ Destia~ "source ~ /groups/859979~ This is ma~ -         2021-10-05 2~
##  6 Gerhana Destia~ "Innalil~ /groups/859979~ 8952098744~ 6 minggu~ 1633447678.6~
##  7 Tanda ~ Gerhana "ttangga~ /groups/859979~ 8952945544~ 6 minggu~ 1633447678.6~
##  8 Khofif~ Destia~ "Innalil~ /groups/859979~ 8957308376~ 6 minggu~ 1633447678.6~
##  9 Syahir~ Destia~ "Semoga ~ /groups/859979~ 8955268710~ 6 minggu~ 1633447678.6~
## 10 Etik W~ Destia~ "Istri n~ /groups/859979~ 8955108477~ 6 minggu~ 1633447678.6~
## # ... with 119 more rows

Sekian dari saya mohon maaf apabila dari penjelasan saya masih ada beberapa point yang membingungkan. Teman teman bisa menghubungi saya via email () jika ingin bertanya lebih lanjut terkait scraping data youtube ini.