Programme Python qui recueille quotidiennement des tweets contenant des mots-clés spécifiques et les enregistre en csv

Objectif

J'ai une idée que les informations SNS telles que Twitter peuvent être utilisées pour surveiller le risque d'apparition de nouveaux clusters d'infection par le virus corona, et j'aimerais collecter des tweets par recherche de mots-clés tels que "La soirée potable d'aujourd'hui". Étant donné que l'API de recherche gratuite ne peut tracer les tweets qu'il y a une semaine, nous allons créer un mécanisme pour collecter automatiquement des données chaque jour, en envisageant la possibilité de les utiliser pour de futures recherches.

Si vous avez une bonne idée d'un mot de recherche pouvant être utilisé pour évaluer le risque de développer un nouveau cluster infecté par le virus corona, veuillez commenter! </ b>

URL de référence

Auteur https://developer.twitter.com/en/docs/twitter-api Site de commentaires très facile à comprendre https://gaaaon.jp/blog/twitterapi Il est triste que cet article n'ait même pas atteint le "code d'autosuffisance essayé" dans le lien ci-dessus, donc dans certains cas, l'article peut rester privé.

Méthode

Exécutez la commande suivante nomikai_tweets.py.

# coding: utf-8
# nomikai_tweets.py

import pandas as pd
import json
import schedule
from time import sleep
from requests_oauthlib import OAuth1Session
import datetime
from datetime import date, timedelta
import pytz

def convert_to_datetime(datetime_str):
    """
Conversion de format de date et d'heure
    """
    tweet_datetime = datetime.datetime.strptime(datetime_str,'%a %b %d %H:%M:%S %z %Y')
    return(tweet_datetime)


def job():
    """
Programme qui se répète en main
    """

    #Mot-clé de recherche à l'exclusion des retweets
    keyword = "Boire à exclure aujourd'hui:retweets" 
    #Enregistrer le répertoire Créer d'abord
    DIR = 'nomikai/' 

    #Informations obtenues par communication API et enregistrement des développeurs
    Consumer_key = 'bT*****************'
    Consumer_secret = 've*****************'
    Access_token = '25*****************'
    Access_secret = 'NT*****************'
    url = "https://api.twitter.com/1.1/search/tweets.json"
    twitter = OAuth1Session(Consumer_key, Consumer_secret, Access_token, Access_secret)

    #Paramètres utilisés pour la collecte
    max_id = -1
    count = 100
    params = {'q' : keyword, 'count' : count, 'max_id' : max_id, 'lang' : 'ja', 'tweet_mode' : 'extended'}

    #Préparation pour comparer le traitement de la date utc et jst en japonais
    today =datetime.datetime.now(pytz.timezone('Asia/Tokyo'))
    today_beggining_of_day = today.replace(hour=0, minute=0, second=0, microsecond=0)
    yesterday_beggining_of_day = today_beggining_of_day - timedelta(days=1)
    yesterday_str = datetime.datetime.strftime(yesterday_beggining_of_day, '%Y-%m-%d')

    #Correspond à l'enregistrement dans l'instruction DF while qui stocke les informations de tweet
    columns = ['time', 'user.id', 'user.location', 'full_text', 'user.followers_count', 'user.friends_count', 'user.description', 'id']
    df = pd.DataFrame(index=[], columns=columns)


    while(True):
        if max_id != -1: #Revenez au tweet qui a déjà stocké l'identifiant du tweet
            params['max_id'] = max_id - 1
        req = twitter.get(url, params = params)

        if req.status_code == 200: #Si tu peux l'obtenir normalement
            search_timeline = json.loads(req.text)

            if search_timeline['statuses'] == []:  #Après avoir pris tous les tweets
                break

            for tweet in search_timeline['statuses']:
                #Heure du Tweet UTC
                tweet_datetime = convert_to_datetime(tweet['created_at'])
                #Ignorer sinon le tweet d'hier
                in_jst_yesterday = today_beggining_of_day > tweet_datetime >= yesterday_beggining_of_day

                if not in_jst_yesterday:  #Ignorer sinon le tweet d'hier
                    continue

                #Magasin à DF
                record = pd.Series([tweet_datetime,
                                    tweet['user']['id'],
                                    tweet['user']['location'],
                                    tweet['full_text'],
                                    tweet['user']['followers_count'],
                                    tweet['user']['friends_count'],
                                    tweet['user']['description'],
                                    tweet['id'],
                                   ],index=df.columns)
                df = df.append(record, ignore_index=True)

            max_id = search_timeline['statuses'][-1]['id']

        else: #Attendez 15 minutes si vous êtes bloqué dans les restrictions de fréquence d'accès
            print("Total", df.shape[0], "tweets were extracted", sep=" ")
            print('wainting for 15 min ...')
            sleep(15*60)

    #sauvegarder
    df = df.set_index("time")
    df.index = df.index.tz_convert('Asia/Tokyo')
    df.to_pickle(DIR + yesterday_str + keyword +".pkl")
    df.to_csv(DIR + yesterday_str + keyword +".csv")
    print(today, "Total", df.shape[0], "tweets were extracted!\nnext start at 01:00 tommorow")

