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.
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. 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.
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)
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