Επιστροφή στο blog

Εξαγωγή δεδομένων Twitter με χρήση Python

Εξαγωγή δεδομένων Twitter με χρήση Python

Το Twitter δεν είναι απλώς μια εκτεταμένη πηγή ειδήσεων, είναι μακράν ένα από τα καλύτερα δείγματα των σκέψεων του κόσμου. Με περισσότερους από 330 εκατομμύρια ενεργούς χρήστες, είναι μία από τις κορυφαίες πλατφόρμες όπου οι άνθρωποι αρέσκονται να μοιράζονται τις σκέψεις τους. Τα δεδομένα του Twitter μπορούν να χρησιμοποιηθούν για ποικίλους σκοπούς, όπως έρευνα, καταναλωτικές αναλύσεις, δημογραφικές αναλύσεις, και πολλά ακόμα.

Ως εκ τούτου, ο πρωταρχικός στόχος αυτού του οδηγού είναι να σας διδάξει πώς να λάβετε ένα δείγμα δεδομένων Twitter που σχετίζονται με το έργο ή την επιχείρησή σας.

Πριν προχωρήσετε, βεβαιωθείτε ότι έχετε πρόχειρες όλες αυτές τις μεταβλητές:

  1. Consumer Key
  2. Consumer Secret
  3. Access Token
  4. Access Token Secret

Αν θέλετε να μάθετε πώς να αποκτήσετε τα προαναφερθέντα στοιχεία, διαβάστε εκείνη την ανάρτηση ιστολογίου που γράφτηκε από τον συνάδελφό μου Dattatray Upase.

Τώρα ας γράψουμε λίγο κώδικα!

Ορισμός των μεταβλητών εισόδου

Αρχικά, πρέπει να ορίσετε μερικές από τις καθολικές μεταβλητές που θα χρειαστείτε για το πρόγραμμα:

Εισάγω το ‘sys’ για να λάβω ορίσματα γραμμής εντολών, επειδή μπορεί να θέλω να αλλάξω λέξεις-κλειδιά, ημερομηνία έναρξης ή ημερομηνία λήξης. Για τη γλώσσα επέλεξα τα Αγγλικά, αλλά ίσως θέλετε να ελέγξετε ποιες άλλες γλώσσες υποστηρίζονται. Τα αποτελέσματα θα αποθηκευτούν στο ‘data’ στο τέλος.

Ως αποτέλεσμα, μια τυπική χρήση του σεναρίου κώδικα θα ήταν κάπως έτσι:

python script.py start_date end_date keyword

Πρόσβαση στο Twitter API
Το Twitter επιτρέπει τη χρήση του API του μέσω ενός πλαισίου εξουσιοδότησης oauth2. Παρέχουν την τεκμηρίωση στον ιστότοπό τους με την οποία μπορεί να γίνει φιλτράρισμα των tweets. Το παραπάνω κομμάτι κώδικα θα το υλοποιήσει για εσάς.

Η req_count μεταβλητή είναι ο αριθμός των φορών που έχω χρησιμοποιήσει το API κατά την εκτέλεση του προγράμματός μου. Αντιμετωπίζω το ακόλουθο σφάλμα με τον κώδικα που δίνεται:

TypeError: Unicode-objects must be encoded before hashing

Για να το αποφύγω αυτό, αλλάζω το post_body=”” σε post_body=b”” και αυτό διορθώνει το πρόβλημα.

Χρήση και Αναφορά του Twitter API

Ήρθε η ώρα να ορίσουμε τη διεύθυνση URL του API για να λάβουμε τα δεδομένα του Twitter. Χρησιμοποιώ την παράμετρο min_faves. Ορίστε η εξήγηση της διεύθυνσης URL και μερικά κόλπα βελτιστοποίησης:

‘min_faves’ χρησιμοποιείται για τον ορισμό του ελάχιστου αριθμού αγαπημένων που πρέπει να έχει ένα tweet στα δεδομένα. Είναι μια πολύ χρήσιμη λειτουργία, αλλά δεν αναφέρεται στην τεκμηρίωση του Twitter API.

‘q’ αντιπροσωπεύει το ερώτημα ή τις λέξεις-κλειδιά που θέλετε να εισαγάγετε. Εδώ είναι σημαντικό να βεβαιωθείτε ότι δίνετε όσο το δυνατόν λιγότερες λέξεις-κλειδιά. Για παράδειγμα, ας φανταστούμε ότι θέλω tweets σχετικά με το Facebook και το Google. Αν δώσω και τα δύο ως λέξεις-κλειδιά, ας πούμε, FACEBOOK και GOOGLE, θα μου επιστρέψει μόνο 100 tweets το μέγιστο, καθώς αυτός είναι ένας περιορισμός. Αλλά αν εκτελέσω το ερώτημα δύο φορές – μία με το Facebook και μία με το Google, μπορώ να λάβω συνολικά 200 tweets. Με λίγα λόγια, είναι καλύτερο να χρησιμοποιείτε μία λέξη-κλειδί ανά ερώτημα.

