Scraping trending topic Twitter dengan R |
Salam sehat teman-teman, kita berjumpa kembali pada blog sederhana ini. Pada unggahan sebelumnya, kita telah membahas mengenai machine learning berjenis supervised learning, yaitu model Decision Tree untuk klasifikasi sekaligus regresi dan step by step praktiknya dengan R. Bagi teman-teman yang berminat menyimak keseruannya, bisa mengunjungi tautan ini.
Kali ini kita akan melanjutkan belajar dan berbagi mengenai bagaimana cara melakukan scraping topik yang sedang trending di Twitter menggunakan R. Beberapa unggahan sebelumnya, dalam blog ini sebenarnya telah membahas mengenai aktivitas scraping, namun penerapannya adalah pada blog atau website. Teman-teman yang berminat mempelajari cara web scraping, bisa berkunjung pada tautan berikut. Inti dari scraping sendiri merupakan aktivitas hacking untuk memperoleh sebagian data atau informasi atau informasi tertentu secara langsung pada sebuah page atau laman baik itu media sosial, blog, atau lainnya sedemikian rupa untuk diolah menjadi sebuah informasi baru yang bermanfaat sekaligus menambah insight bagi pengguna data atau informasi tersebut.
Hal terpenting yang harus dilakukan dalam scraping adalah bagaimana kita menerapkan etika yang baik sebelum mendapatkan data atau informasi pada sebuah page. Salah satunya etika yang biasa diterapkan adalah dengan melihat status data atau informasi pada sebuah page atau laman tertentu, diperbolehkan melakukan scraping atau tidak. Hal ini bisa kita terapkan dengan menggunakan robots.txt.
Misalkan kita akan melakukan scraping berita dari detik.com, maka etika kita untuk melihat status laman tersebut diperbolehkan atau tidak adalah dengan melihat status atau warning menggunakan "https://www.detik.com/robots.txt", setelah kita enter akan muncul keterangan berikut:
Status robots.txt detik.com sebelum melakukan scraping berita |
Itu kalau website atau situs. Lantas bagaimana etika untuk melakukan scraping media sosial Twitter? Uniknya, untuk melakukan baik scraping maupun crawling, Twitter menyediakan fasilitas bagi kita untuk menjadi developernya. Untuk menjadi developer Twitter, sejumlah tahapan diperlukan dengan memenuhi sejumlah syarat dan ketentuan yang ditetapkan oleh Twitter. Dengan menjadi developer inilah kita bisa memperoleh API Twitter sebagai sarana melakukan baik scraping maupun crawling data.
Kali ini, dengan menggunakan sarana tersebut, kita akan mencoba melakukan scraping topik yang sedang trending atau trending topic di Twitter kemudian kita akan memvisualisasikannya dalam bentuk awan kata (wordcloud) dengan menggunakan package wordcloud2 yang merupakan package pengembangan dari wordcloud serta untuk memperjelas visualisasi, kita juga akan menggunakan tampilan bar chart atau diagram batang menggunakan package ggplot2.
Untuk mendapatkan sejumlah Tweet dari Twitter, pada umumnya di R kita bisa memanfaatkan package rtweet untuk membuat token baru sebagai "jalan masuk" kita menggunakan API Twitter guna melakukan scraping kali ini. Untuk lebih tergambar lebih jelas, kita dapat mengikuti beberapa code dan hasil visualisasi sebagai berikut:
#Aktivasi Package rtweet
library(rtweet)
#Membuat Kredensial Akses Twitter dengan API
create_token(app = "xxxxxxxxxxxxxxx", consumer_key = "xxxxxxxxxxxxxxxxxxxxxx",
consumer_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
access_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
## <Token>
## <oauth_endpoint>
## request: https://api.twitter.com/oauth/request_token
## authorize: https://api.twitter.com/oauth/authenticate
## access: https://api.twitter.com/oauth/access_token
## <oauth_app> xxxxxxxxxxxxxxx
## key: xxxxxxxxxxxxxxxxxxxxxx
## secret: <hidden>
## <credentials> oauth_token, oauth_token_secret
## ---
#Melihat Trending Topic di Dunia
trend <- trends_available()
head(trend)
## # A tibble: 6 x 8
## name url parentid country woeid countryCode code place_type
## <chr> <chr> <int> <chr> <int> <chr> <int> <chr>
## 1 Worldwide http://where.yahooapis.com/v1/place/1 0 "" 1 <NA> 19 Supername
## 2 Winnipeg http://where.yahooapis.com/v1/place/2972 23424775 "Canada" 2972 CA 7 Town
## 3 Ottawa http://where.yahooapis.com/v1/place/3369 23424775 "Canada" 3369 CA 7 Town
## 4 Quebec http://where.yahooapis.com/v1/place/3444 23424775 "Canada" 3444 CA 7 Town
## 5 Montreal http://where.yahooapis.com/v1/place/3534 23424775 "Canada" 3534 CA 7 Town
## 6 Toronto http://where.yahooapis.com/v1/place/4118 23424775 "Canada" 4118 CA 7 Town
#Melihat Trending Topic di Indonesia
trendindo <- get_trends("Indonesia")
head(trendindo)
## # A tibble: 6 x 9
## trend url promoted_content query tweet_volume place woeid as_of created_at
## <chr> <chr> <lgl> <chr> <int> <chr> <int> <dttm> <dttm>
## 1 #SUMMER_X_TO~ http~ NA %23S~ 16053 Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 2 SMAN 1 http~ NA %22S~ NA Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 3 TXT FEELS LI~ http~ NA %22T~ 27600 Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 4 #TokocryptoK~ http~ NA %23T~ NA Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 5 #SmartphoneO~ http~ NA %23S~ 14432 Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
## 6 SDN 1 http~ NA %22S~ NA Indo~ 2.34e7 2022-06-24 09:25:58 2022-06-19 12:25:55
#Melihat Struktur data Keseluruhan
trendindo %>%
glimpse()
## Rows: 50
## Columns: 9
## $ trend <chr> "#SUMMER_X_TOGETHER", "SMAN 1", "TXT FEELS LIKE SUMMER", "#TokocryptoKeSurabaya", "~
## $ url <chr> "http://twitter.com/search?q=%23SUMMER_X_TOGETHER", "http://twitter.com/search?q=%2~
## $ promoted_content <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,~
## $ query <chr> "%23SUMMER_X_TOGETHER", "%22SMAN+1%22", "%22TXT+FEELS+LIKE+SUMMER%22", "%23Tokocryp~
## $ tweet_volume <int> 16053, NA, 27600, NA, 14432, NA, 68840, NA, NA, NA, NA, NA, NA, NA, 1016942, 17458,~
## $ place <chr> "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indo~
## $ woeid <int> 23424846, 23424846, 23424846, 23424846, 23424846, 23424846, 23424846, 23424846, 234~
## $ as_of <dttm> 2022-06-24 09:25:58, 2022-06-24 09:25:58, 2022-06-24 09:25:58, 2022-06-24 09:25:58~
## $ created_at <dttm> 2022-06-19 12:25:55, 2022-06-19 12:25:55, 2022-06-19 12:25:55, 2022-06-19 12:25:55~
#Melihat Volume Tweets dari Trending Topic
library(dplyr)
trendindo %>%
select(trend, tweet_volume)
## # A tibble: 50 x 2
## trend tweet_volume
## <chr> <int>
## 1 #SUMMER_X_TOGETHER 16053
## 2 SMAN 1 NA
## 3 TXT FEELS LIKE SUMMER 27600
## 4 #TokocryptoKeSurabaya NA
## 5 #SmartphoneOPPOdariShopee 14432
## 6 SDN 1 NA
## 7 #TOMORROW_X_TOGETHER 68840
## 8 #HBSBongkarKasusKM50 NA
## 9 Bangun Pertahanan Kita NA
## 10 kerja fokus prabowo NA
## # ... with 40 more rows
#Memfilter Volume Tweets yang tidak NA
trendindo %>%
select(trend, tweet_volume) %>%
filter(tweet_volume != "NA")
## # A tibble: 27 x 2
## trend tweet_volume
## <chr> <int>
## 1 #SUMMER_X_TOGETHER 16053
## 2 TXT FEELS LIKE SUMMER 27600
## 3 #SmartphoneOPPOdariShopee 14432
## 4 #TOMORROW_X_TOGETHER 68840
## 5 nayeon 1016942
## 6 Cinta Laura 17458
## 7 Nestle 18486
## 8 Left & Right 1611240
## 9 Maria 208737
## 10 FELIX 1ST SOLO FEATURE 50607
## # ... with 17 more rows
#Mengurutkan dari Volume Tweets yang terbanyak
trendindo %>%
select(trend, tweet_volume) %>%
filter(tweet_volume != "NA") %>%
arrange(desc(tweet_volume))
## # A tibble: 27 x 2
## trend tweet_volume
## <chr> <int>
## 1 Left & Right 1611240
## 2 SAFE FLIGHT LALISA 1532522
## 3 nayeon 1016942
## 4 #LeftandRight 853074
## 5 Sungwoon 688908
## 6 BON VOYAGE KIM TAEHYUNG 421206
## 7 Music Bank 234826
## 8 Maria 208737
## 9 Carolina 183464
## 10 Charles 92568
## # ... with 17 more rows
#Memvisualisasikan Trending Topic Indonesia dengan Wordcloud
library(wordcloud2)
trendindo %>%
select(trend, tweet_volume) %>%
filter(tweet_volume != "NA") %>%
arrange(desc(tweet_volume)) %>%
wordcloud2(size = 2, shape = "circle",minRotation = -pi/6, maxRotation = -pi/6,
rotateRatio = 1)
Visualisasi Trending Topic Twitter Indonesia |
#Visualisasi Tweets menurut waktu menit
trendindo %>%
select(trend, tweet_volume) %>%
filter(tweet_volume != "NA") %>%
arrange(desc(tweet_volume)) -> barku
barku
## # A tibble: 27 x 2
## trend tweet_volume
## <chr> <int>
## 1 Left & Right 1611240
## 2 SAFE FLIGHT LALISA 1532522
## 3 nayeon 1016942
## 4 #LeftandRight 853074
## 5 Sungwoon 688908
## 6 BON VOYAGE KIM TAEHYUNG 421206
## 7 Music Bank 234826
## 8 Maria 208737
## 9 Carolina 183464
## 10 Charles 92568
## # ... with 17 more rows
library(ggplot2)
ggplot(data = barku, aes(x = reorder(trend, tweet_volume), y = tweet_volume, fill = as.factor(trend))) +
geom_bar(stat = "identity") +
theme(legend.position = "none") +
coord_flip()+
labs(x = "Trending Topik", y = "Frekuensi Tweet", caption = paste0("Sumber: Twitter, tanggal: ", Sys.Date())) +
ggtitle("Barchart Trending Topik Twitter Indonesia")
Bar Chart Trending Topic Twitter Indonesia |
Terlihat bahwa visualisasi awan kata (wordcloud) dengan bar chart sedikit berbeda, karena pada wordcloud belum diatur lebih lanjut mengenai ukuran minimal atau rasio visualisasi wordcloud yang ditampilkan. Topik mengenai Left and Right dan SAFE FLIGHT LALISA tidak terlihat karena jumlah Tweetnya sangat besar. Sedangkan pada bar chart, kita dapat melihat seluruh trending topic dan lebih insightfull. Setidaknya, pada 24 Juni 2022 kemarin, terdapat 5 trending topic di Twitter Indonesia, yaitu Left and Right, SAFE FLIGHT LALISA, nayeon, #LeftandRight, dan Sungwoon, sepertinya topik-topik berkaitan dengan konser NCT DREAM, termasuk boygroup Korea masih menarik perhatian netizen Twitter di Indonesia.
Demikian sedikit ulasan mengenai bagaimana melakukan scraping Twitter menggunakan R. Bagi teman-teman yang berminat memperdalam pengetahuan bagaimana melakukan scapring dan crawling menggunakan R, saya telah menuliskannya dalam buku berjudul: Pengantar Data Mining dengan R Studio. Urgensi pembuatan buku tersebut adalah untuk mempersiapkan kita menuju gerbang Data Science dan Big Data serta perkembangan Artificial Intelligence yang begitu pesat saat ini. Pemesanan buku dapat melalui tautan berikut. Selamat memahami dan mempraktikkan!