Grab Twitter User Data Menggunakan Python



Oke pada kesempatan kali ini saya akan berbagi Tutorial tentaang 'Bagaimana Grab Data User di platform Twitter', sekaligus saya menjawab pertanyaan kang @Kristoff yang belum selesai di GC Mata Panda ( WhatsApp ).

Saya sering mendapatkan permintaan untuk menjelaskan bagaimana saya memperoleh data yang saya gunakan dalam penelitian akademis tertentu, atau untuk menjadi bahan para Buzzer yang disewa para partai Politik seperti sekarang ini, karena informasi tentang identitas pengguna sosial media itu sangat penting di dunia politik maupun pemerintahan. Saya selalu senang membagikan source code saya bersama dengan data saya (dan terus terang, saya pikir akademisi yang tidak mau berbagi harus dipaksa untuk mengambil Remedial TK).

Baca Juga : Cara Mengunduh File Menggunakan Python

Masalahnya adalah, banyak dari mereka yang ingin menggunakan source code tidak tahu harus mulai dari mana. Ada terlalu banyak langkah baru yang terlibat agar proses tidak dapat diakses. Jadi, saya akan mencoba memandu Anda melalui langkah-langkah dasar di sini melalui tutorial berpart.

Untuk memulai, Python adalah tools yang hebat untuk Grabbing data dari Web. Secara umum, Anda akan mendapatkan data Anda dengan mengakses API (Application Programming Interface) atau dengan ‘scraping ’data dari halaman web. Skenario termudah adalah ketika situs menyediakan API. Twitter adalah situs semacam itu. Karenanya, sebagai contoh pengantar, saya akan memandu Anda melalui langkah-langkah dasar menggunakan Python untuk mengakses API Twitter, membaca dan memanipulasi data yang dikembalikan, dan menyimpan hasilnya.

Dalam setiap project yang diberikan saya akan menjalankan sejumlah script yang berbeda untuk mengambil semua data yang relevan. Saya akan mulai dengan contoh sederhana. Script ini dirancang untuk mengambil informasi tentang sekelompok pengguna Twitter. Pertama, seperti yang dinyatakan di atas, apa yang saya lakukan untuk mendapatkan data adalah memanfaatkan API Twitter. Untuk tujuan saya, anggap API Twitter sebagai serangkaian rutinitas yang telah dibuat Twitter untuk memungkinkan saya mengakses potongan data tertentu.

Saya menggunakan Python untuk ini, kenapa ..? selain karena python adalah bahasa pemograman yang saya pelajari dan kuasai, Python juga banyak manfaatnya karena lebih mudah di fahami dan dimengerti , meskipun bahasa pemrograman apa pun akan berfungsi dalam case di tutorial ini. Jika Anda benar-benar tidak tertarik dalam pemrograman dan memiliki kebutuhan data yang lebih terbatas, Anda dapat menggunakan NodeXL (jika Anda menggunakan mesin Windows) atau layanan lain untuk mengumpulkan data. Jika Anda memilih rute Python, saya sangat menyarankan Anda menginstal Anaconda Python 2.7 - ini gratis, ini berfungsi pada Mac dan PC, dan mencakup sebagian besar paket tambahan yang diperlukan untuk komputasi ilmiah.

Singkatnya, Anda memilih bahasa pemrograman dan mempelajarinya dan kemudian mengembangkan kode yang akan mengekstrak dan memproses data untuk Anda. Meskipun Anda bisa mulai dengan kode saya sebagai basis, masih berguna untuk memahami dasar-dasarnya, jadi saya sangat merekomendasikan melakukan beberapa dari banyak tutorial yang sangat baik sekarang tersedia online untuk mempelajari cara menggunakan dan menjalankan Python. Tempat yang bagus untuk memulai menurut saya ialah di Codeacademy.

Mengakses API Twitter

