Datenabank von Twitternutzern anlegen

Probleme bei der Installation?
Antworten
Moses243
User
Beiträge: 3
Registriert: Mittwoch 29. Oktober 2014, 16:16

Hallo liebe Pyhton-Forum-Gemeinde,

ich probiere schon länger mit Python von Twitter Daten zu ziehen und nützliche Informationen zu gewinnen, jetzt möchte ich dazu 1000 Benutzer zufällig auswählen, dazu habe ich mir gedacht (ich lass mich gerne eines besseren belehren!), dass ich ein StreamListener verwende um einfach sagen wir mal 20.000-50.000 Tweets zu ziehen in Excel zu packen und dann am Ende über eine zufällige Auswahl 1000 davon auswähle.
Das Problem an der Sache ist nur, ich würde mich gerne auf Deutsche Benutzer beschränken, und entsprechend dafür den Stream nur über die Sprache eingrenzen, wenn ich nun folgenden Code und Tweepy verwende:

Code: Alles auswählen

from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream

consumer_key= ''
consumer_secret= ''

access_token= ''
access_token_secret= ''

class StdOutListener(StreamListener):
    
    def on_data(self, data):
        print data
        saveFile = open('twitDB.csv', 'a')
        saveFile.write(data)
        saveFile.write('\n')
        saveFile.close()
        return True

    def on_error(self, status):
        print status

if __name__ == '__main__':
    l = StdOutListener()
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)

    stream = Stream(auth, l)
    stream.filter(languages=['de'])
bekomme ich den Error 406 immer zurück, nur wenn ich eine Suchwort mit track=['blabla'] filter geht es.
Hat jemand da eine Lösung für? Oder einen alternativen Ansatz?

Wäre für jede Hilfe sehr dankbar!

Beste Grüße
Moses243
Zuletzt geändert von Anonymous am Freitag 31. Oktober 2014, 10:21, insgesamt 2-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Moses243: Bist Du sicher das es `languages` heisst? Der Parameter in der Twitter-API-Dokumentation heisst nämlich `language`.
Moses243
User
Beiträge: 3
Registriert: Mittwoch 29. Oktober 2014, 16:16

BlackJack hat geschrieben:@Moses243: Bist Du sicher das es `languages` heisst? Der Parameter in der Twitter-API-Dokumentation heisst nämlich `language`.
Ja hat mich auch gewundert, zumal es sonst ja auch immer einfach mit "lang" abgekürzt wird, aber nur so funktioniert es.
Hm also ich hab nochmal überlegt und jetzt einfach als weiteren Filter gesagt er soll nach den Buchstaben 'a', 'e', 'i', 'o', 'u' Filtern, die sollten ja in 99% der Tweets enthalten sein, somit ist das Problem gelöst.

Aber ne andere Frage, wenn ich die Tweets etwas schöner speichern möchte, also um die Verarbeitung zu erleichtern, zB mit xlwt hab ich das nun so gelöst:

Code: Alles auswählen

class StdOutListener(StreamListener):
  
    def on_data(self, data):
        
        try:
            tweet = json.loads(data)
            rb = xlrd.open_workbook('TweetDB.xls',formatting_info=True)
            r_sheet1 = rb.sheet_by_index(0) 
            m = r_sheet1.nrows+1
            wb = copy(rb) 
            sheet1 = wb.get_sheet(0) 
            
            sheet1.write(m,0,tweet['user']['name'])
            sheet1.write(m,1,tweet['user']['screen_name'])
            sheet1.write(m,2,tweet['text'])
            sheet1.write(m,3,tweet['id'])
            sheet1.write(m,4,tweet['user']['statuses_count'])
            sheet1.write(m,5,tweet['created_at'])
            sheet1.write(m,6,tweet['created_at'])
            sheet1.write(m,7,tweet['user']['created_at'])
            sheet1.write(m,8,tweet['text'])
            sheet1.write(m,10,tweet['user']['profile_image_url_https'])
            sheet1.write(m,12,tweet['user']['followers_count'])
            
            wb.save('TweetDB.xls')


        except BaseException, e: #baseException because there may be a rate limit or internet drop
            print 'failed ondata,',str(e)
            time.sleep(5)
        
        
    def on_error(self, status):
        print status
    
