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

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

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

Beitragvon pytony » Mittwoch 14. Juni 2017, 11:37

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:
  1. #Importieren der Bibliotheken (Libraries)
  2. import sys
  3. import os
  4. import jsonpickle
  5. import tweepy
  6.  
  7. #Sammlung und Definition der Access Daten von Twitter. Diese enthalten nur Lese-Berechtigungen
  8. access_token = "AUSGEBLENDET"
  9.  
  10. access_token_secret = "AUSGEBLENDET"
  11.  
  12. consumer_key = "AUSGEBLENDET"
  13.  
  14. consumer_secret = "AUSGEBLENDET"
  15.  
  16. #Einbindung unseres vorher definierten Consumer Key und Consumer Secret von Twitter Dev für Tweepy's App Auth Handler
  17. auth = tweepy.AppAuthHandler(consumer_key, consumer_secret)
  18.  
  19. #Erstellung des Twitter API Wrapper mittels tweepy
  20. api = tweepy.API(auth, wait_on_rate_limit = True, wait_on_rate_limit_notify = True)
  21.  
  22. #Damit findet man heraus, wie viele Anfragen noch übrig sind (mittels rate_limit_status() Methode)
  23. api.rate_limit_status()['resources']['search']
  24.  
  25. {'/search/tweets': {'limit':450, 'remaining': 450, 'reset': 1470850812}}
  26.  
  27. #Fehlerbehandlung
  28. if (not api):
  29.     print ("Problem connecting to API")
  30.  
  31. #Danach soll gesucht werden
  32. searchQuery = '"ECB" OR "Draghi"'
  33.  
  34. #Die maximale Anzahl an Tweets, die man sammeln will
  35. maxTweets = 1000000
  36.  
  37. #Die Twitter Search API erlaubt nur bis zu 100 Tweets pro Anfrage
  38. tweetsPerQry = 100
  39.  
  40. #Bau einer Schleife um die gesammelten Tweets in JSON Format in einer Text Datei zu sammeln und dabei keine doppelten
  41. #Einträge zu haben.
  42.  
  43. tweetCount = 0
  44.  
  45. #Eröffnen einer Textdatei um die Tweets einzutragen
  46. with open('ECB.json', 'w') as f:
  47.  
  48.     #Der Cursor Method Funktion wird mitgeteilt, dass die Search API genutzt werden soll (api.search)
  49.     #Außerdem werden dem Cursor die Limitationen (Anfrage, maximale Anzahl an Tweets etc.) mitgeteilt
  50.     for tweet in tweepy.Cursor(api.search, q = searchQuery).items(maxTweets):
  51.     #NEU
  52.         try:
  53.     #NEUENDE
  54.         #Sicherstellung des Platzes für das Tweet bevor es eingetragen wird
  55.             if tweet.place is not None:
  56.  
  57.             #JSON Format wird in die Textdatei geschrieben und dann wird eine Zeile darunter weitergeschrieben und
  58.             #als 1 Tweet gezählt
  59.                 f.write(jsonpickle.encode(tweet._json, unpicklable = False) + '\n')
  60.                 tweetCount += 1
  61.     #NEU
  62.         except TweepError as e:
  63.             if 'Failed to send request:' in e.reason:
  64.                 print("Time out error caught.")
  65.                 time.sleep(180)
  66.             continue
  67.     #NEUENDE
  68.     #Display how many tweets we have collected
  69.     print("Downloaded {0} tweets".format(tweetCount))



Liebe Grüße und danke im Voraus!
pytony
Zuletzt geändert von BlackJack am Mittwoch 14. Juni 2017, 11:42, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
BlackJack
Moderator
Beiträge: 32499
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

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

Beitragvon BlackJack » Mittwoch 14. Juni 2017, 12:14

@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.
“There are only two industries that refer to their customers as users.” — Edward Tufte

Zurück zu „Codesnippets“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder