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! !!
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 = ''
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'
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)
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()
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