Analisis Twitter: Crawling (searching)

Artikel ini membahas cara crawl (mengumpulkan) data dari media sosial twitter. Crawling data bisa dilakukan dengan setidaknya dua cara: search dan realtime streaming. Pada tulisan ini saya akan jelaskan cara crawl data twitter dengan melakukan searching melalui suatu query (keywords) tertentu.

[1]. Mendaftarkan Applikasi twitter

Sebelum mulai, “aplikasi” yang akan dibuat harus didaftarkan terlebih dahulu. Aplikasi yang dimaksud adalah program yang akan kita buat untuk crawl data twitter.

  1. Login ke twitter: https://twitter.com/
  2. Untuk membuat aplikasi twitter, no telephone pengguna wajib untuk didaftarkan (aturan baru). caranya klik link berikut: https://twitter.com/settings/add_phone
  3. Daftarkan aplikasi: https://apps.twitter.com/
    * Klik tombol Create New App
    * Isi detail aplikasi. Jangan hawatir bila anda belum memiliki website. Isi saja dengan sembarang alamat website (atau wordpress site anda), yang penting alamat URL-nya harus valid (lihat Gambar 1). Jangan lupa untuk klik “Yes, I Agree” dan tombol “Create Your Twitter Application
    * Klik tab “Keys and Access Tokens
    * Klik “Create my access tokens
    * Simpan empat entitas berikut ke suatu text file (notepad) di komputer anda: consumer_key, consumer_secret, access_token, access_secret. Kelak kita akan membutuhkannya untuk bisa mengakses twitter API (Application Program interface).

    Twitter_App_Setting

    Gambar 1. Twitter App Setting

[2]. Aturan twitter

Sebelum kita membahas lebih jauh tentang aplikasi twitter atau crawling data media sosial (twitter), ada baiknya terlebih dahulu kita pahami beberapa aturan atau batasan aplikasi yang akan dibuat. Mengapa? supaya nanti kalau ada error, kita tidak panik atau agar bisa mengerti kesalahan apa yang mungkin kita lakukan. Saya tidak ingin memenuhi artikel ini dengan aturan-aturan tersebut. Untuk lebih jelasnya silahkan baca baik-baik aturan-aturan twitter berikut:

[3]. Instalasi software yang dibutuhkan

Untuk mengumpulkan data twitter kita bisa menggunakan hampir semua bahasa pemrograman: Java, C++, PHP, dsb. Namun di artikel ini saya akan menggunakan salah satu bahasa pemrograman yang paling mudah namun memiliki performa, library dan utilitas yang cukup baik: Python.

  1. Install Python (jika belum ada di komputer anda). Untuk kemudahan, saya menyarankan untuk menggunakan Anaconda. (Saya menggunakan PyThon 3.5)
  2. Untuk menghubungkan bahasa pemrograman yang kita gunakan dan twitter terdapat lusinan driver/library yang dapat kita gunakan (Daftar Lengkapnya di sini). Namun untuk artikel ini kita akan menggunakan Tweepy. Untuk menginstall Tweepy di komputer anda, silahkan buka “Command Prompt” (terminal di Linux/Mac) lalu ketikkan perintah berikut:
  3. Hasil crawl kita nanti akan disimpan dalam format Json. Apa itu Json? Ndak usah hawatir, Json hanyalah format data sebagaimana CSV atau html. Ia hanyalah file teks biasa dengan format tertentu. Jika ingin tau lebih lanjut silahkan pelajari disini. Kita membutuhkan sebuah Modul (library/fungsi) yang akan menyelamatkan diri kita dari pusing 7 keliling (pusing pala Barbie) ketika berurusan dengan format json di Python. Tenang saja, obatnya sudah tersedia … :D … silahkan ketikkan perintah berikut di command prompt/shell.

[4]. The code

Saya asumsikan semua langkah diatas telah dilalui dengan sukses tanpa halangan (error) yang berarti. Jika masih ada langkah yang error silahkan hubungi Pak RT setempat … :D … kidding, silahkan komen dibawah, jangan lupa berikan pesan errornya dengan detail ya. Bagi anda yang beruntung, mari kita mulai beraksi.

  1. Buka editor Python anda, jika anda menginstall Anaconda, silahkan jalankan “Spyder” (cari shortcut-nya di ‘start menu’).
  2. Silahkan CoPas code berikut (Atau unduh disini). Jangan lupa rubah “consumer_key”,”consumer_secret”,”qry”,”maxTweets”, & “fName” dengan nilai-nilai yang sesuai dengan kebutuhan analitik anda.
  3. Jalankan code diatas dengan menekan tombol “F5” di Spyder atau jalankan melalui command prompt dengan perintah berikut:
  4. Jika tidak ada error, silahkan lihat di folder dimana code anda berada, (insya Allah  :D ) akan ada file baru hasil tweet yang telah anda crawl. Jika tidak ada, silahkan lapor polisi … eh salah… komentar dibawah (dengan pesan error yang muncul).
  5. Tips: Hati-hati makna spasi di query twitter adalah logika AND. Query “big data” artinya mencari tweet dengan kata “big” dan “data”. Jika anda menginginkan tweet yang memuat beberapa kata kunci gunakan operator OR.
    contoh: ‘taufikedys OR “taufik Sutanto” OR “big data” or “data science” OR matematika’

Penutup:

Mudah kan ya? iya kan? ya? …. Anyway … Setelah crawl data, tentu saja anda ingin menganalisa data tersebut. Mudahnya gunakan saja Gephy. Tapi kalau menginginkan analisa tingkat lanjut (advance) yang lain, harus menggunakan model statistika/data science/machine learning tersendiri. Saya akan menulis artikel lain tentang Gephi atau analisa tingkat lanjut tersebut dilain kesempatan. Untuk saat ini, silahkan bermain-main saja dulu dengan code diatas :) . Ada pertanyaan atau perintah yang tidak dimengerti? Lagi-lagi silahkan komentar dibawah. Have Fun!!….Hidup itu indah, cheer up! … ;) …

[Taufik Sutanto]-Bne, 18:31:13, 12/16/2015

51 thoughts on “Analisis Twitter: Crawling (searching)

  1. Mantap dan keren pak artikelnya, saya jadi penasaran kalau crawling facebook/linkedin atau social media lain gimana caranya kira-kira ya……? Saya tunggu artikel bahasannya ya pak, salam 2 jempol :)

    • Terima kasih ya … saya sekarang sedang crawl/analysis data Facebook. Cuma ya itu, kadang sulit menemukan waktu yg tenang untuk menulis di web ini.
      Part 2 tulisan ini juga draftnya sudah selesai, tapi belum ada waktu untuk menyelesaikan tulisannya …. :)

      • Sama-sama pak, saya tertarik membahas ini karena di indonesia sepertinya jarang menganalisis data di socmed entah apa sayanya yang tidak tahu heheh.. Crawl data utk facebooknya pake rapidminer kah pak atau yang lain? Saya dapat info bisa pakai rapidminer namun harus ada tambahan dengan bahasa python/R :D

        • Lumayan banyak kok, tapi memang itu di negeri kita hasil-hasil riset kurang populer di masyarakat. Media masa lebih senang membahas artis beli tas baru … :D …. Saya crawl & analysis biasanya pakai Python ….

          • Padahal di indonesia bila terus dikembangin bisa makin maju, cloud computing saja di negara lain sudah pakai di indonesia malah menjadi hal yang baru, telat banget jadinya pak :(
            Wah boleh tuh pak kopdar ajarin saya crawl pake python, saya belum ngerti caranya :D

  2. Pingback: Pendahuluan Analisis Twitter: PreProcessing & Distribusi kata | Taufik Sutanto

  3. Aku dong pak error (panic) T_T #solusinyaaa pak…

    runfile(‘C:/Users/en-en kasim/Documents/Python Scripts/hasil twitter.py’, wdir=’C:/Users/en-en kasim/Documents/Python Scripts’)
    Traceback (most recent call last):

    File “”, line 1, in
    runfile(‘C:/Users/en-en kasim/Documents/Python Scripts/hasil twitter.py’, wdir=’C:/Users/en-en kasim/Documents/Python Scripts’)

    File “C:\Users\en-en kasim\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py”, line 699, in runfile
    execfile(filename, namespace)

    File “C:\Users\en-en kasim\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py”, line 74, in execfile
    exec(compile(scripttext, filename, ‘exec’), glob, loc)

    File “C:/Users/en-en kasim/Documents/Python Scripts/hasil twitter.py”, line 18, in
    auth = tweepy.AppAuthHandler(consumer_key,consumer_secret)

    File “C:\Users\en-en kasim\Anaconda2\lib\site-packages\tweepy\auth.py”, line 170, in __init__
    ‘but got %s instead’ % data.get(‘token_type’))

    TweepError: Expected token_type to equal “bearer”, but got None instead

  4. Pak error donng pak… (panic)!!! #solusinyaaa pak.. T_T

    runfile(‘C:/Users/en-en kasim/Documents/Python Scripts/hasil twitter.py’, wdir=’C:/Users/en-en kasim/Documents/Python Scripts’)
    Traceback (most recent call last):

    File “”, line 1, in
    runfile(‘C:/Users/en-en kasim/Documents/Python Scripts/hasil twitter.py’, wdir=’C:/Users/en-en kasim/Documents/Python Scripts’)

    File “C:\Users\en-en kasim\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py”, line 699, in runfile
    execfile(filename, namespace)

    File “C:\Users\en-en kasim\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py”, line 74, in execfile
    exec(compile(scripttext, filename, ‘exec’), glob, loc)

    File “C:/Users/en-en kasim/Documents/Python Scripts/hasil twitter.py”, line 18, in
    auth = tweepy.AppAuthHandler(consumer_key,consumer_secret)

    File “C:\Users\en-en kasim\Anaconda2\lib\site-packages\tweepy\auth.py”, line 170, in __init__
    ‘but got %s instead’ % data.get(‘token_type’))

    TweepError: Expected token_type to equal “bearer”, but got None instead

  5. Pingback: Community Detection & Centrality: Teori & Aplikasi | Taufik Sutanto

  6. artikel ini sangat membantu sekali, tapi bagaimana untuk penambahan filter language dan time? saya ingin menyaring tweet berbahasa indonesia dan dari tanggal 1 Maret hingga 20 Maret saja.

  7. pak kalau hanya ingin mengambil data yang diperlukan, misalnya id saja, lokasi dan text tweetnya saja gimana pak?? apakah hasil crawling diatas bisa difilter sesuai kebutuhan? dan bagaimana caranya… terimaksih pak

      • yg tweet=status[‘text’].lower() ya pak.
        yang ‘text’ itu hnya diganti ‘lokasi’,’tweet’ atau ada tambahan variable pak??
        dan ngeloadnya itu nanti satu satu atw sekaligus id, tweet, text??
        #maf ya pak masih newbie di python :-D

        • Iya … kalau mau tau ada “key” apa saja di dictionary status ….
          lakukan ini:
          print(str(list(status.keys())))
          Lalu bisa saja load datanya dengan
          a, b, c = status[key1], status[key2], status[key3]
          Kalau ndak salah ada dictionary of dictionary di dalamnya … jadi nanti kalau mau akses valuenya
          status[key][subkey]

  8. Error kayak gini di eclipse gmn pak?

    Traceback (most recent call last):
    File “C:\Users\Pegawai\workspace\crawlingtwitter\src\crawling.py”, line 14, in
    auth = tweepy.AppAuthHandler(consumer_key,consumer_secret)
    NameError: name ‘tweepy’ is not defined

  9. pak, klo cara sentiment analysis di twitter, facebook atau media sosial lain, gimana ya pak? ASAP ^_^

  10. Pingback: Twitter Crawl: Menembus Batas Waktu | Taufik Sutanto

  11. Halo Pak, salam kenal …ada kontaknya pak? Saya tertarik sekali dgn ini…kita bikin kopdar yuk

    Salam
    Latif

  12. Pingback: Longer Access Token - Facebook Graph API | Taufik Sutanto

  13. permisi pak..
    gmana pak cara sentimen analisis twitter api menggunakan java
    mohon pencerahannya..dasar dasarnya?

  14. Assalamualaikum pak
    saya ingin bertanya, apakah crawling menggunakan tweepy dapat mendapatkan list akun2 tweet bot ditwitter? karena pencarian akun bot secara manual membutuhkan waktu yang cukup lama. saya membutuhkan banyak akun bot untuk dianalisa tingkat kemiripan antar twit serta timestampnya. terima kasih

  15. Assalamualaikum Mas Taufik,

    Mas maaf mau tanya, kalau di python bisa melakukan sentiment analysis data hasil crawling nya dengan metode lexicon based nggk ya?

    Terimakasi.

    Salam hormat.

  16. mohon maaf pak . saya mau tanya, pas nulis pip install tweepy di cmd , tapi hasilnya ‘pip is not recognized as an internal or external command, operable program or batch file , itu kenapa ya ? terima kasih

  17. KAK MAU TANYA INI KENAPA YA? terima kasih

    runfile(‘A:/Python/twitter.py’, wdir=’A:/Python’)
    Traceback (most recent call last):

    File “”, line 1, in
    runfile(‘A:/Python/twitter.py’, wdir=’A:/Python’)

    File “C:\Users\Lenovo\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py”, line 866, in runfile
    execfile(filename, namespace)

    File “C:\Users\Lenovo\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py”, line 102, in execfile
    exec(compile(f.read(), filename, ‘exec’), namespace)

    File “A:/Python/twitter.py”, line 11, in
    auth = tweepy.AppAuthHandler(consumer_key,consumer_secret)

    File “C:\Users\Lenovo\Anaconda3\lib\site-packages\tweepy\auth.py”, line 170, in __init__
    ‘but got %s instead’ % data.get(‘token_type’))

    TweepError: Expected token_type to equal “bearer”, but got None instead

  18. pak koding dibawah ini ngambil data tweet sampai max tweet, tapi saya ingin ambil sampai 1000 tweet, saya baru belajar python dan saya coba ubah2 kodingannya tapi tetep blm bisa ngambil data cuma sampai 1000. Mohon bantuannya pak :)

    import tweepy #https://github.com/tweepy/tweepy
    import csv

    #Twitter API credentials
    consumer_key = ‘xxx’
    consumer_secret =’xxx’
    access_key =’xxx’
    access_secret =’xxx’

    def get_all_tweets(screen_name):
    #Twitter only allows access to a users most recent 3240 tweets with this method

    #authorize twitter, initialize tweepy
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)

    #initialize a list to hold all the tweepy Tweets
    alltweets = []

    #make initial request for most recent tweets (200 is the maximum allowed count)
    new_tweets = api.user_timeline(screen_name = ‘contoh’,count=200)

    #save most recent tweets
    alltweets.extend(new_tweets)

    #save the id of the oldest tweet less one
    oldest = alltweets[-1].id – 1

    #keep grabbing tweets until there are no tweets left to grab
    while len(new_tweets) > 0:
    print (“getting tweets before %s” % (oldest))

    #all subsiquent requests use the max_id param to prevent duplicates
    new_tweets = api.user_timeline(screen_name = ‘contoh’,count=200,max_id=oldest)

    #save most recent tweets
    alltweets.extend(new_tweets)

    #update the id of the oldest tweet less one
    oldest = alltweets[-1].id – 1

    print (“…%s tweets downloaded so far” % (len(alltweets)))

    #transform the tweepy tweets into a 2D array that will populate the csv
    outtweets = [[tweet.id_str, tweet.created_at, tweet.text.encode(“utf-8”)] for tweet in alltweets]

    #write the csv
    with open(‘%s.csv’ % screen_name, ‘w’) as f:
    writer = csv.writer(f)
    writer.writerow([“id”,”created_at”,”text”])
    writer.writerows(outtweets)

    pass

    if __name__ == ‘__main__’:
    #pass in the username of the account you want to download
    get_all_tweets(“contoh”)

    • Saya sudah coba, code ini berhasil dapat tweet >1000, tapi tetap limited by twitter API limitations : https://dev.twitter.com/rest/public/rate-limits
      import tweepy, csv

      #Twitter API credentials
      consumer_key = ”
      consumer_secret =”
      access_key =”
      access_secret =”
      screen_name = ”
      count = 1000

      def get_all_tweets(screen_name,count):
      #Twitter only allows access to a users most recent 3240 tweets with this method
      #authorize twitter, initialize tweepy
      auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
      auth.set_access_token(access_key, access_secret)
      api = tweepy.API(auth)

      #initialize a list to hold all the tweepy Tweets
      alltweets = []

      #make initial request for most recent tweets (200 is the maximum allowed count)
      new_tweets = api.user_timeline(screen_name,count)

      #save most recent tweets
      alltweets.extend(new_tweets)

      #save the id of the oldest tweet less one
      oldest = alltweets[-1].id – 1

      #keep grabbing tweets until there are no tweets left to grab
      while len(new_tweets) > 0:
      print (“getting tweets before %s” % (oldest))

      #all subsiquent requests use the max_id param to prevent duplicates
      new_tweets = api.user_timeline(screen_name,count,max_id=oldest)

      #save most recent tweets
      alltweets.extend(new_tweets)

      #update the id of the oldest tweet less one
      oldest = alltweets[-1].id – 1

      print (“…%s tweets downloaded so far” % (len(alltweets)))

      #transform the tweepy tweets into a 2D array that will populate the csv
      outtweets = [[tweet.id_str, tweet.created_at, tweet.text.encode(“utf-8”)] for tweet in alltweets]

      #write the csv
      with open(‘%s.csv’ % screen_name, ‘w’) as f:
      writer = csv.writer(f)
      writer.writerow([“id”,”created_at”,”text”])
      writer.writerows(outtweets)

      pass

      if __name__ == ‘__main__’:
      #pass in the username of the account you want to download
      get_all_tweets(screen_name,count)

Leave a Reply