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
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).
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
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()
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()
Éléments td> | Description th> | |
---|---|---|
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. td> | |
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. td> | |
user | Informations utilisateur. Il contient les éléments suivants (seuls les éléments typiques sont repris) td> | |
id | ID utilisateur. ID d'un numéro que vous ne voyez généralement pas. td> | |
name | Le nom de l'utilisateur le plus long. td> | |
screen_name | Nom d'utilisateur utilisé lors de la spécification avec @ etc. td> | |
description | Informations sur la description de l'utilisateur. Phrases en forme de profil. td> | |
friends_count | Nombre d'abonnés td> | |
followers_count | Nombre d'abonnés td> | |
statuses_count | Nombre de tweets (y compris les retweets) td> | |
favourites_count | Nombre de favoris td> | |
location | Où vous habitez td> | |
created_at | Date d'inscription pour cet utilisateur td> | |
text | Corps du Tweet td> | |
retweeted_status | S'il s'agit d'un retweet (True: retweet / False: normal tweet) td> | |
retweeted | S'il a été retweeté ou non (Vrai / Faux) td> | |
retweet_count | Nombre de retweets td> | |
favorited | S'il a été ajouté aux favoris (Vrai / Faux) td> | |
favorite_count | Nombre de favoris td> | |
coordinates | latitude et longitude td> | |
entities | Informations supplémentaires ci-dessous td> | |
symbols | ||
user_mentions | Informations utilisateur spécifiées par @ dans le texte td> | |
hashtags | Balise de hachage dans le texte td> | |
urls | Informations URL dans le texte td> | |
source | Informations sur l'application / le site qui a tweeté td> | |
lang | Informations sur la langue td> | |
created_at | Date et heure du Tweet td> | |
place | Informations de localisation liées au tweet td> | |
in_reply_to_screen_name | Le nom d'utilisateur de la source du tweet lorsque le tweet était une réponse td> | |
n_reply_to_status_id | ID du tweet de la source du tweet lorsque le tweet était une réponse td> | |
in_reply_to_status_id_str | version chaîne de n_reply_to_status_id td> |
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 |
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
Accéder à l'API Twitter avec Python Twitter official REST API document
Recommended Posts