Datensammlung in Twitter - Anfangs funktioniert es, später nicht mehr

Code-Stücke können hier veröffentlicht werden.
Antworten
pytony
User
Beiträge: 25
Registriert: Mittwoch 14. Juni 2017, 11:26

Liebe Python Mitglieder,

ich ich sammle von Twitter über die SearchAPI Tweets mit bestimmten Begriffen. Ich habe den Code geschrieben und später dann für ein paar Error-Meldungen Fixes eingebaut, damit der Code beim Sammeln nicht plötzlich stoppt und das Ganze ein Fall für die Tonne wird.

Folgendes Problem kommt jetzt vor: Nachdem ich Python 3 und PyCharm auf den Rechner installiert habe und dann mein Code laufen lasse, dann sammelt es die ersten Tage ganz normal die Tweets und alles läuft wie gewünscht. Später nach x Tagen (unterschiedlich) sammelt der Code dann nur noch 18-39 Tweets (Immer irgendwas zwischen diesem Intervall) und dann wird die Aufgabe beendet mit Code 0 (Also heißt das, dass alles in Ordnung gelaufen sein soll und nichts weiteres kommt mit den Begriffen).

Das kann aber nicht sein, da die 7 Tage noch nicht durchlaufen sind (man kann Tweets, die bis zu 7 Tage in der Vergangenheit liegen sammeln; so ist das von Twitter festgelegt). Also habe ich Python 3 und PyCharm auf mein Laptop (also hauptsache anderer Rechner) installiert und mein Code nochmal laufen lassen: Alles läuft wieder wunderbar, aber auch nur für ein paar Tage und dann kommt es wieder zu dieses Problem.
Woran liegt das? Ich habe schon den Cache von PyCharm gelöscht, die Projektdateien komplett gelöscht und neu erstellt. Ich habe jsonpickle und tweepy neuinstalliert über den pip3 command. Übersehe ich was im Code?

Mein Code lautet wie folgt:

Code: Alles auswählen

#Importieren der Bibliotheken (Libraries)
import sys
import os
import jsonpickle
import tweepy

#Sammlung und Definition der Access Daten von Twitter. Diese enthalten nur Lese-Berechtigungen
access_token = "AUSGEBLENDET"

access_token_secret = "AUSGEBLENDET"

consumer_key = "AUSGEBLENDET"

consumer_secret = "AUSGEBLENDET"

#Einbindung unseres vorher definierten Consumer Key und Consumer Secret von Twitter Dev für Tweepy's App Auth Handler
auth = tweepy.AppAuthHandler(consumer_key, consumer_secret)

#Erstellung des Twitter API Wrapper mittels tweepy
api = tweepy.API(auth, wait_on_rate_limit = True, wait_on_rate_limit_notify = True)

#Damit findet man heraus, wie viele Anfragen noch übrig sind (mittels rate_limit_status() Methode)
api.rate_limit_status()['resources']['search']

{'/search/tweets': {'limit':450, 'remaining': 450, 'reset': 1470850812}}

#Fehlerbehandlung
if (not api):
    print ("Problem connecting to API")

#Danach soll gesucht werden
searchQuery = '"ECB" OR "Draghi"'

#Die maximale Anzahl an Tweets, die man sammeln will
maxTweets = 1000000

#Die Twitter Search API erlaubt nur bis zu 100 Tweets pro Anfrage
tweetsPerQry = 100

#Bau einer Schleife um die gesammelten Tweets in JSON Format in einer Text Datei zu sammeln und dabei keine doppelten
#Einträge zu haben.

tweetCount = 0

#Eröffnen einer Textdatei um die Tweets einzutragen
with open('ECB.json', 'w') as f:

    #Der Cursor Method Funktion wird mitgeteilt, dass die Search API genutzt werden soll (api.search)
    #Außerdem werden dem Cursor die Limitationen (Anfrage, maximale Anzahl an Tweets etc.) mitgeteilt
    for tweet in tweepy.Cursor(api.search, q = searchQuery).items(maxTweets):
    #NEU
        try:
    #NEUENDE
        #Sicherstellung des Platzes für das Tweet bevor es eingetragen wird
            if tweet.place is not None:

            #JSON Format wird in die Textdatei geschrieben und dann wird eine Zeile darunter weitergeschrieben und
            #als 1 Tweet gezählt
                f.write(jsonpickle.encode(tweet._json, unpicklable = False) + '\n')
                tweetCount += 1
    #NEU
        except TweepError as e:
            if 'Failed to send request:' in e.reason:
                print("Time out error caught.")
                time.sleep(180)
            continue
    #NEUENDE
    #Display how many tweets we have collected
    print("Downloaded {0} tweets".format(tweetCount))

Liebe Grüße und danke im Voraus!
pytony
Zuletzt geändert von Anonymous am Mittwoch 14. Juni 2017, 11:42, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@pytony: Als erstes würde ich mal PyCharm aus der Gleichung nehmen. Man lässt doch nicht tagelang eine ziemlich fette IDE laufen, nur weil man Tweets sammeln möchte.

Ansonsten würde ich darauf tippen, dass Du Dir klar machen musst was die `wait_*`-Argumente in Zeile 20 bedeuten und der Code in den Zeilen 22 bis 25 (auch wenn der so wie er da steht 100% sinnlos ist).

Die Zeilen 28 und 29 machen keinen Sinn weil `api` *immer* ”wahr” ist. Der Code kann ersatzlos wegfallen.

Namen werden in Python übrigens klein_mit_unterstrichen geschrieben. Ausgenommen Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Und Abkürzungen die nicht allgemein bekannt sind, sollte man vermeiden. Also beispielsweise `tweets_per_query` statt `tweetsPerQry`.

Das ``continue`` am Ende der Schleife hat keinen feststellbaren Effekt, also sollte das weg.
pytony
User
Beiträge: 25
Registriert: Mittwoch 14. Juni 2017, 11:26

vielen lieben Dank! Ausgelassen und alles hat funktioniert :-)
Antworten