Twitter Crawl: Scrapping


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 ... CARA 1 [novice]:
  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 2 [Intermediate] [Notes, successive request "next-tokennya" code sendiri ya :) ]:
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=Taufik%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)
 

Python Codes:

Contoh hasil save tweetnya (& Code Python dibawah), 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, setelah selesai akan ada file CSV baru di folder dimana file Python (& data) berada.
from tqdm import tqdm
from bs4 import BeautifulSoup as bs
import re, csv

def html2csv(fData, fHasil, full=True):
    urlPattern = re.compile(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')
    print('Loading Data: ', flush = True)
    Tweets, Username, waktu, replies, retweets, likes, Language, urlStatus =  [], [], [], [], [], [], [], []
    soup = bs(open(fData,encoding='utf-8', errors = 'ignore', mode='r'),'html.parser')
    data = soup.find_all('li', class_= 'stream-item')
    for i,t in tqdm(enumerate(data)):
        T = t.find_all('p',class_='TweetTextSize')[0] # Loading tweet
        Tweets.append(bs(str(T),'html.parser').text)
        U = t.find_all('span',class_='username')
        Username.append(bs(str(U[0]),'html.parser').text)
        T = t.find_all('a',class_='tweet-timestamp')[0]# Loading Time
        waktu.append(bs(str(T),'html.parser').text)
        RP = t.find_all('span',class_='ProfileTweet-actionCountForAria')[0]# Loading reply, retweet & Likes
        replies.append(int((bs(str(RP), "lxml").text.split()[0]).replace('.','').replace(',','')))
        RT = t.find_all('span',class_='ProfileTweet-actionCountForAria')[1]
        RT = int((bs(str(RT), "lxml").text.split()[0]).replace('.','').replace(',',''))
        retweets.append(RT)
        L  = t.find_all('span',class_='ProfileTweet-actionCountForAria')[2]
        likes.append(int((bs(str(L), "lxml").text.split()[0]).replace('.','').replace(',','')))
        try:# Loading Bahasa
            L = t.find_all('span',class_='tweet-language')
            Language.append(bs(str(L[0]), "lxml").text)
        except:
            Language.append('')
        url = str(t.find_all('small',class_='time')[0])
        try:
            url = re.findall(urlPattern,url)[0]
        except:
            try:
                mulai, akhir = url.find('href="/')+len('href="/'), url.find('" title=')
                url = 'https://twitter.com/' + url[mulai:akhir]
            except:
                url = ''
        urlStatus.append(url)
    print('Saving Data to "%s" ' %fHasil, flush = True)
    dfile = open(fHasil, 'w', encoding='utf-8', newline='')
    if full:
        dfile.write('Time, Username, Tweet, Replies, Retweets, Likes, Language, urlStatus\n')
        with dfile:
            writer = csv.writer(dfile)
            for i,t in enumerate(Tweets):
                writer.writerow([waktu[i],Username[i],t,replies[i],retweets[i],likes[i],Language[i],urlStatus[i]])
    else:
        with dfile:
            writer = csv.writer(dfile)
            for i,t in enumerate(Tweets):
                writer.writerow([Username[i],t])
    dfile.close()
    print('All Finished', flush = True)
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

Tidak ada komentar:

Posting Komentar

Relevant & Respectful Comments Only.