Hampir semua Source code saya ini mengambil data dari API Twitter. Langkah pertama adalah menentukan bagian mana dari API Twitter yang harus Anda akses untuk mendapatkan tipe data yang Anda inginkan - ada berbagai metode API untuk mengakses informasi tentang tweet, retweet, pengguna, mengikuti hubungan, dll. Source code yang saya gunakan Di sini menggunakan plugs ke bagian pengguna / pencarian dari Twitter API, yang memungkinkan untuk mengunduh sebagian besar informasi pengguna Twitter. Anda dapat melihat deskripsi bagian API ini di sini, bersama dengan definisi untuk variabel yang dikembalikan. Berikut adalah daftar variabel yang paling berguna yang dikembalikan oleh API untuk setiap pengguna (deskripsi yang dimodifikasi diambil dari situs web Twitter):







Kedua, mulai 2013 Twitter membuatnya lebih sulit untuk mengakses API. Sekarang otentikasi OAuth diperlukan untuk hampir semua hal. Ini berarti Anda harus masuk Twitter dan membuat 'aplikasi'. Anda tidak akan benar-benar menggunakan aplikasi ini untuk apa pun - Anda hanya perlu kata sandi dan authentication code. Anda dapat membuat aplikasi Anda di sini. Untuk petunjuk lebih rinci tentang cara membuat aplikasi, lihat presentasi ini (nanti saya buatkan 😂 ).

Ketiga, sebagai 'wrapper' Python di sekitar API Twitter saya menggunakan 'Twython'. Ini adalah paket yang merupakan tambahan untuk Python. Anda perlu menginstal ini juga 'simplejson' (untuk mengurai data JSON yang dikembalikan oleh API). Dengan asumsi Anda menginstal Anaconda Python, cara paling sederhana adalah dengan menggunakan pip. Pada mesin Mac atau Linux, Anda cukup membuka Terminal dan ketik pip install Twython dan pip install simplejson.

Langkah-langkah di atas bisa sedikit menyusahkan, tergantung pada keakraban Anda dengan UNIX, tetapi Anda hanya perlu melakukannya sekali. Anda mungkin perlu waktu. Tapi begitu semuanya sudah diatur, Anda tidak perlu melakukannya lagi.

Memahami Kode

Di akhir posting ini saya akan menunjukkan seluruh script. Untuk saat ini, saya akan membahasnya dalam beberapa bagian. Baris pertama dalam kode adalah shebang - Anda akan menemukan ini di semua kode Python.

 #!/usr/bin/env python  

Baris 3 - 10 berisi docstring - juga konvensi Python. Ini adalah komentar multi-baris yang menjelaskan kode. Untuk komentar satu baris, gunakan simbol # di awal baris.

 """  
 Use Twitter API to grab user information from list of organizations;  
 export text file  
 Uses Twython module to access Twitter API  
 """  

Selanjutnya kita akan mengimpor beberapa paket Python yang diperlukan untuk menjalankan kode.

 import sys  
 import string  
 import simplejson  
 from twython import Twython  

Pada baris 18-22 kita akan membuat variabel hari, bulan, dan tahun yang akan digunakan untuk menamai file output.

 import datetime  
 now = datetime.datetime.now()  
 day=int(now.day)  
 month=int(now.month)  
 year=int(now.year)  

Ubah Kode

Ada dua area yang perlu Anda modifikasi. Pertama, Anda harus menambahkan token OAuth Anda ke baris 26-30.

 t = Twython(app_key='APP_KEY', #REPLACE 'APP_KEY' WITH YOUR APP KEY, ETC., IN THE NEXT 4 LINES  
   app_secret='APP_SECRET',  
   oauth_token='OAUTH_TOKEN',  
   oauth_token_secret='OAUTH_TOKEN_SECRET')  

Kedua, Anda harus memodifikasi garis 32-35 dengan id dari set pengguna Twitter Anda. Jika Anda tidak memiliki user_ids untuk ini, Anda dapat menggunakan screen_names dan mengubah baris 39 menjadi ‘screen_name = ids’

 ids = "4816,9715012,13023422, 13393052, 14226882, 14235041, 14292458, 14335586, 14730894,\  
   15029174, 15474846, 15634728, 15689319, 15782399, 15946841, 16116519, 16148677, 16223542,\  
   16315120, 16566133, 16686673, 16801671, 41900627, 42645839, 42731742, 44157002, 44988185,\  
   48073289, 48827616, 49702654, 50310311, 50361094,"  

