[PYTHON] Soyez prudent lorsque vous récupérez des tweets à intervalles réguliers avec l'API Twitter

Si vous y réfléchissez bien, c'est assez naturel, mais j'y suis assez accro, alors je vais le laisser comme note de service.

Déclencheur

J'ai écrit un script qui utilise l'API Twitter pour récupérer les tweets en Python et les enregistrer dans la base de données toutes les 15 minutes à utiliser pour les programmes d'apprentissage en profondeur, mais parfois le nombre de tweets récupérés a augmenté anormalement. FullSizeRender.jpg Normalement, cela prend environ 20 tweets / 15 minutes en moyenne, mais du coup près de 600 à 700 cas ne sont acquis que dans certains endroits. Cela se produit presque tous les jours, mais cela ne se produit pas à une heure fixe, et le nombre de fois que cela se produit dans une journée est indéfini.

Programme d'acquisition de tweets que j'utilisais

C'était un programme qui enregistre l'ID du dernier tweet au moment de l'acquisition précédente, et à la prochaine exécution, il remonte du dernier tweet à ce tweet et l'acquiert.

--------------------Cette fois l'acquisition--------------------
Tweet 1 ID 899673612013064192<-Redescendez d'ici
Tweet 2 Identifiant 899673575619141633
Tweet 3 Identifiant 899673508619276288
.         .          .
.         .          .
.         .          .
Tweet n ID 899669914251796480
--------------------Cette fois l'acquisition--------------------
--------------------Dernière acquisition--------------------
Tweet 1' ID 899669914251796480 <-Terminez lorsque vous arrivez ici
Tweet 2' ID 899669747448414209
Tweet 3' ID 899669628170911750
.         .          .
.         .          .
.         .          .
Tweet n' ID 899668363969941506 

Comme indiqué ci-dessus, 100 tweets sont extraits du dernier tweet vers le bas, et si l'ID du tweet correspond au dernier ID obtenu la dernière fois, il se termine. C'était comme ça en Python:

fetch.py


for tweet in fetched:
    if tweet["id_str"] == last_time_id: # last_time_id est une chaîne
        break
    else:
        tweets.append(tweet)

Causes et contre-mesures

La cause était que le tweet avec last_time_id avait été supprimé avant la prochaine acquisition. Ou le retweet peut avoir été annulé. En d'autres termes, il n'y a plus de tweets qui correspondent à l'ID de last_time_id, donc les nouvelles acquisitions seront répétées pour toujours sans correspondre à l'ID de tweet [" id_str "]. Le ʻid_str dans la réponse de l'API est la version de chaîne de caractères de la valeur numérique originale ʻid (il semble qu'une chaîne de caractères est préparée car une erreur peut se produire en fonction de la langue s'il s'agit d'une valeur numérique), mais j'utilise ceci Il semble que c'était la cause. Les ID de Tweet sont des nombres qui augmentent avec le temps, vous pouvez donc éliminer le bogue en procédant comme suit:

fetch_fixed.py


for tweet in fetched:
    if tweet["id"] <= int(last_time_id):
        break
    else:
        tweets.append(tweet)

J'ai juste changé les deux côtés en nombres et l'ai changé en <=. Avec cela, même si le tweet avec l'ID de last_time_id est supprimé, le tweet juste avant a un ID plus petit, vous pouvez donc le casser à ce stade.

Recommended Posts

Soyez prudent lorsque vous récupérez des tweets à intervalles réguliers avec l'API Twitter
Soyez prudent lorsque vous exécutez CakePHP3 avec PHP7.2
Faites attention au type lorsque vous créez un masque d'image avec Numpy
Tweetez régulièrement avec l'API Twitter Go language
Soyez prudent lorsque vous travaillez avec des fichiers texte compressés au format gzip
Accédez à l'API Twitter après l'authentification Oauth avec Django
Soyez prudent lors de la différenciation des vecteurs propres d'une matrice
Soyez prudent lors de la lecture de données avec des pandas (spécifiez dtype)
Essayez d'utiliser l'API Twitter rapidement et facilement avec Python
Solution lorsque l'image ne peut pas être affichée avec tkinter [python]
Rationalisez la collecte d'informations avec l'API Twitter et les robots Slack
Utiliser l'API Twitter avec Python
Essayez d'utiliser l'API Twitter
Essayez d'utiliser l'API Twitter
Soutenez-vous avec l'API Twitter
Appelez l'API avec python3.
Rechercher des tweets Twitter avec Python
Update_with_media réussi avec l'API Twitter
Soyez prudent lorsque vous spécifiez la valeur d'argument par défaut dans la série Python 3
[Dernière version] Faites parler le bot à intervalles réguliers avec discord.py
[Python] Code qui peut être écrit avec la mort cérébrale au début lors du scraping en tant que débutant