‘lang’ αντιπροσωπεύει τη γλώσσα των φιλτραρισμένων tweets. Εφόσον θέλω να λάβω tweets στα Αγγλικά, το ορίζω σε ‘en’.

‘since’ είναι η ημερομηνία έναρξης της περιόδου από την οποία θέλετε να αναζητήσετε tweets. Αυτή η ημερομηνία έναρξης θα πρέπει να είναι εντός των τελευταίων 7 ημερών. Αυτή είναι άλλη μια λειτουργία που δεν τεκμηριώνεται στην Τεκμηρίωση του Twitter API.

‘until’ αντιπροσωπεύει την ημερομηνία λήξης της επιθυμητής περιόδου σας. Λογικά, θα πρέπει επίσης να είναι εντός των τελευταίων 7 ημερών. Επίσης δεν τεκμηριώνεται στην Τεκμηρίωση του Twitter API.

‘result_type’ αντιπροσωπεύει το είδος των tweets που θέλετε. Έχει 3 τιμές:

‘recent’ δίνει τα πιο πρόσφατα tweets, δηλαδή τα tweets στο τέλος της επιλεγμένης περιόδου.

‘popular’ δίνει τα πιο δημοφιλή tweets και ως εκ τούτου χάνει πολλά tweets. Θα λαμβάνετε πάντα τα tweets με τα περισσότερα αγαπημένα (faves) και retweets. Το min_faves χαρακτηριστικό δεν θα είχε καμία χρησιμότητα εδώ.

‘mixed’ δίνει έναν συνδυασμό πρόσφατων και δημοφιλών tweets.

‘count’ αντιπροσωπεύει τον μέγιστο αριθμό tweets στο αποτέλεσμα. Η προεπιλογή έχει οριστεί σε 15 και το μέγιστο είναι 100.

Με το μικτό result_type και τη χρήση του min_faves, μπορούμε να λάβουμε τον μέγιστο αριθμό tweets εκτελώντας το ερώτημα πολλές φορές.

Για περισσότερες τεκμηριωμένες λειτουργίες, μπορείτε επίσης να δείτε την Τεκμηρίωση του API του Twitter.

Αποθήκευση/Αυτόματη αποθήκευση των ανακτημένων δεδομένων Tweet

Ως επόμενο βήμα, πρέπει να ορίσετε μια μέθοδο αυτόματης αποθήκευσης/αποθήκευσης η οποία έχει μια παράμετρο ‘saveOverride’. Αυτό το βήμα απαιτείται απλώς για να καταργηθεί ο χρονικός περιορισμός της αυτόματης αποθήκευσης και να αποθηκευτεί το αρχείο. Για να το κάνω αυτό, δημιουργώ ένα t_last για να αποθηκεύσω τον χρόνο έναρξης του προγράμματος. Στη συνέχεια, αποκτώ πρόσβαση σε αυτό στο πρόγραμμα και ελέγχω αν έχουν περάσει 5 λεπτά από το t_last (τελευταίος χρόνος αποθήκευσης). Εάν έχουν περάσει περισσότερα από 5 λεπτά, επισημαίνω το ‘saveStatus’ ως True.

Στη συνέχεια, ελέγχω για το ‘saveOverride’, το οποίο απλώς σημαίνει ότι πρέπει να δώσω εντολή στο πρόγραμμά μου ότι, ό,τι κι αν γίνει, το αρχείο πρέπει να αποθηκευτεί τώρα. Για αυτό, ορίζω το saveStatus σε True.

Στη συνέχεια, εάν το ‘saveStatus’ είναι True, το σενάριο θα αλλάξει το t_last στον τρέχοντα χρόνο. Μετά από αυτό, ο κώδικας δημιουργεί ένα αντικείμενο λεξικού και εκτυπώνει “Autosave at [time]” ώστε να γνωρίζετε ότι τα δεδομένα αποθηκεύονται αυτόματα.

Στη συνέχεια, ελέγχω εάν το αρχείο εξόδου υπάρχει ήδη. Εάν υπάρχει, συνδυάζω τα δεδομένα και τα δεδομένα από ένα ήδη αποθηκευμένο αρχείο. Μετά τον συνδυασμό, τα εγγράφω στο ίδιο αρχείο. Εάν δεν υπάρχει, δημιουργώ ένα νέο αρχείο και στη συνέχεια εγγράφω τα δεδομένα σε αυτό το αρχείο.

Ως αποτέλεσμα, έχω προγραμματίσει σχεδόν ολόκληρη τη λειτουργικότητα που ήθελα.

Περαιτέρω Βελτιστοποίηση