def main():
    print("start at 01:00 tommorow")
    #Courir à 01h00 tous les jours
    schedule.every().day.at("01:00").do(job)

    while True:
        schedule.run_pending()
        sleep(1)

if __name__ == '__main__':
    main()

résultat

Je souhaite analyser dès que les données sont collectées. En effet, il n'est pas possible d'évaluer même les changements périodiques en fonction du jour de la journée en utilisant uniquement les données passées pour une semaine.

commentaire

J'ai appris que je devais être prudent dans le traitement de l'heure japonaise et de l'heure standard afin de collecter des données tous les jours. Notez que datetime.datetime.now () dépend de l'environnement dans lequel le programme s'exécute, donc exécuter cette source sur une machine dans un autre pays ne fonctionnera pas correctement. Il en va de même pour schedule.every (). Day.at (" 01: 00 "). Do (job).

Parmi les tweets qui incluaient le passé «aujourd'hui» et «boire un verre» qui pouvaient être extraits, «en ligne» était inclus dans environ 10%. De plus, de nombreux utilisateurs de Twitter n'aiment pas les buveurs d'entreprise.

Recommended Posts

Programme Python qui recueille quotidiennement des tweets contenant des mots-clés spécifiques et les enregistre en csv
Un script qui récupère les tweets avec Python, les enregistre dans un fichier externe et effectue une analyse morphologique.
Enregistrer les tweets contenant des mots-clés spécifiques sur Twitter au format CSV
Un script qui transfère les tweets contenant des mots-clés spécifiques sur Twitter vers Slack en temps réel.
Comment arrêter le programme jusqu'à une date et une heure spécifiques en python
Un programme qui supprime les instructions en double en Python
Script Python qui lit les fichiers SQL, exécute BigQuery et enregistre le csv
Continuez à récupérer des tweets contenant des mots-clés spécifiques à l'aide de l'API Streaming en Python
J'ai créé un programme en Python qui lit les données FX CSV et crée un grand nombre d'images de graphiques
Programme Python du "Livre qui enseigne facilement la programmation difficile"
Un programme polyvalent qui formate les chaînes de commande Linux avec python
J'ai essayé "un programme qui supprime les déclarations en double en Python"
Collectez les tweets en utilisant tweepy en Python et enregistrez-les dans MongoDB
Créez le code qui renvoie "A et prétendant B" en python
Un programme qui détermine si un nombre entré en Python est un nombre premier
[Python] Un programme qui crée des escaliers avec #
J'ai fait un programme de gestion de la paie en Python!
Un programme qui utilise Python pour lire des fichiers indésirables
[Python] Un programme qui arrondit le score
[Débutant] Que se passe-t-il si j'écris un programme qui s'exécute sur php en Python?
Publier et utiliser un programme qui collecte automatiquement les images du visage de personnes spécifiées
Je veux exécuter et distribuer un programme qui redimensionne les images Python3 + pyinstaller
[Python] Un programme qui trouve les valeurs minimales et maximales sans utiliser de méthodes
[Python] Un programme qui calcule le nombre de mises à jour des enregistrements les plus élevés et les plus faibles
Enregistrez le Tweet de Twitter avec Geo au format CSV et tracez-le sur Google Map.
Jusqu'à ce que vous obteniez des données quotidiennes pour plusieurs années de stock japonais et que vous les sauvegardiez dans un seul CSV (Python)
Organisez les modules et les packages Python dans le désordre
Un mémo que j'ai écrit un tri rapide en Python
Un joli nimporter qui connecte nim et python
J'ai écrit une classe en Python3 et Java
Lire et écrire des fichiers CSV et JSON avec Python
Notes de programme simples Pub / Sub en Python
Extraire des lignes contenant une "chaîne" spécifique avec Pandas
Écrivons un programme Python et exécutons-le
Créer un package contenant des commandes globales en Python
J'ai créé un programme cryptographique César en Python.
Obtenir des lignes contenant des éléments spécifiques dans np.where
Script Python qui explore le flux RSS du statut Azure et le publie sur Hipchat
Un programme qui demande quelques kilogrammes pour atteindre l'IMC et le poids standard [Python]
[Python] Renommez tous les fichiers image dans un dossier spécifique par date et heure de prise de vue
[Python] Un programme qui trouve le nombre d'étapes le plus court dans un jeu qui traverse les nuages
[Python] Changer la couleur du texte et la couleur d'arrière-plan d'un mot clé spécifique dans la sortie d'impression
[Python] Ne laissez que les éléments commençant par une chaîne de caractères spécifique dans le tableau
Programme qui résume les données csv de l’historique des transactions de l’action SBI Securities [Python3]
Une solution au problème que les fichiers contenant [et] ne sont pas répertoriés dans glob.glob ()