[PYTHON] Essayez d'analyser les tendances Twitter

Bonjour. Quand je me suis réveillé le matin, j'ai été surpris que «#Protest contre l'amendement à la loi du bureau du procureur» soit sur la tendance Twitter, alors je l'ai analysé. Twitter qui regorge de tweets politiques n'est pas Twitter. Twitter, que je connais, est un monde rempli de "Kintama Glitter Friday". Je ne pense pas qu'il y aura 2 millions de tweets politiques sur Twitter. image.png Shinzo Abe ... C'est un mensonge ...

Tout d'abord, mon arrière-grand-père a dit pendant la guerre qu'il ne fallait pas croire ces chiffres comme une prémisse. Quand j'ai vu cela, j'ai d'abord soupçonné que "la tendance intentionnelle était causée par Bot et spam." Il existe également un risque de publication multiple par la même personne. Heureusement, j'ai postulé pour l'API Twitter il y a quelques mois, et maintenant je peux accéder librement à la recherche Twitter depuis le programme, donc j'aimerais écrire le code immédiatement.

codage

from requests_oauthlib import OAuth1Session
import json
from datetime import datetime
import calendar
import csv
import time
from bs4 import BeautifulSoup

#Code pour accéder à l'API Twitter
consumer_key = *****
consumer_key_secret = *****
access_token = *****
access_token_secret = *****


#Accéder à l'API Twitter
twitter = OAuth1Session(consumer_key, consumer_key_secret, access_token, access_token_secret)

#Définissez une fonction de recherche sur Twitter. que est le mot de recherche, bot est de savoir s'il faut inclure le bot, le nombre est le nombre de tweets acquis, max_id est l'ID maximum du Tweet à rechercher.

def get(que,max_id):
    params = {'q': que, 'count': 100, 'max_id': max_id, 'modules': 'status', 'lang': 'ja'}
    #Accédez à Twitter.
    req = twitter.get("https://api.twitter.com/1.1/search/tweets.json", params=params)

    #Si l'accès réussit, les informations du Tweet sont conservées.
    if req.status_code == 200:
        search_timeline = json.loads(req.text)
        limit = req.headers['x-rate-limit-remaining']
        reset = int(req.headers['x-rate-limit-reset'])
        print("API remain: " + limit)
        if int(limit) == 1:
            print('sleep')
            time.sleep((datetime.fromtimestamp(reset) - datetime.now()).seconds)

    #En cas d'échec, mettez fin au processus.
    elif req.status_code == 503:
        time.sleep(30)
        req = twitter.get("https://api.twitter.com/1.1/search/tweets.json", params=params)
        if req.status_code == 200:
            search_timeline = json.loads(req.text)
            #Repos API
            limit = req.headers['x-rate-limit-remaining']
            reset = int(req.headers['x-rate-limit-reset'])
            print("API remain: " + limit)
            if limit == 0:
                print('sleep')
                time.sleep((datetime.fromtimestamp(reset) - datetime.now()).seconds)

        else:
            print(req.status_code)
            return [], 0
    else:
        print(req.status_code)
        return [], 0

    for i in range(len(search_timeline['statuses'])):
        bs3obj = BeautifulSoup(search_timeline['statuses'][i]['source'], 'html.parser')
        search_timeline['statuses'][i]['source'] = bs3obj.text


    #Renvoie une liste d'informations sur les Tweets lorsque cette fonction est exécutée.
    return search_timeline['statuses'], search_timeline['statuses'][-1]['id']


def TweetSearch(que, bot, rep):
    max_id = 1259158522710730000 - 1
    global search_timeline, tweetTime
    tweetList = []
    #Spécifiez s'il faut exclure les Tweets par bot.
    if bot:
        que = str(que + ' -bot -rt')
    else:
        que = str(que + ' -rt')

    for i in range(rep):
        time.sleep(1)
        result, max_id = get(que,max_id)
        if max_id == 0:
            break

        tweetList.extend(result)


    return tweetList



word = '#Protestation contre le projet de loi modifiant la loi sur le bureau du procureur'
tweetList = TweetSearch(word,False,200)

head = [i for i in tweetList[0]]

#Sortie vers un fichier CSV
with open('tweetanalysis_02.csv','w',newline='', encoding='utf_8') as f:
    writter = csv.writer(f)
    writter.writerow(head)
    for i in tweetList:
        writter.writerow([i[key] for key in head])

Il y a une partie relativement lâche pour finir à la hâte. Pour ajouter une chose, un identifiant est attribué à chaque Tweet et vous pouvez le vérifier en regardant les 18 derniers chiffres de l'URL du Tweet. Et la valeur prise par cet identifiant devient plus grande à mesure que l'heure du Tweet devient plus tardive. En utilisant cette propriété pour limiter les recherches de Tweet avec max_id, vous pouvez empêcher l'extraction de Tweets en double lorsque plusieurs requêtes sont soumises. (Le nombre de Tweets pouvant être recherchés avec une seule requête peut aller jusqu'à 100 Tweets)

