Twitter Scraper - Problem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
roarhide
User
Beiträge: 4
Registriert: Mittwoch 10. Juli 2019, 18:08

Hey Leute,

ich würde gerne Twitter Daten analysieren, aber kann mit maxQDA immer nur eine Woche importieren. Da ich aber gerne ältere Tweets hätte, bin ich nun auf diese Methode gestoßen.

https://www.youtube.com/watch?v=Ou_floKQqd8

Ich komme aus einem ganz anderen Bereich und habe eigentlich gar keine Ahnung von Python, deswegen hoffe ich, dass ihr mir helfen könnt.
Eigentlich klappt alles, nur am Ende kommt diese Fehlermeldung (siehe Bild)
Habe raw_input zu input geändert. Sonst ist alles wie im Video, hier der Code https://github.com/ritvikmath/ScrapingD ... Data.ipynb

Ich bedanke mich schon mal im Voraus
LG!
Bild
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

das beigefügte Bild ist nicht entzifferbar, wie wäre es mit copy und paste?
roarhide
User
Beiträge: 4
Registriert: Mittwoch 10. Juli 2019, 18:08

Ahja... Sehe es auch gerade.

Hier nochmal das gesamt Ding

Code: Alles auswählen

import json
import csv
import tweepy
import re

Code: Alles auswählen

"""
INPUTS:
    consumer_key, consumer_secret, access_token, access_token_secret: codes 
    telling twitter that we are authorized to access this data
    hashtag_phrase: the combination of hashtags to search for
OUTPUTS:
    none, simply save the tweet info to a spreadsheet
"""
def search_for_hashtags(consumer_key, consumer_secret, access_token, access_token_secret, hashtag_phrase):
    
    #create authentication for accessing Twitter
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)

    #initialize Tweepy API
    api = tweepy.API(auth)
    
    #get the name of the spreadsheet we will write to
    fname = '_'.join(re.findall(r"#(\w+)", hashtag_phrase))

    #open the spreadsheet we will write to
    with open('%s.csv' % (fname), 'wb') as file:

        w = csv.writer(file)

        #write header row to spreadsheet
        w.writerow(['timestamp', 'tweet_text', 'username', 'all_hashtags', 'followers_count'])

        #for each tweet matching our hashtags, write relevant info to the spreadsheet
        for tweet in tweepy.Cursor(api.search, q=hashtag_phrase+' -filter:retweets', \
                                   lang="de", tweet_mode='extended').items(100):
            w.writerow([tweet.created_at, tweet.full_text.replace('\n',' ').encode('utf-8'), tweet.user.screen_name.encode('utf-8'), [e['text'] for e in tweet._json['entities']['hashtags']], tweet.user.followers_count])

Code: Alles auswählen

consumer_key = input('Consumer Key ')
consumer_secret = input('Consumer Secret ')
access_token = input('Access Token ')
access_token_secret = input('Access Token Secret ')
    
hashtag_phrase = input('Hashtag Phrase ')

if __name__ == '__main__':
    search_for_hashtags(consumer_key, consumer_secret, access_token, access_token_secret, hashtag_phrase)

Dann gebe ich die entsprechenden APIs und hashtags ein

und dann kommt dieser Fehler

Code: Alles auswählen

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-97600f226d21> in <module>
      7 
      8 if __name__ == '__main__':
----> 9     search_for_hashtags(consumer_key, consumer_secret, access_token, access_token_secret, hashtag_phrase)

NameError: name 'search_for_hashtags' is not defined
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast nicht alle Zellen Deines Notebooks in der Reihenfolge ausgeführt.
roarhide
User
Beiträge: 4
Registriert: Mittwoch 10. Juli 2019, 18:08

Okay, wenn ich die oberen Zellen auch ausführe, dann erstellt er mir jetzt zwar die Datei, aber ohne Inhalt

Hat das damit was zu tun, dass ich Python 3.7 habe und im Video (und den Code) Python 2.x verwendet wurde ?

Code: Alles auswählen

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-97600f226d21> in <module>
      7 
      8 if __name__ == '__main__':
----> 9     search_for_hashtags(consumer_key, consumer_secret, access_token, access_token_secret, hashtag_phrase)

<ipython-input-2-02652c2d50b3> in search_for_hashtags(consumer_key, consumer_secret, access_token, access_token_secret, hashtag_phrase)
     25 
     26         #write header row to spreadsheet
---> 27         w.writerow(['timestamp', 'tweet_text', 'username', 'all_hashtags', 'followers_count'])
     28 
     29         #for each tweet matching our hashtags, write relevant info to the spreadsheet

TypeError: a bytes-like object is required, not 'str'
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Genau. Du öffnest Die Datei im Binärmodus ("wb"), weil das csv-Modul in Python2 noch Probleme mit Unicode hatte. Statt dessen solltest Du beim Öffnen als Textdatei Dein gewünschtes Encoding angeben und die explizite Codierung beim Schreiben entfernen.

Du solltest auch keine Liste im Argument für `writerow` übergeben, da da nur die Repräsentation der Liste als String geschrieben wird und die ist nicht für die Ausgabe und Weiterverarbeitung gedacht, sondern nur für Debug-Zwecke.
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: Der letzte Absatz stimmt aber nicht, oder ist es noch zu früh für mich? (Hatte noch keinen Kaffee :-))
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@__blackjack__: ich wußte nicht, was damit passiert und habe es ausprobiert. Was sollte denn sonst ausgegeben werden?
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: Okay, es lag am Kaffee. Ich habe nur auf den `writerow()`-Aufruf im Traceback geachtet und Deine Formulierung missverstanden. Eine Liste *in* der Liste die als Argument übergeben wird, ist natürlich keine gute Idee.

@roarhide: Das solltest Du explizit selbst irgendwie in eine Zeichenkettendarstellung bringen, die man später auch einfach weiterverarbeiten kann. Beispielsweise die Hashtags einfach nur durch Leerzeichen getrennt, oder als JSON kodiert.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
roarhide
User
Beiträge: 4
Registriert: Mittwoch 10. Juli 2019, 18:08

Danke für eure Hilfe,

habe es jetzt aber über diesen Weg lösen können!
https://www.youtube.com/watch?v=zF_Q2v_ ... 2418596072
Antworten