Twitter Crawl: Menembus Batas Waktu ^_^ (7 hari)

Peraturan terbaru Twitter API membatasi pengambilan data Tweet hanya satu minggu (7 hari) kebelakang. Jika seseorang ingin meneliti atau menganalisa topik tertentu diluar jangkauan waktu tersebut maka biasanya harus membeli data Tweet dari situs-situs tertentu. Tapi… masih ada cara gratis yang bisa dilakukan … ^_^ … simak lebih lanjut di artikel ini.

I. Twitter Grant

Jika anda memerlukan data Twitter untuk keperluan akademik, anda bisa submit proposal ke Twitter untuk meminta data. Keterangan lebih lengkapnya disini. … hhhmmm… hhhmmm… sayangnya sekarang program tersebut sudah ditutup … :v … (baca disini) … tenang Gan, ane jangan di-bata dulu … lanjut baca Gan …

II. Beli Data dan-atau Hasil Analitik umum

Jika anda mengerjakan project penelitian dan memiliki grant money yang cukup besar, atau anda bisa menggunakan uang perusahaan untuk melakukan analisa media sosial, maka anda bisa membeli data Twitter di masa lalu dan-atau analisanya dari beberapa website tertentu [contoh1, contoh2].

Tapi kalau anda mahasiswa yang sering puasa dengan niatan ibadah campur berhemat campur kepaksa (boleh ga ya? :v ), maka ndak usah hawatir, masih ada cara ketiga yang gratis bin cuma-cuma, tapi masih halal (kayaknya sih :D ).

III. Twitter Search Web Scrap

Walau twitter membatasi search dan stream API-nya hanya sampai data 7 hari kebelakang, namun twitter tidak membatasi data hasil “Advance Search” di websitenya: https://twitter.com/search-advanced . (catatan: silahkan baca artikel ini jika ingin mengetahui cara crawling twitter dengan API).  Dalam artikel ini kita akan menggunakan search engine twitter untuk mengambil data tweets, kemudian melakukan scrapping data dari hasil yang diberikan dengan modul Python BeautifulSoup.

Beberapa catatan penting sebelum kita mulai:

  1. Artikel ini bukan resep cara bikin Soup Ayam … halah … ini mah bukan catatan penting … :v …
  2. BeautifulSoup (BS) “menurut saya” lambat. Sebagai pembanding saya buat program manual scrapping, jauh lebih cepat dari BS. Sehingga BS kurang cocok untuk Big Data analitik, tapi mudah dimengerti dan digunakan untuk pemula-intermediate users. Untuk Hard-Core programmer atau Big Data engineer/scientist sebaiknya buat code scrap sendiri. Lagian expert big data atau hard-core programmer juga ndak akan baca web ini … :D … biasanya mereka membaca kitab kuning para hacker yang tulisannya di-encrypt pakai kunci yang berasal dari dunia ghaib … :v
  3. Cara yang disajikan di web ini cocok untuk penelitian dengan tweet hanya hingga puluhan ribu saja. Namun jika diperlukan data hingga jutaan tweet, … maka silahkan hubungi dokter (big data) terdekat …  dimana ya? … :D
  4. Data puluhan ribu ini menurut saya sudah cukup untuk keperluan skripsi/artikel/essay/penelitian topik tertentu (khusus)/ laporan pegawai di tempat kerja untuk presentasi trending topik tertentu. Sebenarnya selama kita pandai bersyukur sih, cukup-cukup aja Gan … :v #GaZeBo
  5. Hati-hati, biasanya twitter mengganti “tags code” hasil searchnya secara periodik. Jadi make sure diperhatikan, untuk memastikan buka saja dulu filenya di NotePad atau sembarang text editor.

Kelebihan dan kekurangan Advance Search twitter:

Kelebihan:

  • Setia dan humoris … halah … salah ini mah … #maaf #hiraukanGan, lanjut aja poin berikutnya.
  • Tidak dibatasi waktu (Seperti yang sudah dijelaskan sebelumnya).
  • Bisa dibatasi lokasi, waktu, mentions, bahasa, dll ==> ini kelebihan utama.
  • Bisa melakukan sentimen analysis dengan mudah sekali, karena ada pilihan untuk memilih sentimen positif atau negatif di option search-nya.
  • Bisa Exclude retweets, jadi tidak perlu melakukan duplicate tweet detection.

Kekurangan:

  • Gaji … haiyah … salah lagi, gaji mah kurang terus …. maaf CurCol … :v
  • Kita tidak mendapatkan meta-information selengkap data dari API. Namun data yang kita dapatkan lumayan lengkap, selain tweet dan username, ada waktu, bahasa, jumlah retweet dan like.
  • Tidak semudah menggunakan API dalam mengimport data.
  • Tidak seRobust API juga, terkadang error jika server twitter lagi sibuk… misal orang Indonesia lagi pada sibuk ngomongin warteg tutup VS buka … #ups … #NoPolitik … :D
  • Kekurangan-kekurangan lainnya menyusul kalau sudah gajian ya Gan … maaf PNS … #MasyaAllah #CurcolLagi #Maaf.

Bahan-bahan yang diperlukan:

Loh kok sub-judulnya jadi kayak resep ya? … :D …

  1. Python dan BS terinstal. Biasanya Anaconda sudah memuat modul BS. Catatan di artikel ini saya menggunakan Python 3.5 dan BS 4.3.2 (versi paling anyar ketika artikel ini ditulis). Untuk yang retro dan menggunakan Python 2 dan BS 3, silahkan sesuaikan sendiri syntaxnya … :D …
  2. Koneksi internet yang okeh … kalau quota tipis sebaiknya berburu WiFi dulu … :)
  3. Browser FireFox… yups, … cara yang disajikan di artikel ini ndak akan berhasil kalau pakai Chrome (serius!) … saya belum pernah nyoba pakai ie/edge tapi udah ikutin aja Gan … FireFox pan gratis inih …. :D … #betawiMode:ON

Cara Memasak:

wakakaka… :v …  biarin ah … judulnya makin ngaco …

  1. Login ke twitter. kalau ndak login structure tags html-nya beda.
  2. Buka URL https://twitter.com/search-advanced di Mozila Firefox.
  3. Masukkan query , tanggal, bahasa, sentimen, dan option lain yang diinginkan …
  4. Nah ini tahap yang rada aneh …. setelah klik “search” dan mendapatkan hasil searchnya … klik tombol scroll down yang ada di kanan bawah Atau [keep pressing] tekan tombol ‘page down’. Terus klik terus sampai bosen Gan … :v … btw, temen saya punya tips menarik … dia solatip mouse/tombol pageDown-nya dan didiamkan semalaman untuk mendapatkan puluhan ribu tweets …. :D … hey, it works! … untuk cara yang lebih geeky-nya (lewat script) di lain waktu saja ya …
  5. Save (Ctrl+S) tweetnya sebagai html. Caution: Coba dulu save sebagai “HMTL page only”, kemudian cek/buka file-nya di chrome lalu tekan tombol “End” untuk memeriksa apakah semua tweets tersimpan. Kalau tidak tersimpan semua, coba kembali ke Firefox lalu save sebagai “HTML complete” [walau nanti images-nya tidak akan dipakai].

Cara ngulek di Python:

Contoh hasil save tweetnya (& Code Python dibawah) bisa diunduh disini (Klik tombol panah diatas untuk download), atau silahkan double click code Python di bawah untuk CoPas (dan menggunakan data hasil search Agan) … tau kan CoPas? Combro Panas … #Laperrrr … :D … Pastikan file python dan file data berada di folder yang sama …. Jangan dipisah gan,… kasihan … udah sehati mereka, ga usah nikung laaahhh… :)  …

Silahkan jalankan programnya (“python<spasi>Twitter_Search_Parser.py“), setelah selesai akan ada file CSV baru di folder dimana file Python (& data) berada. Selanjutnya terserah mau diapain: Gephy, rapidminer, Sentiment Analysis, etc …

