Twitter Verisinin Toplanması ve İşlenmesi

Aşama 0: Giriş

Bu yazımda oldukça popüler ve haliyle çok fazla kullanıcı kitlesine sahip olan Twitter ile bir çalışma yapacağız. Twitter API kullanarak ve kodumuzu Python dilinde yazarak Twitter’dan data çekeceğiz ve bu datayı hikayemize uygun olarak işlemeye çalışacağız. Haydi hikayeyi anlatıp kodlama(implementation) kısmına geçelim 🙌🏽

Aşama 1: Twitter API’dan datanın toplanması

Twitter’dan data çekme işlemini API (Application Programming Interface) kullanarak yapacağız. Öncelikle yeni bir app oluşturma sayfasına giderek kendimize ait key ve secret gibi değerleri almamız gerekiyor. API ile Twitter’a bağlanırken bu edindiğimiz değerleri kullanacağız.


CONSUMER_KEY = “XXX”
CONSUMER_SECRET = “XXX”
ACCESS_TOKEN = “XXX”
ACCESS_TOKEN_SECRET = “XXX”
auth = OAuth1(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
consumer = oauth2.Consumer(key=CONSUMER_KEY,secret=CONSUMER_SECRET)
access_token = oauth2.Token(key=ACCESS_TOKEN,secret=ACCESS_TOKEN_SECRET)

Yukarıdaki kod bloğunda XXX olarak belirtilen yerlere sizler edindiğiniz değerleri yazmalısınız. Burada Python’un request ve oauth2 kütüphanelerinden faydalanarak Twitter’a bağlantımızı sağlıyoruz.

client = oauth2.Client(consumer,access_token)# create a connection with Mongoclient
mongo_client = MongoClient(‘localhost’, 27017)
db = mongo_client[‘new_db’] # create a database
new_collection = db.new_collection # create a collection

Bu çalışmamızda verileri depolamak için veri tabanı olarak MongoDB kullandım (istediğiniz herhangi bir veritabanını kullanabilirsiniz). Yukarıda MongoDB’ye bağlanmamız için gereken ayarları görüyoruz. Kendimize yeni bir database ve yeni bir collection oluşturduk (daha fazla teknik detayına girmeyeceğim ancak sorularınız olursa 🤔 yorum kısmına yazabilirseniz elimden geldiğince yardımcı olmaya çalışırım). Bundan sonra farklı collection’larda çalışacağım. Yukarıda new_collection oluşturduğum gibi bu yeni collection’ları ilk olarak oluşturmamız gerekiyor (bu kısım atlanmıştır).

QUERY = ‘openmaker’ENDPOINTS = {
‘followers’: ‘https://api.twitter.com/1.1/followers/ids.json',
}
next_cursor = -1def get_followers(username, cursor=-1, nested_count=0):
if nested_count > 14: # rate limit: max 15 requests in 15 mins
return []
params = {
‘screen_name’: username,
‘cursor’: cursor
}
response = requests.get(ENDPOINTS[‘followers’], auth=auth, params=params)

data = response.json()
followers_collection.insert_one(data)next_cursor = data[‘next_cursor’]

return data[‘ids’] + get_followers(username, data[‘next_cursor’], nested_count+1)
then = time.time()if __name__ == ‘__main__’:
diff = 0
while diff < (16*60):
diff = time.time() — then # in seconds
sleep_time = 16*60 — diff
if sleep_time > 0:
time.sleep(sleep_time)

İlk olarak bir screen_name’in follower id’lerini çekerek yola koyuluyoruz. Yukarıda görmüş olduğunuz kod recursive bir metod olarak yazıldı ancak dilerseniz farklı (recursive olmayan) bir fonksiyon ile de sizler yazabilirsiniz. Bizi belki de en çok zorlayan kısım Twitter’ın kısıtlamaları 😞 Malesef size istediğiniz kadar data çekme hakkı vermiyor. Bu kısıtlamaları hangi request’i atacaksanız onun sayfasından inceleyebilirsiniz. Örneğin, follower id’leri için 15 dk.da 15 istek yapmanıza izin veriliyor.

MongoDB ye yolladığımız data her zaman istediğimiz formatta kaydedilmemiş olabilir. Yukarıdaki kodda ayırma (unwind) işlemini gerçekleştiriyoruz. Diyelim ki elimizde bir poşetin içinde 50 nesne var, bunu 50 poşetin içerisinde birer nesne olacak şekilde düzenleyip yeni bir collection’ına kaydediyoruz.

for j in profile:
followers_profile_collection.insert_one(j)

if __name__ == ‘__main__’:
get_profile(0*300) # 0*300 gets 30 000 data, then you should
continue with 1*300, 2*300, … respectively.

Sonrasında bu id’lerden profillerini çekmek için Twitter’a yeni bir request göndereceğiz. Yine burada Twitter’ın sınırlamasından ötürü her defasında 15 dk.da max. 30 000 data çekerek bu işlemi sürdürüyoruz.

friend_string = ‘,’.join([str(friend) for friend in friends])

d = {“user_id” : userid, “friend_ids” : friend_string}

friend_of_users_collection.insert_one(d)

if __name__ == ‘__main__’:
get_friends()

Follower’ların profillerine ulaştıktan sonra bu follower’ların arkadaşlarının bilgilerini çekeceğiz. Uzunca bir arkadaş id’lerini toplama kodu görüyorsunuz, ama korkmayın 😊 Aslında kodun çoğu parçası tamamen çıkabilecek hataları kontrol altına alma amaçlı yazıldı. Nedir bu çıkabilecek hatalar; datayı çekerken internet bağlantınız kopabilir, hesabı korumalı (protected) bir kullanıcı ile karşılaşabilirsiniz ve Onun arkadaşlarını çekemezsiniz gibi. Bu gibi durumlarda eğer herhangi bir kontrol mekanizması eklemezseniz malesef kodunuzun çalışması duracak ve uzun uzun hata mesajlarıyla karşılaşacaksınız.

Data çekme işlemimiz böylelikle sona erdi. Şimdi sırada analiz kısmı var 🎈

Aşama 2. Twitter hesapları arasındaki ilişkileri analiz etmek için verileri işleme

Datamızı işlemek için öncelikle MongoDB’den çekiyoruz.

Yukarıda görüldüğü üzere find() ile collection’daki verinin tamamını alabiliyoruz. Python’un şahane pandas kütüphanesi sayesinde bu kaydedilen veriyi okunaklı bir şekilde görebiliyoruz.

user-friend listesi

Sıra geldi analizimizi yapmaya. Friend’lerimizden hangileri user listemizde varsa onları alacağız ve gerisini bu analiz için kullanmayacağız.

temp_list = [] 
data_list = {}
for user_id in range(0, number_of_user_ids):
if str(total_data_friend_ids[user_id]) != ‘’:
total_subset_friend_ids =
map(int,str(total_data_friend_ids[user_id]).split(‘,’))
temp_list = set(total_subset_friend_ids).intersection(list(total_data_user_ids))
if list(temp_list) != []:
data_list[total_data_user_ids[user_id]] = list(temp_list)

Yukarıdaki kodu çalıştırdığımızda elimizde yine bir user-friend ilişkisi olacak fakat user listemizde olmayan friend’ler ile ilgilenmeyeceğiz.

Artık görselleştirmek istediğimiz user-friend ilişkisi için input hazırlayabiliriz.

Verimizi görselleştirmek için Gephi kullanacağız.

kaynak-hedef verisi

Data çekme aşamasındaki benzer işlemleri uygulayarak user ve friend listelerindeki elemanları profil bilgilerine erişip kullanacağımız parametrelerini pandas kullanarak tablo halinde gördük.

kaynak-hedef ilişkisi

Hangi id’ler arasında ilişki (edge) olduğunu gösteren verimizi yukarıdaki gibi oluşturduk.

Bir sonraki tutorial’da bu verimizi Gephi’nin formatına uygun olarak düzenleyip görselleştirme üzerine konuşacağız. Sanırım en can alıcı kısım görselleştirme aşaması olacak 🎉

Herkese iyi çalışmalar.

Not: İngilizcesi için tıklayınız.

Ph.D. Cand. in CmpE @Boğaziçi University. #ai #privacy #uncertainty #ml #dl #running #cycling #she/her https://www.cmpe.boun.edu.tr/~gonul.ayci/

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store