Baris 39 adalah tempat kita mengakses API dan mengambil datanya. Jika Anda membaca deskripsi pengguna / API pencarian, Anda tahu bahwa metode ini memungkinkan Anda untuk mengambil informasi pengguna hingga 100 ID Twitter dengan setiap panggilan API.

 users = t.lookup_user(user_id = ids)  

Memahami JSON

Sekarang, langkah kunci untuk ini adalah memahami data yang dikembalikan oleh API. Seperti semakin umum dengan data Web, panggilan API ini mengembalikan data dalam format JSON. Di belakang layar, Python telah mengambil file JSON ini, yang memiliki data pada 32 pengguna Twitter yang tercantum di atas dalam id variabel. Setiap pengguna adalah objek dalam file JSON; objek dibatasi oleh kurung kurawal kiri dan kanan, seperti yang ditunjukkan di sini untuk salah satu dari 32 pengguna:

 {  
  "id": 171314974,  
  "id_str": "171314974",  
  "name": "Global Partnership ",  
  "screen_name": "GPforEducation",  
  "location": "Washington, DC",  
  "url": "http://www.globalpartnership.org",  
  "description": "We work with partners in nearly 60 low-income countries to ensure all children go to school and receive a quality education.",  
  "protected": false,  
  "followers_count": 23712,  
  "friends_count": 335,  
  "listed_count": 391,  
  "created_at": "Mon Jan 27 02:17:01 +0000 2019",  
  "favourites_count": 231,  
  "utc_offset": -18000,  
  "time_zone": "UTC+07:00 Time (Bangkok, Hanoi & Jakarta)",  
  "geo_enabled": true,  
  "verified": true,  
  "statuses_count": 4394,  
  "lang": "en",  
  "contributors_enabled": false,  
  "is_translator": false,  
  "profile_background_color": "127CB8",  
  "profile_background_image_url": "http://a0.twimg.com/profile_background_images/753645368/74e12a386aed1524700a3b1f08c16707.jpeg",  
  "profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/753645368/74e12a386aed1524700a3b1f08c16707.jpeg",  
  "profile_background_tile": false,  
  "profile_image_url": "http://pbs.twimg.com/profile_images/2479080709/g9iii4vpz2ra71c0efuo_normal.jpeg",  
  "profile_image_url_https": "https://pbs.twimg.com/profile_images/2479080709/g9iii4vpz2ra71c0efuo_normal.jpeg",  
  "profile_banner_url": "https://pbs.twimg.com/profile_banners/171314974/1379613316",  
  "profile_link_color": "000000",  
  "profile_sidebar_border_color": "FFFFFF",  
  "profile_sidebar_fill_color": "FFFFFF",  
  "profile_text_color": "4A494A",  
  "profile_use_background_image": true,  
  "default_profile": false,  
  "default_profile_image": false,  
  "following": null,  
  "follow_request_sent": null,  
  "notifications": null  
 },  

Output JSON bisa menjadi berantakan, jadi berguna untuk membookmark viewer JSON untuk memformat output JSON. Apa yang Anda lihat di atas adalah 38 variabel berbeda yang dikembalikan oleh API - satu untuk setiap baris - dan disusun dalam pasangan kunci: nilai (atau variabel: nilai). Misalnya, nilai untuk variabel screen_name untuk pengguna ini adalah GPforEducation. Sekarang, kita tidak selalu ingin menggunakan semua variabel ini, jadi yang akan kita lakukan adalah memilih dan memberi label yang paling berguna bagi kami.

Jadi, kita pertama-tama menginisialisasi file output, memasukkan hari / bulan / tahun dalam nama file, yang berguna jika Anda secara teratur mengunduh informasi pengguna ini:

 outfn = "twitter_user_data_%i.%i.%i.txt" % (now.month, now.day, now.year)  

 Kemudian kita membuat variabel dengan nama-nama untuk variabel (kolom) yang ingin kita sertakan dalam file output kita, membuka file output, dan menulis baris header:

 fields = "id screen_name name created_at url followers_count friends_count statuses_count \  
   favourites_count listed_count \  
   contributors_enabled description protected location lang expanded_url".split()  
 outfp = open(outfn, "w")  
 #outfp.write(string.join(fields, "\t") + "\n") # header  
 outfp.write("\t".join(fields) + "\n") # header  

