[PYTHON] Expérience pour collecter des tweets pendant une longue période (préparation du programme (2))

Jusqu'à la dernière fois

Passez en revue la source pour le moment

C'était le dernier programme qui fonctionnait étonnamment bien malgré le fait qu'il ait été fait de manière tout à fait appropriée, mais comme il a été fait en l'imitant ~~ Est-ce vraiment bien? Je ne peux pas me débarrasser de la question. L'explication officielle est au niveau d'une feuille, et il n'y a pas de référence API. L'API Stream est en fait ~~ laissée sans surveillance sans demande ~~ N'est-elle pas populaire?

Il y a peut-être une page qui explique en détail quelque part, mais je peux à peine lire l'anglais donc je ne comprends pas bien. Même si vous utilisez Tweepy, ne voyez-vous rien d'autre que l'essentiel, ou pensez-vous qu'il est explicite à l'exception des parties introduites, et quelle que soit la façon de l'utiliser au début, il y a moins de façons de l'utiliser que vous ne l'imaginiez.

Si vous ne savez pas, vous devez lire la source.

Quoi qu'il en soit, il y a trop peu d'informations sur l'API Stream que je ne l'imaginais. Surtout, laisser le document officiel sans surveillance est le moins à la mode. J'ai peur parce que la fonction que je veux est "réellement implémentée" ou quelque chose comme ça. Si cela se produit, vous devez vérifier la source directement . Heureusement, Tweepy est un logiciel open source publié sous la licence MIT, publié sur GitHub. En d'autres termes, ce n'est pas impossible si vous essayez de le lire - si vous avez le temps, la motivation et la capacité - cela devrait l'être.

Regardons la source en particulier.

streaming.py , il y avait une source avec le nom lui-même, alors ouvrez ce Quand je l'essaye, il y a trois classes. * StreamListener * ReadBuffer * Stream Les deux autres que ReadBuffer sont utilisés dans le premier programme que j'ai créé. Si la classe ReadBuffer est exactement ce à quoi elle ressemble, vous pouvez la laisser tranquille pour le moment. Jetons un coup d'œil à "StreamListener" et "Stream".

Classe StreamListener

N'est-il pas correct de comprendre que la classe qui transmet les informations reçues par la classe Stream et les traite réellement? En fait, après avoir hérité de cette classe, la méthode de la classe parente est surchargée pour implémenter l'opération d'origine, et à part ça, l'opération prédéterminée de la classe parente est effectuée ... , n'est-ce pas? </ petit>

De nombreuses méthodes pouvaient être annulées. Ci-dessous la liste (vérifiez la description par rapport à la référence dans dev.twitter.com ) ..

  • on_connect
    Appelé une fois connecté.
    L'opération par défaut est "passer" ... Ne rien faire? Pourquoi n'est-ce pas un retour contrairement aux autres? ?? </ petit>
  • on_data
    Appelé lorsque les données à traiter volent.
    Vérifiez les données acquises dans ce processus et appelez chaque méthode ci-dessous (oblique).
  • keep_alive
    Appelé lorsqu'une interruption de connexion est envoyée sans flux de données.
    • on_status *
      Appelé lorsque vous recevez un tweet dit général.
  • on_exception
    Appelé lorsqu'une exception se produit pendant le traitement sur un objet Stream (s'il s'agit d'une erreur appelable).
    • on_delete *
      Appelé lorsqu'un message a été supprimé.
    • on_event * (UserStream uniquement)
      Appelé pour des notifications telles que RT, aimé et bloqué.
    • on_direct_message * (UserStream uniquement)
      Appelé lorsque DM arrive.
    • on_friends * (Uniquement pour User Stream)
      Appelé au démarrage du User Stream. Vous recevrez une liste des identifiants de vos amis.
    • on_limit *
      Le message qui aurait dû être filtré et délivré est toujours appelé lorsque le débit est dépassé. Vous pouvez également obtenir le numéro qui n'a pas pu être obtenu.
  • on_error
    Appelé lorsqu'un code d'état autre que 200 est renvoyé pendant le traitement sur l'objet Stream.
  • on_timeout
    Appelé lorsqu'une connexion Stream expire.
    • on_disconnect *
      Appelé lorsqu'il est déconnecté du côté Twitter. Avec message.
    • on_warning *
      Appelé lorsqu'un avertissement de traitement provient du côté Twitter. Avec message.

Qu'est-ce que c'est, n'y a-t-il pas un bon message envoyé? Il semble y avoir un bon message «connecté». J'étais un peu soulagé. Pour la méthode appelée depuis on_data, il semble qu'elle sera déconnectée si la valeur de retour est False. on_error est implémenté pour retourner False s'il n'est pas remplacé. Cela ne peut être vu qu'en regardant la classe Stream et en vérifiant l'appelant.

À propos, les messages envoyés par Stream API sont publiés sur dev.twitter.com . Cependant, il semble que les messages "status_withheld", "user_withheld", "scrub_geo", "for_user" et "control" ne sont pas vérifiés par on_data. Est-ce parce que cela n'a pas beaucoup de sens? Si vous voulez les voir, vous devez remplacer on_data et remplacer la plupart des méthodes ci-dessus. Je ne sais pas.

Classe de flux

Cela ressemble à une classe qui implémente des boucles de connexion, de déconnexion et de réception. Définissez les paramètres initiaux de connexion avec "init (constructeur)" et appelez les méthodes correspondant à l'API Stream de "userstream", "firehose", "retweet", "sample", "filter" et "sitestream" pour passer par "_start". Appelez "_run".

