2017-02-22 19 views
0

TweepyとPythonを使用して、Twitterから完全に拡張された1000個のURIを抽出しようとしています。具体的には、私はTwitterの外に向かうリンクに興味があります(他のつぶやき/リツイート/重複には戻っていません)。TweepyとPythonを使用してTwitterから1000個のURIを抽出する

私が書いたコードでは、「エンティティ」のキーエラーが表示され続けます。

壊す前に私にいくつかのURLを与えます。いくつかは拡張され、いくつかは拡張されません。私はこれを修正する方法を知りません。

お願いします!

注:私は自分の資格情報を残しました。ここで

が私のコードです:

# Import the necessary methods from different libraries 
     import tweepy 
     from tweepy.streaming import StreamListener 
     from tweepy import OAuthHandler 
     from tweepy import Stream 
     import json 

    # Variables that contains the user credentials to access Twitter API 
     access_token = "enter token here" 
     access_token_secret = "enter token here" 
     consumer_key = "enter key here" 
     consumer_secret = "enter key here" 

    # Accessing tweepy API 
    # api = tweepy.API(auth) 

    # This is a basic listener that just prints received tweets to stdout. 
    class StdOutListener(StreamListener): 
     def on_data(self, data): 
     # resource: http://code.runnable.com/Us9rrMiTWf9bAAW3/how-to-    stream-data-from-twitter-with-tweepy-for-python 
    # Twitter returns data in JSON format - we need to decode it first 
    decoded = json.loads(data) 

    # resource: http://socialmedia-class.org/twittertutorial.html 
    # Print each tweet in the stream to the screen 
    # Here we set it to stop after getting 1000 tweets. 
    # You don't have to set it to stop, but can continue running 
    # the Twitter API to collect data for days or even longer. 
    count = 1000 

    for url in decoded["entities"]["urls"]: 
     count -= 1 
     print "%s" % url["expanded_url"] + "\r\n\n" 
     if count <= 0: 
      break 

def on_error(self, status): 
    print status 


if __name__ == '__main__': 
    # This handles Twitter authetification and the connection to Twitter  Streaming API 
l = StdOutListener() 
auth = OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_token, access_token_secret) 
stream = Stream(auth, l) 

# This line filter Twitter Streams to capture data by the keyword: YouTube 
stream.filter(track=['YouTube']) 
+0

まずは、インターネット上でプライベートキーを共有しないでください。あなたの認証資格情報が侵害され、鍵を再生成する必要があります。あなたの質問に関しては、「デコードされた」オブジェクトがどのように見えるかわからないので、問題を解決する方法を知ることは難しいです。デコードされた最初の項目を出力し、スクリプトを停止する必要があります。 '' 'print(デコードされた[0])' 'オブジェクトを検査する - エンティティのプロパティはありますか? –

+0

おっと!それをするつもりはありませんでした。ありがとうございました!どのように見えるのですか? –

答えて

0

APIレート制限を当たっているように思えるので、一つの選択肢は、それがKeyErrorを取得したときに、私はその後、[u'limit']を参照の例外を含めることです。カウント表示を追加して、1000になることを確認しました。

count = 1000 # moved outside of class definition to avoid getting reset 

class StdOutListener(StreamListener): 
    def on_data(self, data): 

     decoded = json.loads(data) 

     global count # get the count 
     if count <= 0: 
      import sys 
      sys.exit() 
     else: 
      try: 
       for url in decoded["entities"]["urls"]: 
        count -= 1 
        print count,':', "%s" % url["expanded_url"] + "\r\n\n" 

      except KeyError: 
       print decoded.keys() 

    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(track=['YouTube']) 
+0

ああ、うわー!どうもありがとうございます。そのような違いを生み出すクラスのデフから動かすことは知らなかった。 –

+0

大歓迎です。あなたはそれを試しましたか?私はそれが助けて欲しいクラスがインスタンス化されるたびに、クラスが「1000」にリセットされていることに気がついたので、私はそれをクラスdefから移動しました。その後、それは正しく数えるように見えました:) – davedwards

+0

これは間違いなく1000になりました!私はそれを働かせるためにこれほど長い間それを試してみました!あなたは素晴らしいです!今、これらのURLが完全に拡張されているかどうかを判断するだけです。 –

関連する問題