[PYTHON] Exporter le contenu acquis par Twitter Streaming API au format JSON

J'ai reçu un tweet avec Streaming et j'ai essayé d'exporter un fichier JSON, alors prenez note. Quand j'ai recherché, j'ai trouvé que de nombreux tweets avaient été obtenus en utilisant tweepy, alors peut-être que c'est le courant dominant? Alors ne l'utilisez pas! Je n'ai pas utilisé tweepy car je ne pouvais pas utiliser ce que j'ai fait avec l'API REST tel quel. Au fait, python3.5

Référez-vous à cette zone https://dev.twitter.com/streaming/reference/post/statuses/filter http://qiita.com/kenmatsu4/items/23768cbe32fe381d54a2 http://qiita.com/yubais/items/dd143fe608ccad8e9f85 http://qiita.com/Gen6/items/ce83a77217a86a26d907

La source

# -*- coding:utf-8 -*-

from requests_oauthlib import OAuth1Session
import json, datetime, time, sys

KEYS = { #Répertoriez ci-dessous les clés que vous avez obtenues avec votre compte
    'consumer_key':'*******',
    'consumer_secret':'*******',
    'access_token':'*******',
    'access_secret':'*******'
   }

#Connectez-vous à l'API Twitter
twitter = OAuth1Session(KEYS['consumer_key'],KEYS['consumer_secret'],
                        KEYS['access_token'],KEYS['access_secret'])

nRstTm = 15 #Tarif Temps d'attente limité
stKeyWrd = 'twitter' #Rechercher un mot

url = 'https://stream.twitter.com/1.1/statuses/filter.json'

#Convertir l'heure du tweet en heure standard japonaise
def str_to_datetime_jp(datetimes):
    dts = datetime.datetime.strptime(datetimes,'%a %b %d %H:%M:%S +0000 %Y')
    return(dts+ datetime.timedelta(hours=9)).strftime("%Y-%m-%d %H:%M:%S")

f = open("teststream.json", "w",encoding='utf-8')
while(True): 
    try:
        req = twitter.post(url,
                    data= {"track":stKeyWrd},
                    stream = True)

        if req.status_code == 200: 
            for line in req.iter_lines():
                work = json.loads(line.decode('utf-8'))
                workuser = work['user']
                tweet_json = {"tweetId":workuser["id"],
                              "name":workuser["name"],
                              "screen_name":workuser["screen_name"],
                              "text":work["text"],
                              "created_at":str_to_datetime_jp(work["created_at"])
                              } 
                print('write')
                json.dump(tweet_json, f, ensure_ascii=False, indent=2,sort_keys=True)

        #Si vous accédez trop en peu de temps, vous obtiendrez une erreur 420, alors attendez
        elif req.status_code == 420:
            print('Rate Limited:',nRstTm,'Attendez quelques minutes')
            time.sleep(nRstTm)
        else:
            #Pour le moment, le traitement est omis
            print('req.status_code',req.status_code)
            break

    #S'il ne peut pas être acquis par flux, l'exception suivante se produira, alors acquérez-le à nouveau.
    except json.JSONDecodeError as e:
        print('Réacquérir')
        pass
    except KeyboardInterrupt:
        print('Sortie de traitement')
        f.close()
        break
    except:
        print('except', sys.exc_info())
        pass

Où il est coincé avec le traitement

Commencez le streaming ici, et si l'état est 200, bouclez et écrivez JSON. Mon niveau est trop bas et c'est juste honnête.

La chose qui est restée bloquée est req.iter_lines (), qui traite un par un.

            for line in req.iter_lines():
                work = json.loads(line.decode('utf-8'))

Dans la manière de passer des données ici, la ligne de variable est de type bytes, donc si vous simplement json.loads, vous vous fâcherez contre le type str. Je ne sais pas si je dois le convertir avec decode ('utf-8').

De plus, si vous diffusez quelque chose qui n'a pas du tout été tweeté, même si vous voulez json.loads, ne le mettez pas dans la ligne variable! Alors je l'ai attrapé ci-dessous.

    except json.JSONDecodeError as e:
        print('Réacquérir')
        pass

Ce que je ne comprends pas

Il y a deux choses que je ne comprends pas quand je l'implémente, donc je ne peux pas bien le couvrir.

  1. Je ne parviens pas à trouver un mot contenant un mot auxiliaire par recherche par mot-clé
  2. 420 erreurs se produisent

Je ne parviens pas à trouver un mot contenant un mot auxiliaire dans une recherche par mot clé

Apparemment, si certains mots sont attachés avant et après le mot recherché par mot-clé, il ne peut pas être obtenu. https://github.com/tsupo/Twitter-API-Specification--written-in-Japanese-/blob/master/twitterAPI.txt

Par exemple, vous pouvez rechercher "Aikatsu!" Par mot-clé et utiliser une balise de hachage (espace demi-largeur entre les mots) comme "#Aikatsu!", Mais la chose la plus mignonne à propos d'Aikatsu! C'est Aoi Kiriya. Cela ne vient pas immédiatement.

Étoiles Aikatsu! Honnêtement, je suis en difficulté car il est difficile de connaître l'état réel de Twitter.

Y a-t-il un moyen de contourner cela? Confiance Niki Professeur Onashisu!

420 erreur

Si vous essayez de vous connecter et de vous reconnecter plusieurs fois dans un court laps de temps, vous serez informé que vous êtes trop connecté et vous obtiendrez une erreur 420. https://dev.twitter.com/overview/api/response-codes https://dev.twitter.com/rest/public/rate-limiting

Il est normal d'attendre une reconnexion avec une erreur 420, mais je n'ai aucune idée du nombre de minutes à attendre. Pourquoi le streaming n'est-il pas explicitement indiqué lorsqu'il s'agit de REST?

Pour être honnête, j'obtiens cette erreur et les tweets circulent en attendant la reconnexion, donc j'aimerais éviter cette erreur pour qu'elle ne s'affiche pas, mais je ne sais pas comment le faire. Tu ne peux pas le faire en premier lieu?

Je pense qu'il existe une forte possibilité que la mise en œuvre soit mauvaise. Je pense qu'il est mauvais d'attaquer plusieurs fois comme REST.

Recommended Posts

Exporter le contenu acquis par Twitter Streaming API au format JSON
Éliminez les caractères japonais brouillés dans les données JSON acquises par l'API.
Accéder à l'API Twitter avec Python
Tweet à l'aide de l'API Twitter en Python
Sauvegardez les données vocales acquises par le navigateur au format wav sur le serveur
Client de streaming Twitter à apprécier dans le terminal
Formatez et affichez le XML acquis par l'API OpenWeatherMap.
Créez un robot de réponse automatique en temps réel à l'aide de l'API Twitter Streaming
Formatez facilement JSON avec Python
Gzip compresser les données en streaming
Essayez d'utiliser l'API Twitter
Essayez d'utiliser l'API Twitter
[Python / Django] Créer une API Web qui répond au format JSON
Jouez en accédant à l'API Riot Games en Python Première moitié
Comment copier et coller le contenu d'une feuille au format JSON avec une feuille de calcul Google (en utilisant Google Colab)
Obtenir l'API arXiv en Python
Frappez l'API Sesami en Python
Accédez à l'API Web en Python
Acquisition continue par l'API Twitter (Astuces)
Enregistrez l'arbre phylogénétique dessiné par la fonction draw_ascii de Bio.Phylo au format texte
Exemple de code pour obtenir oauth_token et oauth_token_secret de l'API Twitter en Python 2.7