if __name__ == '__main__':
    
    book = Workbook(encoding='utf-8')
    sheet1 = book.add_sheet('Sheet 1')

   
    sheet1.write(0,0,'Name')
    sheet1.write(0,1,'Twitter-Name')
    sheet1.write(0,2,'ID')
    sheet1.write(0,3,'Tweet-ID')
    sheet1.write(0,4,'Anzahl an Tweets')
    sheet1.write(0,5,'Datum')
    sheet1.write(0,6,'Uhrzeit')
    sheet1.write(0,7,'Account erstellt am')
    sheet1.write(0,8,'Tweet')
    sheet1.write(0,9,'Benutzer URL')
    sheet1.write(0,10, 'Bild URL')
    sheet1.write(0,12,'Anzahl Follower')
    book.save('TweetDB.xls')
    
    l = StdOutListener()
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)

    stream = Stream(auth, l)
    stream.filter(track=['a', 'e', 'i', 'o', 'u'], languages=['de'])
Das ist aber seeehr langsam dann.. Ich möchte halt diese Daten in einzelnen Feldern, und wenn ich nun bei csv zB nach Komma trenne, trennt er meist auch tweets wenn die eben welche enthalten :( hat da jemand ne Idee das zu beschleunigen?

Danke und Gruß!
Zuletzt geändert von Anonymous am Freitag 31. Oktober 2014, 10:25, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt
BlackJack

@Moses243: Die beste Idee wäre das nicht in einer Exceltabelle zu speichern. Exceltabellen sind keine Datenbanken. Ich würde das entweder in eine Datenbank stecken oder zum Beispiel als YAML speichern.

Wobei in CSV-Dateien durchaus auch Kommas innerhalb von Feldern vorkommen dürfen. Du verwendest schon das `csv`-Modul statt da selber irgendwas ”einfaches” zu basteln, oder?
Moses243
User
Beiträge: 3
Registriert: Mittwoch 29. Oktober 2014, 16:16

@BlackJack Ich befürchte ich verwende die einfache Methodik:

Code: Alles auswählen

saveFile = open('TweetDB.csv','a')
            saveFile.write(json_data)
            saveFile.close()
Ich hatte gedacht Excel zu verwenden, weil ich mich da für die Abfragen die ich machen möchte auskenne :oops:
Kann man denn ein "schöneres" csv File anlegen welches sich dann später besser bearbeiten/trennen lässt in Excel? Also ich hab bisher eben das obige verwendet und dann in Excel einfach nach "," in Felder getrennt.

Danke für die Hilfe!
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Moses243: wenn Du json-Daten schreibst, gibt das doch nie und nimmer eine csv-Datei hin.
Bei Deiner Excel-Lösung solltest Du halt nicht für jeden Datensatz die gesamte XLS-Datei lesen und wieder schreiben, sondern erst alles Sammeln und zum Schluß schreiben.
BlackJack

@Moses243: Das mit Excel ist also ein typischer Fall von „Wenn man nur einen Hammer als Lösung hat/kennt, sieht jedes Problem aus wie ein Nagel.” ;-)

Ich würde ja wie gesagt als YAML speichern. Da kann man direkt das deserialsiserte JSON als YAML serialisieren und hat damit immer den kompletten Tweet gespeichert ohne irgendwelche Daten zu verlieren. Wie man solche Stream-Mitschnitte danach weiterverarbeitet kann man später/unabhängig vom Aufzeichnen entscheiden.

Noch mal zum Ausgangsproblem: Lesen der Dokumentation hilft manchmal:
https://dev.twitter.com/streaming/reference/post/statuses/filter hat geschrieben:Parameters

*Note: At least one predicate parameter (follow, locations, or track) must be specified.
Und zu `track` findet man das maximal 400 Schlüsselworte angegeben werden dürfen, da kann man also mehr als nur Umlaute übergeben.
Antworten