Sammeln Sie Tweets mit tweepy in Python und speichern Sie sie in MongoDB

Normalerweise benutze ich C # und Java für die Arbeit, aber ich habe mich immer für Python interessiert. Datenanalyse und maschinelles Lernen sind so beliebt, dass ich mich entschlossen habe, diese Gelegenheit zu nutzen, um Python zu studieren! !!

Für Python kürzlich veröffentlicht [Introduction Python3](http://www.amazon.co.jp/%E5%85%A5%E9%96%80-Python-3-Bill-Lubanovic/dp/4873117380/ref = sr_1_1? ie = UTF8 & qid = 1457003044 & sr = 8-1 & keywords =% E5% 85% A5% E9% 96% 80 Python3) Ich lerne.

Dieses Mal haben es bereits verschiedene Leute vorgestellt, aber ich werde es vorstellen, weil ich ein Programm geschrieben habe, um die Ergebnisse der Twitter-Suche in MongoDB zu speichern. Ich würde mich sehr freuen, wenn Sie sich mit weiteren Dingen wie diesen befassen könnten! !!

Umgebung

verschiedene Einstellungen

Nehmen Sie Einstellungen vor, die Ihrer Umgebung entsprechen.

config.py


# coding=utf-8
# write code...

# mongodb
HOST = 'localhost'
PORT = 27017
DB_NAME = 'twitter-archive'
COLLECTION_NAME = 'tweets'

# twitter
CONSUMER_KEY = ''
CONSUMER_SECRET = ''
ACCESS_TOKEN_KEY = ''
ACCESS_TOKEN_SECRET = ''

Suchbegriff

Ich habe beschlossen, die Schlüsselwörter zu verwalten, die bei der Suche nach Twitter in einer YAML-Datei angegeben wurden.

keywords.yml


#Definieren Sie Twitter-Suchwörter als Liste.
#Das Folgende ist ein Beispiel.
- 'Hamburger'
- 'Baseball'
- 'Weihnachten'

Protokollausgabeklasse

Ich habe eine Wrapper-Klasse erstellt, während ich untersucht habe, wie die Protokollierung verwendet wird. Es gibt viele Dinge, die ich noch nicht verstehe, daher studiere ich detaillierte Einstellungen, aber ich habe bestätigt, dass ich Protokolle ausgeben kann.

logger.py


import logging
from logging.handlers import TimedRotatingFileHandler

# coding=utf-8
# write code...

class Logger:
    def __init__(self, log_type):
        logger = logging.getLogger(log_type)
        logger.setLevel(logging.DEBUG)
        #Ich möchte jeden Tag wechseln, habe es aber noch nicht getan. .. ..
        handler = TimedRotatingFileHandler(filename='archive.log', when='D', backupCount=30)
        formatter = logging.Formatter('[%(asctime)s] %(name)s %(levelname)s %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        self.logger = logger

    def info(self, msg, *args, **kwargs):
        self.logger.info(msg, *args, **kwargs)

    def debug(self, msg, *args, **kwargs):
        self.logger.debug(msg, *args, **kwargs)

    def error(self, msg, *args, **kwargs):
        self.logger.error(msg, *args, **kwargs)

    def exception(self, msg, *args, exc_info=True, **kwargs):
        self.logger.exception(msg, *args, exc_info, **kwargs)

Hauptsuch- und Speicherprozess

Ich denke daran, einmal pro Woche eine Charge zu starten und regelmäßig Tweets zu sammeln. Es fiel mir schwerer, die Spezifikationen der Twitter-API zu verstehen, als ich erwartet hatte. Ich habe darüber nachgedacht, wie ich die Verwendung von Since_ID und Max_ID steuern kann, um keine doppelten Tweets zu erhalten. Wie war es gut, das zu tun? .. ..

archive.py


import sys
import config
import yaml
from tweepy import *
from tweepy.parsers import JSONParser
from pymongo import *
from logger import Logger


# coding: UTF-8
# write code...

def archive():

    #Lesen Sie die Liste der Suchschlüsselwörter aus der YAML-Datei und generieren Sie eine Zeichenfolge für die ODER-Suche.
    with open('keywords.yml', 'r') as file:
        keywords = yaml.load(file)
    query_string = ' OR '.join(keywords)

    #Initialisierung des Protokollausgabeobjekts
    logger = Logger('archive')

    #Client für Twitter-Suche generieren
    auth = OAuthHandler(config.CONSUMER_KEY, config.CONSUMER_SECRET)
    auth.set_access_token(config.ACCESS_TOKEN_KEY, config.ACCESS_TOKEN_SECRET)
    #Ich möchte das Ergebnis in JSON erhalten, also setze JSONParser.
    #Selbst wenn das Suchlimit erreicht ist, wird die Bibliothek das Beste tun. Sollte sein.
    twitter_client = API(auth, parser=JSONParser(), wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
    if twitter_client is None:
        logger.error('Zertifizierung fehlgeschlagen.')
        sys.exit(-1)

    #Initialisieren Sie die Mongodb-Sammlung, um Tweets zu speichern
    client = MongoClient(config.HOST, config.PORT)
    tweet_collection = client[config.DB_NAME][config.COLLECTION_NAME]

    #Der neueste Tweet wird aus den erfassten Tweets erfasst, und die Einstellung wird so vorgenommen, dass die ID oder später des Tweets erfasst wird.
    last_tweet = tweet_collection.find_one(sort=[('id', DESCENDING)])
    since_id = None if last_tweet is None else last_tweet['id']

    #Bei der ersten Suche werden max_ID nicht einstellen-Set 1.
    max_id = -1

    # tweet_Anzahl ist max_tweet_Wenn die Anzahl erreicht ist, endet die Suche.
    # max_tweet_Stellen Sie einen großen Wert für count ein.
    tweet_count = 0
    max_tweet_count = 100000

    logger.info('maximal{0}Sammle einzelne Tweets.'.format(max_tweet_count))
    while tweet_count < max_tweet_count:
        try:
            params = {
                'q': query_string,
                'count': 100,
                'lang': 'ja'
            }
            # max_id und seit_Übergeben Sie die ID nur als Parameter, wenn sie festgelegt ist.
            if max_id > 0:
                params['max_id'] = str(max_id - 1)
            if since_id is not None:
                params['since_id'] = since_id

            search_result = twitter_client.search(**params)
            statuses = search_result['statuses']

            #Überprüfen Sie, ob Sie bis zum Ende suchen können
            if statuses is None or len(statuses) == 0:
                logger.info('Der Tweet wurde nicht gefunden.')
                break

            tweet_count += len(statuses)
            logger.debug('{0}Ich habe die Tweets bekommen.'.format(tweet_count))

            result = tweet_collection.insert_many([status for status in statuses])
            logger.debug('Ich habe es in MongoDB gespeichert. ID ist{0}ist.'.format(result))

            #Aktualisieren Sie mit der letzten Tweet-ID, die Sie erhalten haben.
            max_id = statuses[-1]['id']

        except (TypeError, TweepError) as e:
            print(str(e))
            logger.exception(str(e))
            break

if __name__ == '__main__':
    archive()

Zusammenfassung

Ich habe Python noch nicht beherrscht, aber ich dachte, es wäre eine Sprache, in der ich schreiben könnte, was ich tun wollte. Ich werde weiter studieren. In Zukunft werde ich versuchen, die gesammelten Tweets mithilfe der Bibliothek zur Datenanalyse zu analysieren! !!

Recommended Posts

Sammeln Sie Tweets mit tweepy in Python und speichern Sie sie in MongoDB
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.
Sammeln Sie Daten mit Scrapy und füllen Sie mongoDB
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden
Speichern Sie den Tweet von Twitter mit Geo als CSV und zeichnen Sie ihn auf Google Map.
Versuchen Sie es mit Tweepy [Python2.7]
Lesen und schreiben Sie NFC-Tags mit Python mit PaSoRi
Versuchen Sie es mit GUI, PyQt in Python
Speichern Sie Bilder mit Python3-Anforderungen
Mische die Bilder in einem beliebigen Verzeichnis mit Python und speichere sie in einem anderen Ordner mit Seriennummern.
[Python] Verwenden Sie DataFrame, um beliebige Variablen und Arrays zusammen zu kennzeichnen und in csv [pandas] zu speichern.
Stapel und Warteschlange in Python
Prognostizieren Sie das Geschlecht anhand des Namens mithilfe der Gender-API und von Pykakasi in Python
Zeichnen Sie Zeitreihendaten in Python mit Pandas und Matplotlib
Unittest und CI in Python
[Go language] Sammeln und speichern Sie Vtuber-Bilder mithilfe der Twitter-API
Übersetzt mit Googletrans in Python
Verwenden des Python-Modus in der Verarbeitung
Python-Programm, das täglich Tweets mit bestimmten Schlüsselwörtern sammelt und in CSV speichert
Verarbeiten Sie das Ausführungsergebnis von Splunk mit Python und speichern Sie es in einer Datei
Sammeln Sie Produktinformationen und Prozessdaten mit der Rakuten-Produktsuch-API [Python].
Erstellen und testen Sie mit Docker in wenigen Minuten eine OpenCV- und Python-Umgebung
[Python3] Speichern Sie die Mittelwert- und Kovarianzmatrix in json mit Pandas
Ich habe Node.js und Python beim Erstellen eines Miniaturbilds mit AWS Lambda verglichen
Speichern, Wiederherstellen und Abfragen der Suche von Python-Klasseninstanzen mit mongodb
GUI-Programmierung in Python mit Appjar
Pakete, die MIDI mit Python Midi und Pretty_Midi verarbeiten
Unterschied zwischen list () und [] in Python
Unterschied zwischen == und ist in Python
Zeigen Sie Fotos in Python und HTML an
Sortieralgorithmus und Implementierung in Python
Speichern Sie die Binärdatei in Python
Authentifizierung mit Tweepy-User-Authentifizierung und Anwendungsauthentifizierung (Python)
So sammeln Sie Bilder in Python
Bearbeiten Sie Dateien und Ordner in Python
Über Python und Cython dtype
Versuchen Sie es mit LevelDB mit Python (plyvel)
Zuweisungen und Änderungen in Python-Objekten
Überprüfen und verschieben Sie das Verzeichnis in Python
Verwendung globaler Variablen in Python-Funktionen
Verschlüsselung mit Python: IND-CCA2 und RSA-OAEP
Hashing von Daten in R und Python
Clustering und Visualisierung mit Python und CytoScape
Mal sehen, wie man Eingaben in Python verwendet
Gesamtleistung in Python (mit Funktools)
Funktionssynthese und Anwendung in Python
Exportieren und Ausgeben von Dateien in Python
Reverse Flat Pseudonym und Katakana in Python2.7
Lesen und Schreiben von Text in Python
[GUI in Python] PyQt5-Menü und Symbolleiste-
Handschriftliche Zeichenerkennung mit KNN in Python
Versuchen Sie es mit LeapMotion mit Python
Suche nach Tiefenpriorität mit Stack in Python
Bei Verwendung regulärer Ausdrücke in Python
Erstellen und lesen Sie Messagepacks in Python
GUI-Erstellung in Python mit tkinter 2
Ein Skript, das Tweets mit Python abruft, sie in einer externen Datei speichert und morphologische Analysen durchführt.