Obtenez une grande quantité de données Twitter de Starba avec python et essayez l'analyse de données Partie 1

J'en ai toujours marre du Mac Book Air, et je suis gêné de rester longtemps, je voudrais remercier M. Starbucks et analyser les données pour m'aider. Il s'agit d'un article sur l'obtention d'un grand nombre de tweets contenant "Stava" dans le texte et d'essayer de découvrir ce que l'analyse des données peut fournir. Ce n'est pas une tige, mais elle peut être une tige dans le sens de redonner à M. Stava (・ ω ・)


Partie 1: Importez des données avec les API REST Twitter et importez-les dans mongoDB (cette fois) http://qiita.com/kenmatsu4/items/23768cbe32fe381d54a2

Partie 2: Séparation du spam des données Twitter acquises http://qiita.com/kenmatsu4/items/8d88e0992ca6e443f446

Partie 3: Pourquoi le nombre de tweets a-t-il augmenté après un jour? http://qiita.com/kenmatsu4/items/02034e5688cc186f224b

Partie 4: Visualisation des informations de localisation cachées dans Twitter http://qiita.com/kenmatsu4/items/114f3cff815aa5037535


1. Obtenez des informations de compte pour vous connecter à l'API Twitter

Avec Google Teacher ["compte api twitter"](https://www.google.co.jp/search?q=twitter+api+%E3%82%A2%E3%82%AB%E3%82%A6%E3 Si vous recherchez% 83% B3% E3% 83% 88), vous trouverez de nombreux sites qui décrivent clairement comment s'inscrire, donc des informations pour accéder à l'API en se référant à eux (notamment consumer_key, consumer_secret, access_token) , Access_secret).

2. Installation de diverses bibliothèques requises

On suppose que l'environnement Python de base tel qu'iPython est en place. Si vous avez la bibliothèque ici, c'est presque correct. Il installe également une bibliothèque d'authentification pour l'utilisation des API REST Twitter.

pip install requests_oauthlib

De plus, comme mongoDB est utilisé pour stocker des données, ici et [ici](http: // qiita. Installez en vous référant à com / hajimeni / items / 3c93fd981e92f66a20ce). Pour un aperçu de mongoDB, voir "Thin book of MongoDB".

Afin d'accéder à mongoDB depuis Python, nous allons également introduire pymongo.

pip install pymongo

3. Processus d'initialisation

from requests_oauthlib import OAuth1Session
from requests.exceptions import ConnectionError, ReadTimeout, SSLError
import json, datetime, time, pytz, re, sys,traceback, pymongo
#from pymongo import Connection     #La classe de connexion est obsolète, alors passez à MongoClient
from pymongo import MongoClient
from collections import defaultdict
import numpy as np

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

twitter = None
connect = None
db      = None
tweetdata = None
meta    = None

def initialize(): #Traitement initial tel que les informations de connexion Twitter et le traitement de la connexion à mongoDB
    global twitter, twitter, connect, db, tweetdata, meta
    twitter = OAuth1Session(KEYS['consumer_key'],KEYS['consumer_secret'],
                            KEYS['access_token'],KEYS['access_secret'])
#   connect = Connection('localhost', 27017)     #La classe de connexion est obsolète, alors passez à MongoClient
    connect = MongoClient('localhost', 27017)
    db = connect.starbucks
    tweetdata = db.tweetdata
    meta = db.metadata
    
initialize()

4. Rechercher Tweet

Utilisez le code ci-dessous pour importer des tweets qui incluent "Stava" dans le texte dans mongoDB.

#Obtenez 100 tweets à partir des API REST Twitter en spécifiant un mot de recherche
def getTweetData(search_word, max_id, since_id):
    global twitter
    url = 'https://api.twitter.com/1.1/search/tweets.json'
    params = {'q': search_word,
              'count':'100',
    }
    # max_Défini si l'ID est spécifié
    if max_id != -1:
        params['max_id'] = max_id
    # since_Défini si l'ID est spécifié
    if since_id != -1:
        params['since_id'] = since_id
    
    req = twitter.get(url, params = params)   #Obtenez des données de Tweet

    #Décomposition des données acquises
    if req.status_code == 200: #En cas de succès
        timeline = json.loads(req.text)
        metadata = timeline['search_metadata']
        statuses = timeline['statuses']
        limit = req.headers['x-rate-limit-remaining'] if 'x-rate-limit-remaining' in req.headers else 0
        reset = req.headers['x-rate-limit-reset'] if 'x-rate-limit-reset' in req.headers else 0              
        return {"result":True, "metadata":metadata, "statuses":statuses, "limit":limit, "reset_time":datetime.datetime.fromtimestamp(float(reset)), "reset_time_unix":reset}
    else: #Si ça échoue
        print ("Error: %d" % req.status_code)
        return{"result":False, "status_code":req.status_code}

#Renvoie la chaîne de caractères dans le type de date, y compris le fuseau horaire de l'heure japonaise 2
def str_to_date_jp(str_date):
    dts = datetime.datetime.strptime(str_date,'%a %b %d %H:%M:%S +0000 %Y')
    return pytz.utc.localize(dts).astimezone(pytz.timezone('Asia/Tokyo'))

#Renvoie l'heure actuelle dans l'heure UNIX
def now_unix_time():
    return time.mktime(datetime.datetime.now().timetuple())

Voici la boucle d'acquisition du tweet.

#-------------Obtenez des données de Tweet à plusieurs reprises-------------#
sid=-1
mid = -1 
count = 0
 
res = None
while(True):    
    try:
        count = count + 1
        sys.stdout.write("%d, "% count)
        res = getTweetData(u'Starbucks', max_id=mid, since_id=sid)
        if res['result']==False:
            #Quitter en cas d'échec
            print "status_code", res['status_code']
            break
        
        if int(res['limit']) == 0:    #J'ai atteint la limite, alors je fais une pause
            #Colonne de type de date'created_datetime'Ajouter
            print "Adding created_at field."
            for d in tweetdata.find({'created_datetime':{ "$exists": False }},{'_id':1, 'created_at':1}):
                #print str_to_date_jp(d['created_at'])
                tweetdata.update({'_id' : d['_id']}, 
                     {'$set' : {'created_datetime' : str_to_date_jp(d['created_at'])}})
            #remove_duplicates()
            
            #Calcul du temps d'attente.Reprise après la limite + 5 secondes
            diff_sec = int(res['reset_time_unix']) - now_unix_time()
            print "sleep %d sec." % (diff_sec+5)
            if diff_sec > 0:
                time.sleep(diff_sec + 5)
        else:
            #traitement des métadonnées
            if len(res['statuses'])==0:
                sys.stdout.write("statuses is none. ")
            elif 'next_results' in res['metadata']:
                #Stocker le résultat dans mongoDB
                meta.insert({"metadata":res['metadata'], "insert_date": now_unix_time()})
                for s in res['statuses']:
                    tweetdata.insert(s)
                next_url = res['metadata']['next_results']
                pattern = r".*max_id=([0-9]*)\&.*"
                ite = re.finditer(pattern, next_url)
                for i in ite:
                    mid = i.group(1)
                    break
            else:
                sys.stdout.write("next is none. finished.")
                break
    except SSLError as (errno, request):
        print "SSLError({0}): {1}".format(errno, strerror)
        print "waiting 5mins"
        time.sleep(5*60)
    except ConnectionError as (errno, request):
        print "ConnectionError({0}): {1}".format(errno, strerror)
        print "waiting 5mins"
        time.sleep(5*60)
    except ReadTimeout as (errno, request):
        print "ReadTimeout({0}): {1}".format(errno, strerror)
        print "waiting 5mins"
        time.sleep(5*60)
    except:
        print "Unexpected error:", sys.exc_info()[0]
        traceback.format_exc(sys.exc_info()[2])
        raise
    finally:
        info = sys.exc_info()


## 5. Structure de données de l'API REST Twitter ## La structure des données obtenues par "[GET search / tweets](https://dev.twitter.com/rest/reference/get/search/tweets)" des API REST Twitter est la suivante. ### Structure de TwitterListResponse ### Une description des principaux éléments des informations du Tweet.   
Éléments Description   
id ID du Tweet. Les nouveaux ont de vieux numéros et les anciens ont de jeunes numéros. Si vous spécifiez plus ou moins grand que cet identifiant lors de la recherche, vous pouvez récupérer les tweets précédents après cela.
id_str Cela semble être une version chaîne de caractères de "id", mais les détails sont inconnus car il est initialement obtenu sous forme de chaîne de caractères.
user Informations utilisateur. Il contient les éléments suivants (seuls les éléments typiques sont repris)
   id ID utilisateur. ID d'un numéro que vous ne voyez généralement pas.
name Le nom de l'utilisateur le plus long.
screen_name Nom d'utilisateur utilisé lors de la spécification avec @ etc.
description Informations sur la description de l'utilisateur. Phrases en forme de profil.
friends_count Nombre d'abonnés
followers_count Nombre d'abonnés
statuses_count Nombre de tweets (y compris les retweets)
favourites_count Nombre de favoris
location Où vous habitez
created_at Date d'inscription pour cet utilisateur
text Corps du Tweet
retweeted_status S'il s'agit d'un retweet (True: retweet / False: normal tweet)
retweeted S'il a été retweeté ou non (Vrai / Faux)
retweet_count Nombre de retweets
favorited S'il a été ajouté aux favoris (Vrai / Faux)
favorite_count Nombre de favoris
coordinates latitude et longitude
entities Informations supplémentaires ci-dessous
symbols
user_mentions Informations utilisateur spécifiées par @ dans le texte
hashtags Balise de hachage dans le texte
urls Informations URL dans le texte
source Informations sur l'application / le site qui a tweeté
lang Informations sur la langue
created_at Date et heure du Tweet
place Informations de localisation liées au tweet
in_reply_to_screen_name Le nom d'utilisateur de la source du tweet lorsque le tweet était une réponse
n_reply_to_status_id ID du tweet de la source du tweet lorsque le tweet était une réponse
in_reply_to_status_id_str version chaîne de n_reply_to_status_id

structure de métadonnées

Il s'agit d'une description des métadonnées renvoyées lorsque vous recherchez «https: //api.twitter.com/1.1/search/tweets.json».

article La description
query Rechercher un mot
count Combien de tweets ont été obtenus en une seule recherche
completed_in Combien de secondes l'acquisition s'est-elle terminée?
max_id ID le plus récent parmi les tweets acquis
max_id_str max_Version chaîne de l'identifiant?(Les deux sont des chaînes de caractères ...)
since_id L'identifiant le plus ancien dans les tweets acquis
since_id_str since_Version chaîne de l'identifiant?(Les deux sont des chaînes de caractères ...)
refresh_url URL lorsque vous souhaitez obtenir de nouveaux tweets avec le même mot de recherche
next_results URL lorsque vous souhaitez obtenir des tweets plus anciens avec le même mot de recherche

Résumé des données obtenues cette fois

Nombre total d'acquisitions
227 599
Période des données d'acquisition
2015-03-11 04:43:42 au 2015-03-22 00:01:12
Nombre de tweets par seconde
4.101 tweet/sec

Questions d'actualité

Quand j'arrive à la seconde moitié de 100000 avec la recherche / tweets GET, je rencontre un événement où les tweets précédents ne peuvent pas être obtenus, l'élément statuts '' devient vide et l'élément next_results '' n'est pas renvoyé en premier lieu ... Je ne l'ai pas résolu pour le moment, mais j'ai environ 200 000 cas, alors j'aimerais analyser ces données la prochaine fois. ** Mise à jour: ** J'ai reçu un commentaire, mais il semble que je ne puisse recevoir de tweets que pendant une semaine.

Continuez vers la Partie 2.

Le code complet décrit sur cette page est ici

Page référencée

Accéder à l'API Twitter avec Python Twitter official REST API document

Recommended Posts

Obtenez une grande quantité de données Twitter de Starba avec python et essayez l'analyse de données Partie 1
Débarrassez-vous des données sales avec Python et les expressions régulières
Obtenez des données de VPS MySQL avec Python 3 et SQL Alchemy
Visualisation et analyse des informations de localisation des données Twitter Stava
Environnement enregistré pour l'analyse des données avec Python
Analyse de données avec python 2
Un beau dessin graphique avec Python -seaborn facilite l'analyse et la visualisation des données Partie 1
Un beau dessin graphique avec Python -seaborn facilite l'analyse et la visualisation des données Partie 2
Pratique de création d'une plateforme d'analyse de données avec BigQuery et Cloud DataFlow (traitement de données)
Analyse de données avec Python
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
J'ai créé un programme en Python qui lit les données FX CSV et crée un grand nombre d'images de graphiques
Obtenez des données financières avec python (puis un peu de bricolage)
Défiez l'analyse des composants principaux des données textuelles avec Python
Effectuez une recherche Twitter à partir de Python et essayez de générer des phrases avec la chaîne de Markov.
Consolider un grand nombre de fichiers CSV dans des dossiers avec python (données sans en-tête)
Créez rapidement un tableau de bord d'analyse de données Python avec Streamlit et déployez-le sur AWS
Obtenez la chronologie Twitter avec Python
Obtenez des données Youtube avec python
Essayez de gratter les données COVID-19 Tokyo avec Python
Essayez d'utiliser l'API Twitter rapidement et facilement avec Python
Effectuer une analyse isocurrent des canaux en eau libre avec Python et matplotlib
Remarques sur la gestion de grandes quantités de données avec python + pandas
Obtenez une liste des livres électroniques DMM achetés avec Python + Selenium
Détecter les objets d'une couleur et d'une taille spécifiques avec Python
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
Exemple d'analyse HTTP GET et JSON avec Pepper Python
Obtenez des données supplémentaires vers LDAP avec python (Writer et Reader)
Créez un arbre de décision à partir de zéro avec Python et comprenez-le (3. Bibliothèque d'analyse de données édition Pandas)
"Analyse des séries chronologiques de mesure des données économiques et financières" Résolution du problème de fin de chapitre avec Python
Essayez l'analyse morphologique et la chaîne de Markov avec Django (Ari avec beaucoup de marge d'amélioration)
Obtenez une liste des métriques CloudWatch et une table de correspondance des unités unitaires avec Python boto
Une analyse simple des données de Bitcoin fournie par CoinMetrics en Python
Essayez d'obtenir la liste des fils du bulletin d'information (je n'aime pas) avec Python.
Exercice pratique d'analyse de données avec Python ~ 2016 New Coder Survey Edition ~
Gérez le chevauchement lors du dessin d'un diagramme de dispersion avec une grande quantité de données (Matplotlib, Pandas, Datashader)
[Python] Obtenez des données économiques avec DataReader
Exploration avec Python et Twitter API 2-Implémentation de la fonction de recherche d'utilisateurs
Pratique de l'analyse de données par Python et pandas (Tokyo COVID-19 data edition)
Comment créer une grande quantité de données de test dans MySQL? ??
[Python] Lire un fichier csv avec une grande taille de données à l'aide d'un générateur
Analyse de données à partir de python (visualisation de données 1)
Essayez d'obtenir des métriques CloudWatch avec la source de données python re: dash
Coexistence de Python2 et 3 avec CircleCI (1.0)
Analyse de données à partir de python (visualisation de données 2)
Obtenez une liste de fichiers dans un dossier avec python sans chemin
Un débutant en Python a d'abord essayé une analyse rapide et facile des données météorologiques des 10 dernières années.
Créer un Ubuntu de démarrage USB avec un environnement Python pour l'analyse des données
Introduction de "scikit-mobility", une bibliothèque qui vous permet d'analyser facilement les données de flux humain avec Python (Partie 1)
Reconnaître le contour et la direction d'un objet façonné avec OpenCV3 et Python3 (analyse des composants principaux: PCA, vecteur propre)
J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins
Introduction et utilisation de la bouteille Python ・ Essayez de configurer un serveur Web simple avec une fonction de connexion
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Obtenez des images d'OpenStreetMap et de la carte de l'Institut géographique avec Python + py-staticmaps
Obtenez une liste des packages installés dans l'environnement actuel avec python
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 3: Exploration et visualisation des données
Résumé du livre électronique Python utile pour l'analyse de données gratuite
J'ai 0 ans d'expérience en programmation et je défie le traitement des données avec python