Ich habe Mac Book Air immer satt und es ist mir unangenehm, lange zu bleiben. Ich möchte Herrn Starbucks danken und die Daten analysieren, um ihm zu helfen. In diesem Artikel geht es darum, eine große Anzahl von Tweets mit "Stava" im Text abzurufen und herauszufinden, was die Datenanalyse bieten kann. Es ist kein Stemmer, aber es kann ein Stemmer im Sinne einer Rückgabe an Herrn Stava sein (・ ω ・)
Teil 1: Importieren Sie Daten mit Twitter REST APIs und importieren Sie sie in mongoDB (diesmal) http://qiita.com/kenmatsu4/items/23768cbe32fe381d54a2
Teil 2: Trennung von Spam von erfassten Twitter-Daten http://qiita.com/kenmatsu4/items/8d88e0992ca6e443f446
Teil 3: Warum hat sich die Anzahl der Tweets nach einem Tag erhöht? http://qiita.com/kenmatsu4/items/02034e5688cc186f224b
Teil 4: Visualisierung von in Twitter versteckten Standortinformationen http://qiita.com/kenmatsu4/items/114f3cff815aa5037535
Mit Google-Lehrer ["Twitter-API-Konto"](https://www.google.co.jp/search?q=twitter+api+%E3%82%A2%E3%82%AB%E3%82%A6%E3 Wenn Sie nach% 83% B3% E3% 83% 88 suchen, finden Sie viele Websites, auf denen die Registrierung klar beschrieben wird. Informationen zum Zugriff auf die API finden Sie unter Verweis auf diese (insbesondere consumer_key, consumer_secret, access_token). , Access_secret).
Es wird davon ausgegangen, dass die grundlegende Python-Umgebung wie iPython vorhanden ist. Wenn Sie die Bibliothek in [hier] haben (http://nbviewer.ipython.org/github/cs109/2014/blob/master/homework/HW0.ipynb#Python-Libraries), ist das fast in Ordnung. Außerdem wird eine Authentifizierungsbibliothek für die Verwendung von Twitter-REST-APIs installiert.
pip install requests_oauthlib
Da mongoDB zum Speichern von Daten verwendet wird, hier und [hier](http: // qiita). Installieren Sie unter Bezugnahme auf com / hajimeni / items / 3c93fd981e92f66a20ce). Eine Übersicht über mongoDB finden Sie unter "Thin book of MongoDB".
Um von Python aus auf mongoDB zuzugreifen, werden wir auch pymongo einführen.
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 #Die Verbindungsklasse ist veraltet. Wechseln Sie daher zu MongoClient
from pymongo import MongoClient
from collections import defaultdict
import numpy as np
KEYS = { #Listen Sie unten die Schlüssel auf, die Sie mit Ihrem Konto erhalten haben
'consumer_key':'**********',
'consumer_secret':'**********',
'access_token':'**********',
'access_secret''**********',
}
twitter = None
connect = None
db = None
tweetdata = None
meta = None
def initialize(): #Erstverarbeitung wie Twitter-Verbindungsinformationen und Verbindungsverarbeitung zu 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) #Die Verbindungsklasse ist veraltet. Wechseln Sie daher zu MongoClient
connect = MongoClient('localhost', 27017)
db = connect.starbucks
tweetdata = db.tweetdata
meta = db.metadata
initialize()
Verwenden Sie den folgenden Code, um Tweets, die "Stava" im Text enthalten, in mongoDB zu importieren.
#Erhalten Sie 100 Tweet-Daten von Twitter-REST-APIs, indem Sie ein Suchwort angeben
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_Festlegen, ob die ID angegeben ist
if max_id != -1:
params['max_id'] = max_id
# since_Festlegen, ob die ID angegeben ist
if since_id != -1:
params['since_id'] = since_id
req = twitter.get(url, params = params) #Tweet-Daten abrufen
#Zerlegung der erfassten Daten
if req.status_code == 200: #Falls erfolgreich
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: #Wenn es fehlschlägt
print ("Error: %d" % req.status_code)
return{"result":False, "status_code":req.status_code}
#Gibt die Zeichenfolge im Datumstyp einschließlich der Zeitzone Japan Zeit 2 zurück
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'))
#Gibt die aktuelle Zeit in UNIX-Zeit zurück
def now_unix_time():
return time.mktime(datetime.datetime.now().timetuple())
Hier ist die Tweet-Erfassungsschleife.
#-------------Holen Sie sich wiederholt Tweet-Daten-------------#
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:
#Beenden, wenn fehlgeschlagen
print "status_code", res['status_code']
break
if int(res['limit']) == 0: #Ich habe das Limit erreicht und mache eine Pause
#Datumstyp Spalte'created_datetime'Hinzufügen
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()
#Berechnung der Wartezeit.Nach Limit + 5 Sekunden fortsetzen
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:
#Metadatenverarbeitung
if len(res['statuses'])==0:
sys.stdout.write("statuses is none. ")
elif 'next_results' in res['metadata']:
#Speichern Sie das Ergebnis in 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()
Element td> | Beschreibung th> | |
---|---|---|
id | Tweet-ID. Die neuen haben alte Nummern und die alten haben junge Nummern. Wenn Sie bei der Suche eine größere oder kleinere ID angeben, können Sie danach vorherige Tweets abrufen. td> | |
id_str | Es scheint sich um eine Zeichenkettenversion von "id" zu handeln, die Details sind jedoch unbekannt, da sie ursprünglich als Zeichenkette erhalten wurden. td> | |
user | Benutzerinformationen. Es enthält die folgenden Elemente (nur typische werden aufgenommen) td> | |
id | Benutzer-ID. ID einer Nummer, die Sie normalerweise nicht sehen. td> | |
name | Der Name des längeren Benutzers. td> | |
screen_name | Benutzername, der bei der Angabe mit @ usw. verwendet wird. td> | |
description | Informationen zur Benutzerbeschreibung. Profilartige Sätze. td> | |
friends_count | Anzahl der Follower td> | |
followers_count | Anzahl der Follower td> | |
statuses_count | Anzahl der Tweets (einschließlich Retweets) td> | |
favourites_count | Anzahl der Favoriten td> | |
location | Wo Sie wohnen td> | |
created_at | Registrierungsdatum für diesen Benutzer td> | |
text | Tweet body td> | |
retweeted_status | Gibt an, ob es sich um einen Retweet handelt (True: Retweet / False: Normal Tweet) td> | |
retweeted | Gibt an, ob es retweetet wurde (Richtig / Falsch) td> | |
retweet_count | Anzahl der Retweets td> | |
favorited | Ob es bevorzugt wurde (Richtig / Falsch) td> | |
favorite_count | Anzahl der Favoriten td> | |
coordinates | Breiten- und Längengrad td> | |
entities | Weitere Informationen finden Sie unten td> | |
symbols | ||
user_mentions | Benutzerinformationen, die durch @ im Text td> angegeben werden | |
hashtags | Hash-Tag im Text td> | |
urls | URL-Informationen im Text td> | |
source | Informationen zu der App / Site, die td> getwittert hat | |
lang | Sprachinformationen td> | |
created_at | Datum und Uhrzeit des Tweets td> | |
place | Standortinformationen zum Tweet td> | |
in_reply_to_screen_name | Der Benutzername der Tweet-Quelle, als der Tweet eine Antwort war td> | |
n_reply_to_status_id | Tweet-ID der Tweet-Quelle, als der Tweet eine Antwort war td> | |
in_reply_to_status_id_str | Zeichenfolgenversion von n_reply_to_status_id td> |
Dies ist eine Beschreibung der Metadaten, die bei der Suche nach "https: //api.twitter.com/1.1/search/tweets.json" zurückgegeben werden.
Artikel | Erläuterung |
---|---|
query | Suchbegriff |
count | Wie viele Tweets wurden in einer Suche erhalten? |
completed_in | Wie viele Sekunden hat die Erfassung abgeschlossen? |
max_id | Neueste ID unter den erfassten Tweets |
max_id_str | max_String-Version von id?(Beide sind Zeichenketten ...) |
since_id | Die älteste ID in den erfassten Tweets |
since_id_str | since_String-Version von id?(Beide sind Zeichenketten ...) |
refresh_url | URL, wenn Sie neuere Tweets mit demselben Suchwort erhalten möchten |
next_results | URL, wenn Sie ältere Tweets mit demselben Suchwort erhalten möchten |
Wenn Sie GET search / tweets verwenden, um die zweite Hälfte des Bereichs von 100.000 zu erreichen, können Sie die Tweets vorher nicht abrufen, das Element 'statuses' ist leer und das Element 'next_results' wird überhaupt nicht zurückgegeben ... Ich habe es im Moment noch nicht gelöst, aber ich habe ungefähr 200.000 Fälle, daher möchte ich diese Daten ab dem nächsten Mal analysieren. ** Update: ** Ich habe einen Kommentar erhalten, aber es scheint, dass ich nur eine Woche lang Tweets bekommen kann.
Fahren Sie mit [Teil 2] fort (http://qiita.com/kenmatsu4/items/8d88e0992ca6e443f446).
Der vollständige Code, der auf dieser Seite beschrieben wird, lautet hier.
Zugriff auf die Twitter-API mit Python Twitter official REST API document
Recommended Posts