Ingat bahwa pada baris 39 kita mengambil informasi pengguna pada 32 pengguna dan menetapkan data ini untuk pengguna variabel. Blok terakhir dari kode dalam baris 55-90 loop pada masing-masing ID ini (masing-masing objek yang berbeda dalam file JSON), membuat variabel yang relevan, dan menulis baris output baru. Inilah beberapa baris pertama:

 for entry in users:  
   #CREATE EMPTY DICTIONARY  
   r = {}  
   for f in fields:  
     r[f] = ""  
   #ASSIGN VALUE OF 'ID' FIELD IN JSON TO 'ID' FIELD IN OUR DICTIONARY  
   r['id'] = entry['id']  
   #SAME WITH 'SCREEN_NAME' HERE, AND FOR REST OF THE VARIABLES  
   r['screen_name'] = entry['screen_name']  

Jika Anda membandingkan kode ini dengan output JSON mentah yang diperlihatkan sebelumnya, apa yang kita lakukan di sini adalah membuat kamus Python kosong, yang kita sebut 'r', untuk menampung data kita untuk setiap pengguna, membuat variabel yang disebut id dan screen_name, dan menetapkan nilai-nilai yang dipegang dalam elemen entri ['id'] dan entri ['screen_name'] dari output JSON ke dua variabel masing-masing. Ini semua ditempatkan di dalam Python untuk loop - kita bisa memanggil 'entri' apa saja selama kita konsisten.

Sekarang mari kita selesaikan semuanya. Ringkasnya, apa yang dilakukan seluruh script ini adalah untuk mengulang setiap akun Twitter dalam variabel id - dan untuk masing-masing akun akan mengambil informasi profilnya dan menambahkannya ke deretan file output (file teks yang dapat diimpor ke dalam Excel, dll.). Nama file yang diberikan ke file output bervariasi sesuai dengan tanggal. Sekarang Anda dapat mengunduh script ini, memodifikasi baris yang disebutkan di atas, dan siap untuk mengunduh data Twitter Anda sendiri!

 #!/usr/bin/env python  
 """  
 Use Twitter API to grab user information from list of organizations;   
 export text file  
 Uses Twython module to access Twitter API  
 """  
 import sys  
 import string  
 import simplejson  
 from twython import Twython  
 #WE WILL USE THE VARIABLES DAY, MONTH, AND YEAR FOR OUR OUTPUT FILE NAME  
 import datetime  
 now = datetime.datetime.now()  
 day=int(now.day)  
 month=int(now.month)  
 year=int(now.year)  
 #FOR OAUTH AUTHENTICATION -- NEEDED TO ACCESS THE TWITTER API  
 t = Twython(app_key='APP_KEY', #REPLACE 'APP_KEY' WITH YOUR APP KEY, ETC., IN THE NEXT 4 LINES  
   app_secret='APP_SECRET',  
   oauth_token='OAUTH_TOKEN',  
   oauth_token_secret='OAUTH_TOKEN_SECRET')  
 #REPLACE WITH YOUR LIST OF TWITTER USER IDS  
 ids = "4816,9715012,13023422, 13393052, 14226882, 14235041, 14292458, 14335586, 14730894,\  
   15029174, 15474846, 15634728, 15689319, 15782399, 15946841, 16116519, 16148677, 16223542,\  
   16315120, 16566133, 16686673, 16801671, 41900627, 42645839, 42731742, 44157002, 44988185,\  
   48073289, 48827616, 49702654, 50310311, 50361094,"  
 #ACCESS THE LOOKUP_USER METHOD OF THE TWITTER API -- GRAB INFO ON UP TO 100 IDS WITH EACH API CALL  
 #THE VARIABLE USERS IS A JSON FILE WITH DATA ON THE 32 TWITTER USERS LISTED ABOVE  
 users = t.lookup_user(user_id = ids)  
 #NAME OUR OUTPUT FILE - %i WILL BE REPLACED BY CURRENT MONTH, DAY, AND YEAR  
 outfn = "twitter_user_data_%i.%i.%i.txt" % (now.month, now.day, now.year)  
 #NAMES FOR HEADER ROW IN OUTPUT FILE  
 fields = "id screen_name name created_at url followers_count friends_count statuses_count \  
   favourites_count listed_count \  
   contributors_enabled description protected location lang expanded_url".split()  
 #INITIALIZE OUTPUT FILE AND WRITE HEADER ROW    
 outfp = open(outfn, "w")  
 #outfp.write(string.join(fields, "\t") + "\n") # header  
 outfp.write("\t".join(fields) + "\n") # header  
 #THE VARIABLE 'USERS' CONTAINS INFORMATION OF THE 32 TWITTER USER IDS LISTED ABOVE  
 #THIS BLOCK WILL LOOP OVER EACH OF THESE IDS, CREATE VARIABLES, AND OUTPUT TO FILE  
 for entry in users:  
   #CREATE EMPTY DICTIONARY  
   r = {}  
   for f in fields:  
     r[f] = ""  
   #ASSIGN VALUE OF 'ID' FIELD IN JSON TO 'ID' FIELD IN OUR DICTIONARY  
   r['id'] = entry['id']  
   #SAME WITH 'SCREEN_NAME' HERE, AND FOR REST OF THE VARIABLES  
   r['screen_name'] = entry['screen_name']  
   r['name'] = entry['name']  
   r['created_at'] = entry['created_at']  
   r['url'] = entry['url']  
   r['followers_count'] = entry['followers_count']  
   r['friends_count'] = entry['friends_count']  
   r['statuses_count'] = entry['statuses_count']  
   r['favourites_count'] = entry['favourites_count']  
   r['listed_count'] = entry['listed_count']  
   r['contributors_enabled'] = entry['contributors_enabled']  
   r['description'] = entry['description']  
   r['protected'] = entry['protected']  
   r['location'] = entry['location']  
   r['lang'] = entry['lang']  
   #NOT EVERY ID WILL HAVE A 'URL' KEY, SO CHECK FOR ITS EXISTENCE WITH IF CLAUSE  
   if 'url' in entry['entities']:  
     r['expanded_url'] = entry['entities']['url']['urls'][0]['expanded_url']  
   else:  
     r['expanded_url'] = ''  
   print r  
   #CREATE EMPTY LIST  
   lst = []  
   #ADD DATA FOR EACH VARIABLE  
   for f in fields:  
     lst.append(unicode(r[f]).replace("\/", "/"))  
   #WRITE ROW WITH DATA IN LIST  
   #outfp.write(string.join(lst, "\t").encode("utf-8") + "\n")  
   outfp.write("\t".join(lst).encode('utf-8') + '\n')  
 outfp.close()   