Udah dulu ya, silahkan komen di bawah jika ada pertanyaan … Good Luck & semoga bermanfaat.

Cheers,

< / TES >® ~ BNE 17/06/2016,14:28:06

38 thoughts on “Twitter Crawl: Menembus Batas Waktu ^_^ (7 hari)

  1. C:\Learning\Python\PyTwitter_search_Parser-Sutanto.Org>python Twitter_Search_Parser.py
    Loading Data:
    Importing Tweets:
    Loading Username:
    Loading Time:
    Loading retweet & Likes:
    Loading Language:
    Saving Data to “hasil_scrap.csv”
    Traceback (most recent call last):
    File “Twitter_Search_Parser.py”, line 58, in
    for u,t,r,li,L,tw,c in zip(username,waktu,retweets,likes,Language,Tweets):
    ValueError: need more than 6 values to unpack

    Mohon informasinya apa yg perlu diperbaiki, saya menggunakan donwload link ( hasil capture & source code) diatas.

    • oops, maaf saya kelebihan satu variable.
      Rubah baris tersebut jadi ini:
      for u,t,r,li,L,tw,c in zip(username,waktu,retweets,likes,Language,Tweets):

      * Saya sudah update yg di artikel & GDrive ….

  2. Halo. Kalau mau tambah variabel Quote tweet bagaimana ya?
    saya coba begini:

    print(‘Loading QuotedUser: ‘, flush = True)
    quotedUser = [uq.find_all(‘span’,class_=’QuoteTweet-screenname u-dir’) for uq in data]
    quotedUser = [bs(str(uq[0]),’html.parser’).text for uq in quotedUser]

    print(‘Loading QuotedTweets: ‘, flush = True)
    quotedTweets = [t.find_all(‘div’,class_=’QuoteTweet-text tweet-text u-dir’) for qt in data]
    quotedTweets = [bs(str(qt[0]),’html.parser’).text for qt in quotedTweets]

    Gagal :(

    “IndexError: list index out of range.”

    Salahnya di mana ya, mas, kira2?

    • quotedUser = [bs(str(uq[0]),’html.parser’).text for uq in quotedUser] ==> Baris ini error karena list “quotedUser” kosong.
      Coba jangan pakai list comprehension tapi pakai loop biasa lalu try and catch (except).

  3. kang, baiknya akang buat buku khusus text mining menggunakan python, biar ajib, dan pelajar yg baru seperti sy bisa ikut menyimak belajar….

    • Terima kasih sarannya … Insya Allah akhir tahun saya akan mulai menulis beberapa buku terkait data science dan big data (termasuk di dalamnya text mining) …. ^_^

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

  5. Assalamualaikum, Pak, saya mau tanya, kalau di csv nya tidak muncul hasil scraping kenapa ya? saya sudah coba juga dengan file contoh hasil save tweet, juga tidak muncul.

    • Saya pakai Python 3.5.2, BeautifulSoup 4.5.1, bs4 versi 0.0.1. Saya coba print(soup) dan print(soup.get_text()) muncul, tapi begitu print(data) output nya [ ] juga tweets, dan lainnya keluarnya [ ] .. mohon bantuannya ya pak,

      terima kasih sebelumnya

  6. Malam Kang Taufik

    Saya coba crawling data
    – dapat sekitar 20 aja, gmn ya supaya bisa ngeload terus gitu, jadi dapet banyak datanya
    – kalau pakai spesifik tanggal di advanced search kok ngk mau ya dapet datanya

    gini codenya

    import re
    from urllib.request import urlopen
    from bs4 import BeautifulSoup as bs
    from nltk.tokenize import RegexpTokenizer

    html1 = urlopen(“https://twitter.com/search?q=ahok”)
    #html2 = urlopen(“https://twitter.com/search?q=ahok%20lang%3Aid%20since%3A2016-07-01%20until%3A2016-07-02&src=”)
    soup = bs(html1.read(),’html.parser’)
    data = soup.find_all(‘li’, ‘js-stream-item stream-item stream-item ‘)
    tokenizer = RegexpTokenizer(r’\w+’)
    for t in data:
    tweet = t.find(‘p’, ‘TweetTextSize js-tweet-text tweet-text’).get_text()
    tweet = tweet.lower()
    tweet = re.sub(r’\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*’,”, tweet)
    tweet = tokenizer.tokenize(tweet)
    tweet = ‘ ‘.join(tweet)
    print(tweet)

    • ini successive requests ya? … kayaknya saya juga pernah coba successive requests memang ndak bisa … kalau mau dengan proses seperti ini coba pakai Selenium ….

      • tks kang, ad coba selenium tapi agak bingung..

        html2 = urlopen(“https://twitter.com/search?q=ahok%20lang%3Aid%20since%3A2016-07-01%20until%3A2016-07-02&src=”)

        kalau yang ini kok ngk mau keambil ya.. apa ad salah ama urlnya ya kang

        • URL-nya ga salah … salahnya di baris ini:
          data = soup.find_all(‘li’, ‘js-stream-item stream-item stream-item ‘)

          Coba lihat source-nya lagi lalu sesuaikan ….

          • Maaf masih belum bisa…

            kalau search di tahun 2017 bisa dapat tweetnya, sdh saya coba
            url3 = https://twitter.com/search?q=ahok%20lang%3Aid%20since%3A2017-01-02%20until%3A2017-01-03&src=typd

            tapi kalau yang 2016 tetap tidak bisa, tapi kalau saya save html, bisa dapat data tweetnya
            url3 = (“https://twitter.com/search?q=ahok%20lang%3Aid%20since%3A2016-07-01%20until%3A2016-07-02&src=typd”)

            ambil data kalau dari file save html tetep pakai ini
            data = soup.find_all(‘li’, ‘js-stream-item stream-item stream-item ‘)

            udah bolak balik saya cek tag codenya sepertinya tetap sama kang.

            maaf agak mbulet banget.. mohon bantuannya…
            Terima kasih banyak,,,,

          • Server twitter minta header…. Coba code ini [saya sudah coba & bisa]:

            import re
            from urllib.request import Request, urlopen
            from bs4 import BeautifulSoup as bs
            from nltk.tokenize import RegexpTokenizer

            url = “https://twitter.com/search?q=ahok%20lang%3Aid%20since%3A2016-07-01%20until%3A2016-07-02&src=typd”
            headers = {}
            headers[‘User-Agent’] = “Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17″
            req = Request(url, headers = headers)
            resp = urlopen(req).read()

            soup = bs(resp,’html.parser’)
            data = soup.find_all(‘li’, ‘js-stream-item stream-item stream-item ‘)
            tokenizer = RegexpTokenizer(r’\w+’)
            for t in data:
            tweet = t.find(‘p’, ‘TweetTextSize js-tweet-text tweet-text’).get_text()
            tweet = tweet.lower()
            tweet = re.sub(r’\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*’,”, tweet)
            tweet = tokenizer.tokenize(tweet)
            tweet = ‘ ‘.join(tweet)
            print(tweet)

  7. Pak saya sudah coba sesuai degan tutorial diatas tapi kenapa tidak ada data yang kesimpan di csv ya? padahal melalui pencarian twitter datanya keluar. Mohon bantuannya terimakasih.

  8. Mas taufik mohon bantuannya dong, ketika di run muncul error kaya gini :

    runfile(‘C:/Users/User/.spyder/python Twitter_Search_Parser.py’, wdir=’C:/Users/User/.spyder’)
    File “C:/Users/User/.spyder/python Twitter_Search_Parser.py”, line 15
    print(‘Loading Data: ‘, flush = True)
    ^
    SyntaxError: invalid syntax

    hatur nuhun..

    • Minimal ada 2 kemungkinan:
      [1]. Ketika copy-paste tanda single quote (apostrophe) tidak tercopy dengan baik. Solusinya ganti tanda ‘ dengan tanda “‘” yang benar.
      [2]. Apakah yang digunakan python 3?

Leave a Reply