La boucle de "while self.running:" effectue un traitement de connexion spécifique, et la boucle d'exécution après connexion est gérée par "_read_loop". Si le processus de connexion échoue avec "self.session.request ()", appelez on_error de la classe StreamListener, sortez de la boucle While dans le cas de False et reconnectez-vous en attendant un certain temps tout en tournant le compteur d'erreurs dans les autres cas ...

** N'y a-t-il pas une fonction de reconnexion! ** **

C'est vrai, il n'y a aucune raison de ne pas implémenter l'histoire gênante dans la bibliothèque. Ce n'est pas une histoire de laisser l'utilisateur le faire.

L'obstacle est soudainement tombé pour la spécification d'exigence la plus importante, "** Une fonction à reconnecter en cas de déconnexion inattendue **". Par contre, je voudrais demander une heure pourquoi les détails de ces fonctions importantes ne sont pas décrits de manière facile à comprendre ...

Par ailleurs, dans "\ _read_loop", "on_data" de la classe StreamListener est appelé, et si False est renvoyé ici, la boucle est échappée. A ce moment, self.running dans lequel False est stocké est également vu dans la boucle de connexion de l'appelant "_run", et la boucle de connexion est quittée et la session est terminée.

Regardez la source et décidez d'une politique.

prendre le coeur. En regardant la source

  1. La méthode qui part de on_data de la classe StreamListener est déconnectée et se termine lorsque False est renvoyé.
    → Remplacez tout ce qui renvoie False dans la méthode d'origine pour qu'elle renvoie True.
  2. Lorsque on_error et on_timeout renvoient False, ils se terminent sans se reconnecter.
    → Remplacez ceci et renvoie True.
  3. on_exception ne peut pas être traité, alors pensez à des moyens

En regardant spécifiquement la source, il n'y a rien qui correspond à (1). Je veux dire, il ne renvoie pas True ou False comme valeur de retour. ...... Est-ce que c'est correct? * Je vérifie avec "est faux:", donc c'est OK * parce que ce n'est pas égal en comparaison quand la valeur ne revient pas? Concernant (2), on_timeout ne retourne pas de valeur et retourne, donc c'est OK si vous remplacez seulement on_error et retournez True. (3) Que dois-je faire?

Cependant, pour les avertissements comme pour les erreurs, il semble qu'il sera utile de conserver un journal plus tard, alors écrasez "on_connect" "on_disconnect" "on_limit" "on_timeout" "on_warning" "on_exception" À

Traiter les exceptions

Les exceptions sont des exceptions, il est donc difficile de les gérer. L'exception dans la boucle de traitement de la classe Stream est déclenchée après l'appel de on_exception de StreamListener, il devrait donc être possible de l'exclure au niveau de l'appelant. Sinon, que se passe-t-il si cela se produit pendant le traitement individuel dans StreamListener? Cependant, si vous suivez l'appelant, ce sera un StreamListener, donc il finira par s'y rassembler ...? S'il s'arrête toujours avec une exception ... Souhaitez-vous appeler le script en boucle avec un fichier batch? ??

Source jusqu'à présent

Sur la base de la priorité absolue "** Possibilité de se reconnecter en cas de déconnexion inattendue **", la source ressemble jusqu'à présent à ceci.

tweetcheck2.py


#!/usr/bin/env python
# -*- coding:utf-8 -*-

import tweepy

#Obtenez-le vous-même et mettez-le
CK = ''   # Consumer Key
CS = ''   # Consumer Secret
AT = ''   # Access Token
AS = ''   # Accesss Token Secert

class Listener(tweepy.StreamListener):
    def on_status(self, status):
        print('Tweet')    #Je ne peux pas le lire de toute façon, donc je vais juste vous dire qu'il y avait un message
        return True

    def on_error(self, status_code):
        print('Erreur est survenue: ' + str(status_code))
        return True

    def on_connect(self):
        print('Connecté')
        return

    def on_disconnect(self, notice):
        print('Débranché:' + str(notice.code))
        return

    def on_limit(self, track):
        print('La limite de réception s'est produite:' + str(track))
        return

    def on_timeout(self):
        print('temps libre')
        return True

    def on_warning(self, notice):
        print('Message d'alerte:' + str(notice.message))
        return

    def on_exception(self, exception):
        print('Erreur d'exception:' + str(exception))
        return


#Traitement principal d'ici
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

while True:     #boucle infinie
        try:
                listener = Listener()
                stream = tweepy.Stream(auth, listener)

                #Sélectionnez-en un et décommentez-le.
                #stream.filter(track=['#xxxxxx'])
                stream.sample()
                #stream.userstream()
        except:
                pass    #Ignorer toutes les exceptions et boucle

Assurez-vous d'afficher tous les messages qui menacent l'exécution, tels que les erreurs et les avertissements, et reconnectez-vous si une erreur se produit. Dans le cas peu probable où une exception se produirait, la section de traitement principale l'exclura, ignorera l'exception, la bouclera et la réexécutera.

Fini? …… Ctrl + C …… </ petit>

(Quand je l'ai essayé, je ne pouvais pas l'arrêter (stupide. Y a-t-il un moyen d'échapper à la boucle uniquement lorsque Ctrl + C?)

La forme de base du traitement lié à Twitter est probablement comme ça pour le moment. Je me demande si c'est vraiment bien, mais ... ** Je cherche Tsukkomi . La prochaine fois, je commencerai du côté MongoDB, la priorité la plus élevée, " Stockage des données reçues dans MongoDB **". (Continuer)

Recommended Posts