Τέλος, ήρθε η ώρα να χρησιμοποιήσουμε αυτές τις συναρτήσεις. Γράφω έναν βρόχο while(1) που σημαίνει while(True). Αυτό ουσιαστικά κάνει την εντολή να εκτελείται για πάντα μέχρι να κληθεί κάποια δήλωση ‘break’ ή να προκύψει κάποια εξαίρεση.

Αρχικά, συλλέγω τα δεδομένα των tweets στο λεξικό ‘d’ χρησιμοποιώντας json.loads το οποίο μετατρέπει τα δεδομένα σε μορφή λεξικού. Στη συνέχεια, εκτελώ ένα try-catch/except στο μπλοκ κώδικα που εξάγει καταστάσεις από τα δεδομένα. Χρησιμοποιώ try-catch επειδή μερικές φορές το Twitter API δεν επιστρέφει δεδομένα αλλά ένα JSON που αναφέρει το σφάλμα. Δεν θέλω να σταματήσει το πρόγραμμά μου σε τέτοιες περιπτώσεις. Επίσης, θέλω να ανακτά σε ποιον αριθμό αιτήματος συμβαίνει αυτό και να αποθηκεύει τα δεδομένα μου από το Twitter χρησιμοποιώντας την εντολή autosave. Το Twitter μας επιτρέπει να κάνουμε 180 αιτήματα ανά 15 λεπτά. Αυτό είναι περίπου 12 αιτήματα ανά λεπτό ή ένα αίτημα κάθε πέντε δευτερόλεπτα. Για σιγουριά, προσθέτω μια εντολή sleep για να κάνει το πρόγραμμά μου να αδρανεί για 5 δευτερόλεπτα μετά την εκτέλεση μιας επανάληψης.

Μετά από αυτό, ο κώδικας θα εμφανίσει τον αριθμό των tweets που έχει συλλέξει το σενάριο μέχρι στιγμής.

Τέλος, ήρθε η ώρα για το σημαντικό κόλπο βελτιστοποίησης. Δοκίμαζα αυτό το σενάριο για σχεδόν μια εβδομάδα και έλαβα τον ακόλουθο αριθμό tweets για κάθε τιμή min_faves . Μπορώ να λάβω το πολύ 100 tweets ανά αίτημα και θέλω να λάβω όσα το δυνατόν περισσότερα. Επί του παρόντος, δεν υπάρχουν πολλά tweets με υψηλότερες τιμές min_faves αλλά θέλουμε να λάβουμε υπόψη τις φορές που, ίσως, η εταιρεία ή η λέξη-κλειδί είναι δημοφιλής. Η μέγιστη τιμή του min_faves μπορεί να είναι 999999.

Τιμή min_faves Αριθμός Tweets
100,000 1
90,000 1
80,000 1
70,000 2
60,000 3
50,000 6
40,000 6
30,000 12
25,000 12

Επομένως, χρησιμοποιώ μια λογική που θα λάμβανε tweets από την τιμή min_faves 60000 και στη συνέχεια τη μειώνει κατά 10000 κάθε φορά μέχρι να φτάσει στο 10000. Αλλά αν, ας πούμε, η λέξη-κλειδί είναι δημοφιλής και λάβω 100 tweets όταν εργάζομαι με την τιμή του min_faves να είναι 30000, αυτό πρόκειται να αυξήσει το min_faves σε 35000 και στη συνέχεια να λάβετε ξανά τα αποτελέσματα. Έτσι τώρα η νέα λογική είναι 5000 αντί για 10000. Ωστόσο, εάν η αλλαγή μειωθεί σε λιγότερο από 1000, του ζητώ να την αγνοήσει και να προχωρήσει στην αφαίρεση του 1000.

Καθορίζω ένα σταθερό διάστημα 1000 που min_faves θα πρέπει να μειωθεί κατά εάν min_faves είναι μικρότερο ή ίσο με 10000.

Στο τέλος του προγράμματος, το πρόγραμμα θα σας ενημερώσει ότι η εργασία ολοκληρώθηκε εμφανίζοντας ‘End’.

Μπορείτε να βρείτε ολόκληρο τον κώδικα στο GitHub.

Αυτά είναι όλα. Στο επόμενο σεμινάριο δεδομένων twitter, θα σας διδάξω πώς να ανακτάτε tweets σε πραγματικό χρόνο χρησιμοποιώντας το εργαλείο μεγάλων δεδομένων ‘Flume’. Μείνετε συντονισμένοι!

author

Akshay Nagpal

Συγγραφέας · CloudSigma

Ο Preslav Dobrev είναι Δημιουργικός Σχεδιαστής στην CloudSigma, με εστίαση στη συνεπή επιχειρηματική ταυτότητα μέσω παραδοσιακών και καινοτόμων καναλιών μάρκετινγκ. Διαθέτει την ικανότητα να συνδυάζει το καλλιτεχνικό όραμα με το στρατηγικό μάρκετινγκ για τη δημιουργία εντυπωσιακών αφηγήσεων επωνυμίας.

Σχόλια

Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.