[GO] Holen Sie sich mit Python eine große Menge von Starbas Twitter-Daten und probieren Sie die Datenanalyse Teil 1 aus

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


1. Holen Sie sich Kontoinformationen, um eine Verbindung zur Twitter-API ## herzustellen

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).

2. Installation verschiedener erforderlicher Bibliotheken

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

3. Initialisierungsprozess

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()

4. Suche Tweet

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()


## 5. Twitter REST API Datenstruktur ## Die Struktur der Daten, die durch "[GET search / tweets](https://dev.twitter.com/rest/reference/get/search/tweets)" von Twitter-REST-APIs erhalten werden, ist wie folgt. ### Struktur von TwitterListResponse ### Eine Beschreibung der Hauptelemente der Tweet-Informationen.   
Element Beschreibung   
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.
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.
user Benutzerinformationen. Es enthält die folgenden Elemente (nur typische werden aufgenommen)
   id Benutzer-ID. ID einer Nummer, die Sie normalerweise nicht sehen.
name Der Name des längeren Benutzers.
screen_name Benutzername, der bei der Angabe mit @ usw. verwendet wird.
description Informationen zur Benutzerbeschreibung. Profilartige Sätze.
friends_count Anzahl der Follower
followers_count Anzahl der Follower
statuses_count Anzahl der Tweets (einschließlich Retweets)
favourites_count Anzahl der Favoriten
location Wo Sie wohnen
created_at Registrierungsdatum für diesen Benutzer
text Tweet body
retweeted_status Gibt an, ob es sich um einen Retweet handelt (True: Retweet / False: Normal Tweet)
retweeted Gibt an, ob es retweetet wurde (Richtig / Falsch)
retweet_count Anzahl der Retweets
favorited Ob es bevorzugt wurde (Richtig / Falsch)
favorite_count Anzahl der Favoriten
coordinates Breiten- und Längengrad
entities Weitere Informationen finden Sie unten
symbols
user_mentions Benutzerinformationen, die durch @ im Text angegeben werden
hashtags Hash-Tag im Text
urls URL-Informationen im Text
source Informationen zu der App / Site, die getwittert hat
lang Sprachinformationen
created_at Datum und Uhrzeit des Tweets
place Standortinformationen zum Tweet
in_reply_to_screen_name Der Benutzername der Tweet-Quelle, als der Tweet eine Antwort war
n_reply_to_status_id Tweet-ID der Tweet-Quelle, als der Tweet eine Antwort war
in_reply_to_status_id_str Zeichenfolgenversion von n_reply_to_status_id

Metadatenstruktur

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

Zusammenfassung der diesmal erhaltenen Daten

Gesamtzahl der Akquisitionen
227.599
Erfassungsdatenperiode
2015-03-11 04:43:42 bis 2015-03-22 00:01:12
Anzahl der Tweets pro Sekunde
4.101 tweet/sec

Aktuelle Probleme

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.

Referenzierte Seite

Zugriff auf die Twitter-API mit Python Twitter official REST API document

Recommended Posts

