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.
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
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
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()
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()
code dibawah ini digunakan untuk mengambil link vidio yang ingin kita ambil
signals <- read_html(demDr$getPageSource()[[1]])
Sys.sleep(1)
signals %>%
html_nodes(".ytd-video-renderer") %>%
html_nodes("a") %>%
html_attr("href") -> link
data.frame(link, condition = str_detect(link, "watch")) -> link
link %>%
filter(condition == TRUE) %>%
distinct(link, .keep_all = T)-> link
paste0("https://www.youtube.com",link$link) -> link$link
setelah berhasil mengambil seluruh link yang kita inginkan, kita akan membuka laman yang menuju pada link tersebut
demDr$navigate(link$link[1])
Sys.sleep(7)
kita juga harus mengetahui jumlah comentar pada vidio yang dimaksud
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]/ytd-comments[1]/ytd-item-section-renderer[1]/div[1]/ytd-comments-header-renderer[1]/div[1]/h2[1]/yt-formatted-string[1]/span[1]")$getElementText() %>% unlist() %>% as.numeric() -> jumlah_coment
gsub("[[:punct:]]","",jumlah_coment) -> jumlah_coment
pada data youtube, ada istilah sub-comentar, dimana sub-comentar hanya dapat dilihat jika kita melakukan click pada komentar yang memiliki sub-comentar. Kita akan mengautomasi hal tersebut agar dapat dilakukan click otomatis pada sub-comment tersebut. Langkah pertama kita harus membuat pola xpath terhadap sub-comentar tersebut
pola = data.frame(ref1 = rep("
/html[1]/body[1]/ytd-app[1]/div[1]/ytd-page-manager[1]/ytd-watch-flexy[1]/div[5]/div[1]/div[1]/ytd-comments[1]/ytd-item-section-renderer[1]/div[3]/ytd-comment-thread-renderer[",jumlah_coment),
ref2 = seq(as.numeric(jumlah_coment)),
ref3 = rep("]/div[1]/ytd-comment-replies-renderer[1]/div[1]/ytd-button-renderer[1]",
jumlah_coment))
Sys.sleep(1)
pola$ref1 = as.character(pola$ref1)
pola$ref2 = as.character(pola$ref2)
pola$ref3 = as.character(pola$ref3)
substr(pola$ref1,2,nchar(pola$ref1)) -> pola$ref1
Setelah itu kita harus juga membuat bot agar selenium dapat menggeser kursor kebawah secara otomatis, tujuannya agar seluruh comentar nantinya dapat kita ambil seluruhnya
a=0
while(a != (as.numeric(jumlah_coment)%/%25)) {
demDr$findElement("css",
"body")$sendKeysToElement(
list(key = "page_down"))
Sys.sleep(5)
a = a+1
}
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)}
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
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()
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 (farhanadham04@gmail.com) jika ingin bertanya lebih lanjut terkait scraping data youtube ini.