Jetez un œil aux données

Exécutez ce programme, 5/9 23:46 --5 / 10 2:58 37935 Tweets enregistrés au format CSV.

À ce stade, vous pouvez voir qu'il n'atteint pas massivement 1 million. (En fait, à ce stade, la tendance aurait dû dépasser 1 million de Tweets) Soit dit en passant, il y a un élément appelé "retweet_count" dans les données acquises, et vous pouvez savoir combien de fois chacun des Tweets acquis a été retweeté. Si vous les additionnez brièvement, ce sera 391675, il semble donc préférable de penser que la tendance de Twitter inclut le Retweet. (En fait, les Tweets avant le 09/05 à 23h46 sont également considérés comme contribuant à la tendance) C'est aussi la première question posée ・ Publié par le même utilisateur ・ Bot, publication de spam Vérifions brièvement. Je ne suis pas une personne formidable qui peut gérer le CSV avec un logiciel statistique tel que R, donc cette fois c'est une méthode classique, mais je vais l'essayer facilement en utilisant Excel. (Parce que la quantité de données n'est pas si grande et je pensais que mon PC pourrait y résister)

Dans l'onglet [Données], cochez "utilisateur" dans l'élément [Supprimer les doublons] et vérifiez![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com /0/596394/04981035-8aa0-125f-ceee-1b3044ed2dc4.png) Effacer! image.png Oh. Environ 1/4 des Tweets ont été supprimés en tant qu'utilisateurs en double. Bien sûr, cela ne vous dit pas à lui seul si le même utilisateur a été dérangé ou si de nombreux utilisateurs ont été tweetés plusieurs fois, mais au moins vous pouvez voir que le nombre d'utilisateurs qui tweetent est beaucoup moins qu'il n'y paraît.

Ensuite, découvrons la source de publication des données. Il analyse les données en supprimant les doublons d'utilisateurs. image.png En conséquence, Twitter pour iPhone représentait plus de la moitié. En outre, en ce qui concerne d'autres choses, il existe de nombreux clients officiels tels que «Twitter pour iPad» et «Client Web Twitter» et des clients non officiels, et vous pouvez voir qu'il y a si peu de tweets en raison de la publication automatique et du spam. (En passant, vous ne pouvez pas définir la source de votre propre Tweet qui inclut la chaîne "Twitter", donc tant que Twitter est inclus dans la chaîne, vous pouvez conclure que 100% des messages ne sont pas publiés par spam.)

C'est simple, mais j'ai analysé les tendances Twitter. J'ai téléchargé le code Python et le fichier CSV obtenu sur github.  https://github.com/ogadra/twitter_analysis La prochaine fois, j'aimerais augmenter les données et les analyser avec R etc.

Postscript

Je ne suis pas sûr, mais il semble y avoir une omission d'acquisition. Je ne sais toujours pas si cela utilise l'API Twitter ou si je suis mauvais, alors je vais essayer de l'obtenir à nouveau.

Recommended Posts

Essayez d'analyser les tendances Twitter
J'ai commencé à analyser
Essayez d'implémenter yolact
Essayez d'estimer le nombre de likes sur Twitter
Essayez de diviser les données Twitter en SPAM et HAM
Essayez de supprimer des tweets en masse à l'aide de l'API de Twitter
Essayez de comprendre Python soi
Essayez d'utiliser l'API Twitter
Publier sur Twitter en utilisant Python
Essayez d'améliorer la précision de l'estimation du nombre de Twitter
Essayez d'utiliser l'API Twitter
[Python] Essayez d'analyser le fichier wav (Ver sans plug-in supplémentaire)
Essayez de sélectionner une langue
Essayez d'analyser le mahjong familial en ligne à l'aide de Python (PARTIE 1: Prendre des données)
Essayez de dessiner une courbe de Bézier
Essayez d'exploiter Facebook avec Python
[Lambda] [Python] Publier sur Twitter depuis Lambda!
Essayez de profiler avec ONNX Runtime
Essayez d'utiliser pynag pour configurer Nagios
Essayez d'introduire le thème sur Pelican
Essayez de calculer Trace en Python
Essayez de mettre des données dans MongoDB
Essayez de convertir la CLI cloudmonkey en python3 -1
Essayez d'obtenir des statistiques en utilisant e-Stat
Essayez Cython dans les plus brefs délais
Publiez facilement sur Twitter avec Python 3
Essayez de produire de l'audio avec M5 STACK
Le moyen le plus rapide d'essayer EfficientNet
La façon la plus simple d'essayer PyQtGraph
Script pour automatiser la connexion OAuth pour Twitter
Mettez Cabocha 0.68 dans Windows et essayez d'analyser la dépendance avec Python