Holen Sie sich mit Python eine große Menge von Starbas Twitter-Daten und probieren Sie die Datenanalyse Teil 1 aus
Befreien Sie sich mit Python und regulären Ausdrücken von schmutzigen Daten
Holen Sie sich Daten von VPS MySQL mit Python 3 und SQL Alchemy
Visualisierung und Analyse von Stava Twitter-Datenstandortinformationen
Aufgezeichnete Umgebung für die Datenanalyse mit Python
Datenanalyse mit Python 2
Schöne Grafikzeichnung mit Python-Seaborn erleichtert die Datenanalyse und -visualisierung Teil 1
Wunderschönes Zeichnen mit Python-Seaborn erleichtert die Datenanalyse und -visualisierung Teil 2
Praxis der Erstellung einer Datenanalyseplattform mit BigQuery und Cloud DataFlow (Datenverarbeitung)
Datenanalyse mit Python
Holen Sie sich mit Python den Aktienkurs eines japanischen Unternehmens und erstellen Sie eine Grafik
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
Ich habe in Python ein Programm erstellt, das FX-CSV-Daten liest und eine große Anzahl von Diagrammbildern erstellt
Holen Sie sich Finanzdaten mit Python (dann ein wenig basteln)
Fordern Sie die Hauptkomponentenanalyse von Textdaten mit Python heraus
Führen Sie eine Twitter-Suche in Python durch und versuchen Sie, Sätze mit der Markov-Kette zu generieren.
Konsolidieren Sie eine große Anzahl von CSV-Dateien in Ordnern mit Python (Daten ohne Header).
Erstellen Sie mit Streamlit schnell ein Python-Datenanalyse-Dashboard und stellen Sie es in AWS bereit
Holen Sie sich Twitter-Timeline mit Python
Holen Sie sich Youtube-Daten mit Python
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
Versuchen Sie, mit Python schnell und einfach auf die Twitter-API zuzugreifen
Führen Sie mit Python und Matplotlib eine Isostromanalyse offener Wasserkanäle durch
Hinweise zum Umgang mit großen Datenmengen mit Python + Pandas
Holen Sie sich eine Liste der mit Python + Selen gekauften DMM-E-Books
Erkennen Sie mit Python Objekte einer bestimmten Farbe und Größe
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Beispiel für das Parsen von HTTP GET und JSON mit Pfefferpython
Holen Sie sich zusätzliche Daten zu LDAP mit Python (Writer und Reader)
Erstellen Sie mit Python einen Entscheidungsbaum aus 0 und verstehen Sie ihn (3. Datenanalysebibliothek Pandas Edition)
"Zeitreihenanalyse von Wirtschafts- und Finanzdaten messen" Das Problem am Ende des Kapitels mit Python lösen
Versuchen Sie es mit morphologischer Analyse und Markov-Kette mit Django (Ari mit viel Raum für Verbesserungen)
Holen Sie sich eine Liste der CloudWatch-Metriken und eine Entsprechungstabelle der Einheiteneinheiten mit Python boto
Eine einfache Datenanalyse von Bitcoin, die von CoinMetrics in Python bereitgestellt wird
Versuchen Sie, die Thread-Liste der Nachrichten (Abneigung) mit Python zu erhalten.
Praktische Übung zur Datenanalyse mit Python ~ 2016 New Coder Survey Edition ~
Verwalten Sie die Überlappung, wenn Sie ein Streudiagramm mit einer großen Datenmenge zeichnen (Matplotlib, Pandas, Datashader).
[Python] Mit DataReader Wirtschaftsdaten abrufen
Crawlen mit Python und Twitter API 2-Implementierung der Benutzersuchfunktion
Praxis der Datenanalyse durch Python und Pandas (Tokyo COVID-19 Data Edition)
Wie erstelle ich eine große Menge an Testdaten in MySQL? ??
[Python] Lesen Sie eine CSV-Datei mit großen Datenmengen mithilfe eines Generators
Datenanalyse beginnend mit Python (Datenvisualisierung 1)
Versuchen Sie, CloudWatch-Metriken mit der Python-Datenquelle re: dash abzurufen
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Datenanalyse beginnend mit Python (Datenvisualisierung 2)
Ruft eine Liste der Dateien in einem Ordner mit Python ohne Pfad ab
Ein Python-Anfänger hat in den letzten 10 Jahren zunächst versucht, die Wetterdaten schnell und einfach zu analysieren.
Erstellen Sie ein USB-Boot-Ubuntu mit einer Python-Umgebung für die Datenanalyse
Einführung von "Scikit-Mobility", einer Bibliothek, mit der Sie menschliche Flussdaten mit Python einfach analysieren können (Teil 1)
Erkennen Sie die Kontur und Richtung eines geformten Objekts mit OpenCV3 und Python3 (Hauptkomponentenanalyse: PCA, Eigenvektor)
Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University
Einführung und Verwendung der Python-Flasche ・ Versuchen Sie, einen einfachen Webserver mit Anmeldefunktion einzurichten
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
Holen Sie sich Bilder von OpenStreetMap und Geographical Institute Map mit Python + py-staticmaps
Rufen Sie mit Python eine Liste der in der aktuellen Umgebung installierten Pakete ab
Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
[In-Database Python Analysis-Lernprogramm mit SQL Server 2017] Schritt 3: Erkunden und Visualisieren von Daten
Python-E-Book-Zusammenfassung nützlich für die frei lesbare Datenanalyse
Ich habe 0 Jahre Programmiererfahrung und fordere die Datenverarbeitung mit Python heraus