Sekitar empat tahun lalu, saya menulis artikel dengan judul yang hampir sama persis: twitteR: Crawling Data Twitter Menggunakan R. Pada saat itu, cara paling mudah untuk mendapatkan (crawling) data dari Twitter dengan R adalah menggunakan package twitteR. Sayangnya pada pertengahan 2016, Jeff Gentry, sang pengembang, menghentikan pengembangan dan update/maintenance terhadap package tersebut. Meskipun package twitteR masih bisa digunakan (setidaknya sampai saat ini), Mr. Jeff merekomendasikan untuk beralih menggunakan package lain yang tidak kalah kerennya, yaitu rtweet.
{% include image url=“image/twitter-techgladscom.png” alt=“twitter-techgladscom.png” caption=“Twitter. Kredit: techglads.com” %}
rtweet dikembangkan oleh Michael W. Kearney. Versi pertama dirilis pada Agustus 2018, atau hampir bersamaan dengan pengumuman penghentian pengembangan twitteR. Sesuai dengan deskripsinya, rtweet berfungsi untuk mengakses API Twitter melalui R. Jika twitteR hanya mampu digunakan untuk berinteraksi dengan REST API (untuk mencari “data” historis atau yang sudah lampau), rtweet ini bisa juga digunakan untuk mengakses stream API (live/realtime). Pada artikel ini kita bahas untuk REST API dulu ya.
Instalasi
Ada dua cara, yaitu install dari CRAN (untuk versi rilis terkini) dan dari Github (untuk versi development/pengembangan).
Opsi 1: dari CRAN
install.packages("rtweet")
Opsi 2: dari Github
Note: install dari Github memerlukan package devtools
install.packages("devtools")
library(devtools)
install_github("mkearney/rtweet")
Setelah terinstal, load package rtweet
library(rtweet)
Pelajari lebih lengkap tentang instalasi package R melalui artikel Menginstal R Package.
API Authorization
Untuk mengakses API Twitter diperlukan akun Twitter, aplikasi (application) dan token akses (access token). Silakan pelajari langkah-langkah membuat aplikasi dan mendapatkan token akses pada artikel Twitter Authentication dengan R.
{% include image url=“image/ilustrasi-app-token.png” alt=“ilustrasi-app-token.png” caption=“Ilustrasi Twitter App yang menampilkan keys dan tokens” %}
Note: Pada Juli 2018, Twitter mengubah kebijakan terkait registrasi aplikasi baru. Kini, untuk membuat aplikasi harus menggunakan developer account. Saat melakukan registrasi, Twitter meminta kita untuk menjelaskan secara lebih detail hal-hal terkait dengan aplikasi. Selanjutnya Twitter akan meninjau, apakah aplikasi disetujui atau tidak. Kabar baiknya, aplikasi-aplikai yang didaftarkan sebelum diterapkannya kebijakan baru ini masih bisa digunakan. Setidaknya sampai hari ini. Info selengkapnya di sini.
Setelah membuat aplikasi, proses selanjutnya adalah otentikasi (authentication) agar R melalui rtweet bisa berinteraksi dengan API Twitter. Proses ini ada dua opsi, yaitu (1) melalui browser dan (2) dengan access token. Keduanya dengan menggunakan fungsi create_token()
. Silakan pilih salah satu.
Opsi 1: Otentikasi melalui browser
Opsi ini membutuhkan:
- Consumer API key
- Consumer API secret key
token <- create_token(
consumer_key = "XXXXXk4gFgjuI6hx05zwaGh0Q",
consumer_secret = "XXXXXCPPWEBJhYS4Z7rDVGZt3y1dkVehTnSe7wsM0NKVWBDLoV")
R otomatis akan membuka browser, meminta login ke Twitter dan menampilkan pesan:
Authentication complete. Please close this page and return to R.
Ini berarti otentikasi berhasil.
Opsi 2: Otentikasi dengan access token/secret
Selain consumer API dan API secret key, opsi ini juga membutuhkan:
- Access token
- Access token secret
token <- create_token(
consumer_key = "XXXXXk4gFgjuI6hx05zwaGh0Q",
consumer_secret = "XXXXXCPPWEBJhYS4Z7rDVGZt3y1dkVehTnSe7wsM0NKVWBDLoV",
access_token = "XXXXX937-XXXXXu6x7wR70mUAWc1BCc7gJIOdfugps6iFgU6GO",
access_secret = "XXXXXkUqEsfnfsy31GSLIEyaiDLB0UC2rw8EP1gNaLTc7")
Jika tidak muncul error, berarti proses otentikasi sukses.
Note: Consumer API key, consumer API secret key, access token dan access token secret di atas hanya contoh, silakan ganti dengan nilai yang sesuai.
Crawling Data Twitter
Setelah proses otentikasi berhasil, kita siap untuk “menambang” data (crawling) dari Twitter. Untuk kepeluan ini, rtweet mengemas berbagai fungsi yang cukup lengkap, di antaranya:
search_tweets()
: mencari tweet dengan kata kunci tertentulookup_users()
: menampilkan data detail dari satu atau lebih user(s)get_timelines()
: menampilkan status/tweet yang pernah diposting oleh user tertentu aka timelineget_followers()
: menampilkan list followers dari user tertentuget_friends()
: menampilkan list fiends/followings atau yang di-follow user tentu- dan masih banyak yang lain seperti untuk menampilkan retweet, siapa yang me-retweet, mendapatkan list favorite, menampilkan trending topics, cleansing tweet, dan juga ekspor data ke file csv.
search_tweets()
Mencari tweet yang memuat kata kunci tertentu. Secara default, dalam sekali dijalankan akan memberikan MAKSIMAL 18.000 tweets, yang merupakan sampel dari historis tujuh hari terakhir. Bagaimana kalau ingin lebih dari 18 ribu atau lebih dari tujuh hari? Salah satu caranya dengan membuat akun premium atau entreprise. Lebih lengkap tentang ketentuan ini bisa dibaca di sini.
{% include image url=“image/search-tweet.png” alt=“search-tweet.png” caption=“Ilustrasi search pada Twitter” %}
Contoh: mencari (hingga) 1.000 tweets yang memuat kata kunci “bogor”
tweet <- search_tweets(q = "kota bogor", n = 1000)
Objek tweet merupakan data frame/tibble dengan lebih dari 80 variabel/kolom. Silakan tampilkan dengan perintah:
colnames(tweet)
Kita lihat tiga kolom di antaranya:
tweet[,c("created_at", "screen_name", "text")]
## # A tibble: 994 x 3
## created_at screen_name text
## <dttm> <chr> <chr>
## 1 2019-01-16 12:35:57 hasnahahahah~ @CommuterLine kereta terakhir dr jkt ~
## 2 2019-01-16 12:35:20 iffa_retno69 "#dadakan #padangsidempuan #sidikalan~
## 3 2019-01-13 19:09:55 iffa_retno69 "#padangsidempuan #sidikalang #tebing~
## 4 2019-01-16 12:11:59 terrotouli Kekurangan dari pembangunan infrastru~
## 5 2019-01-16 12:10:53 aininur56 5. Sekretaris PCNU Kota Bogor ini men~
## 6 2019-01-16 12:07:08 CommuterLine @imbecillic Selamat malam, untuk pemb~
## 7 2019-01-13 14:36:10 CommuterLine #InfoLintas : KA 1460 (Jakarta Kota-B~
## 8 2019-01-13 12:46:36 CommuterLine @itsmeanggii Cikarang-Jakarta Kota te~
## 9 2019-01-15 13:34:21 CommuterLine @ditakswn Selamat malam. Kami informa~
## 10 2019-01-15 16:41:12 CommuterLine @CahyoWarih Selamat malam. Dapat kami~
## # ... with 984 more rows
Keyword/query dapat berupa satu atau beberapa kata, namun hindari keyword yang kompleks. Menurut Twitter, query sebaiknya tidak lebih dari 10 kata. Berikut contoh cara penulisan keyword:
Query | Untuk mencari tweet yang mengandung: |
---|---|
"bogor" | kata “bogor” |
"kota bogor" | kata “kota” dan kata “bogor” (tidak memperhatikan urutan) |
"\"kota bogor\"" | frase “kota bogor” |
"kota OR bogor" | kata “kota” atau kata “bogor” atau keduanya |
"kota -bogor" | kata “kota” tapi tidak memuat kata “bogor” |
"#bogor" | hashtag “bogor” |
"@bogor" | mention “bogor” |
get_timelines()
Menampilkan timeline atau status/tweet terbaru yang pernah di-posting oleh satu atau beberapa user(s). Setiap user akan ditampilkan hingga maksimal 3.200 tweet.
Contoh: Menapilkan timeline dari “nurandi”
timeline <- get_timeline("nurandi")
Objek yang dihasilkan berupa data frame/tibble dengan lebih dari 80 kolom.
timeline[,c("created_at", "source", "text")]
## # A tibble: 100 x 3
## created_at source text
## <dttm> <chr> <chr>
## 1 2019-01-16 03:23:37 Twitter Web ~ https://t.co/b5KGxX56L5
## 2 2019-01-07 04:51:17 IFTTT New blog article: Apa Itu Jekyll dan ~
## 3 2018-12-13 23:53:31 Twitter for ~ "Semoga kita bukan termasuk orang yan~
## 4 2018-09-18 12:47:30 Twitter for ~ aku kalo ke ATM lebih takut keliatan ~
## 5 2018-08-17 01:37:24 Twitter Web ~ "@Telkomsel Hi, saya berlangganan pak~
## 6 2018-07-05 01:55:25 Twitter for ~ @IndonesiaGaruda halo, GA-824 CGK-SIN~
## 7 2018-06-02 16:51:35 Twitter for ~ "English: i know i supposed to meet y~
## 8 2018-04-23 04:54:58 Twitter for ~ @imigrasi_jakbar Min, saya sudah daft~
## 9 2018-04-04 08:37:53 Twitter for ~ @TokopediaCare verifikasi pembayatan ~
## 10 2018-03-13 04:42:15 Twitter for ~ @BPJSTKinfo Terima kasih infonya. BPJ~
## # ... with 90 more rows
lookup_users()
Menampilkan data detail dari satu atau lebih akun/user(s).
Contoh: Menampilkan detail dari “nurandi”
user <- lookup_users("nurandi")
Objek yang dihasilkan juga merupakan data frame/tibble dengan lebih dari 80 kolom.
user[,c("created_at", "screen_name", "name", "location", "description")]
## # A tibble: 1 x 5
## created_at screen_name name location description
## <dttm> <chr> <chr> <chr> <chr>
## 1 2019-01-16 03:23:37 nurandi Nur Andi S~ Jakarta/Bog~ Aspiring Data S~
Untuk lookup beberapa user(s), input harus berupa vector. Misal:
users <- lookup_users(c("nurandi", "jokowi", "billgates", "mosalah"))
users[,c("created_at", "screen_name", "name", "location", "description")]
## # A tibble: 4 x 5
## created_at screen_name name location description
## <dttm> <chr> <chr> <chr> <chr>
## 1 2019-01-16 03:23:37 nurandi Nur And~ Jakarta/B~ Aspiring Data Scient~
## 2 2019-01-16 10:10:08 jokowi Joko Wi~ Jakarta "Akun Twitter resmi ~
## 3 2019-01-15 17:23:00 BillGates Bill Ga~ Seattle, ~ Sharing things I'm l~
## 4 2019-01-09 08:16:38 MoSalah Mohamed~ Liverpool~ Footballer for Liver~
get_followers()
dan get_friends()
Menampilkan list dari followers (yang mem-follow) dan list dari followings/friends (yang di-follow) oleh akun/user tertentu.
Contoh: Menampilkan list followers dari “nurandi”
followers <- get_followers("nurandi")
followings <- get_friends("nurandi")
Output yang dihasilkan berupa tibble dari user_id.
followers
## # A tibble: 255 x 1
## user_id
## <chr>
## 1 743414321514897408
## 2 1042477396547395585
## 3 1049626193857732611
## 4 49285223
## 5 1018277822542929920
## 6 1039338205743538176
## 7 1027183219244847110
## 8 73331490
## 9 58994539
## 10 986940727077699585
## # ... with 245 more rows
followings
## # A tibble: 325 x 2
## user user_id
## <chr> <chr>
## 1 nurandi 59106338
## 2 nurandi 862600351
## 3 nurandi 2160025940
## 4 nurandi 80126180
## 5 nurandi 3272463157
## 6 nurandi 176519485
## 7 nurandi 1200006384
## 8 nurandi 775449094739197953
## 9 nurandi 68746721
## 10 nurandi 1408142352
## # ... with 315 more rows
Selanjutnya, untuk mendapatkan detail dari list user ID followers/friends, kita dapat menggunakan fungsi lookup_users()
. Misal:
detail_followings <- lookup_users(followings$user_id)
detail_followings[,c("created_at", "screen_name", "location", "description")]
## # A tibble: 325 x 4
## created_at screen_name location description
## <dttm> <chr> <chr> <chr>
## 1 2019-01-07 20:13:53 perrystephe~ Sydney I tweet (rarely) about #r~
## 2 2019-01-16 12:03:30 kitabisacom Indonesia Situs galang dana dan don~
## 3 2019-01-11 20:56:56 KJRIToronto Toronto, Ka~ Akun twitter Konsulat Jen~
## 4 2018-10-24 15:30:47 kitchenerma~ Kitchener, ~ 1017 Victoria St N. (519)~
## 5 2019-01-16 01:23:53 imigrasi_ja~ Kota Tua, J~ "Kantor Imigrasi Kelas I ~
## 6 2019-01-16 12:19:11 flerlagekr Williamspor~ Tableau Zen Master <U+25CF> Anal~
## 7 2019-01-16 12:52:46 INABadminton Cipayung, J~ "Akun Twitter Resmi Humas~
## 8 2019-01-15 20:20:40 goodfellow_~ San Francis~ Google Brain research sci~
## 9 2019-01-16 01:42:39 fchollet Mountain Vi~ Deep learning @google. Cr~
## 10 2019-01-13 22:19:13 math_rachel San Francis~ co-founder https://t.co/Z~
## # ... with 315 more rows
Fungsi-fungsi yang kita bahas tadi hanya sebagian dari fitur yang tersedia pada package rtweet. Juga masih banyak parameter yang bisa ditambahkan agar pencarian yang kita lakukan sesuai kebutuhan. Untuk mengetahui fungsi-fungsi tersebut secara detail termasuk parameter yang bisa digunakan, ketik ?
diikuti nama fungsi. Misal ?search_tweets
. Atau, bisa juga pelajari referensi pada laman rtweet.info.
Selamat menambang data :)