Q & A jilka terjadi error saat dalam menjalankan script diatas..

Q : saya mendapatkan kesalahan di line 51,

pesan errornya: Traceback (most recent call last):
File "", line 1, in
AttributeError: module 'string' has no attribute 'join'

A : Error itu diakibatkan penggunaan versi python yang berbeda.

Q : Saya mendapatkan TypeError: 'module' object is not callable at line 26 - access_secret = '...'

A : Saya tidak tahu tanpa melihat seluruh source code Anda. tapi error ini biasanya dikarenakan anda belum memiliki akses Api Key dari Aplikasi Twitter yang anda buat.

Q : Ini adalah pertama kalinya saya mencoba dengan API Twitter, dan saya mencoba menarik id untuk teman-teman saya sebagai berikut:
friends = t.get_friends_ids (t.lookup_user (screen_name = "myscreenname"))

Namun, ini memberi saya error berikut:
TwythonError: Twitter API returned a 404 (Not Found), No user matches for specified terms.

Saya pikir masalahnya adalah saya tidak sepenuhnya mengerti apa nama layar itu. Apakah ini Twitter handle saya?
Di mana saya menemukan nama layar saya?

A: Screen Name Anda adalah Twitter handle Anda (misalnya, milik saya adalah 'dayatemje'). Anda dapat mengubah kode saya untuk menggunakan screen name alih-alih ID pengguna seperti ini: (users = t.lookup_user (screen_name = names), di mana nama adalah daftar Twitter handle. Inilah contoh spesifik:

names = 'dayatemje, eMJe'
users = twitter.lookup_user(screen_name = names)


jika ada pertanyaan lagi, silahkan berkomentar di kolom komentar

saya kira cukup untuk tutorial kali ini, sampai jumpa di tutorial selanjutnya, Happy Coding :)