pythonでつくる対話システムという本で対話システムについて学んでいるのですが
twitterからのデータ収集がうまくいきません。
エラーをなくし、実行できるまでにはしたのですが
実行結果が0pairsのまま動きません。
下記にプログラムを載せました。
わかる方対応していただけるとありがたいです。
python
1import tweepy 2import random 3import re 4 5 6while True: 7 # ここに先程取得したAPIキーとトークンを入力 8 api_key = "XXXXX" 9 api_secret_key = "XXXXX" 10 access_token = "XXXXX" 11 access_token_secret = "XXXXX" 12 13 auth = tweepy.OAuthHandler(api_key, api_secret_key) 14 auth.set_access_token(access_token, access_token_secret) 15 api = tweepy.API(auth, wait_on_rate_limit=True) 16 17 # botのツイートを除外するため,一般的なクライアント名を列挙 18 sources = ["TweetDeck", "Twitter Web Client", "Twitter for iPhone", 19 "Twitter for iPad", "Twitter for Android", "Twitter for Android Tablets", 20 "ついっぷる", "Janetter", "twicca", "Keitai Web", "Twitter for Mac"] 21 22 23 # ひらがな一文字で検索し,スクリーンネームを取得 24 words = list("あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん") 25 26 #set()は集合、同じ要素は除外される 27 screen_names = set() 28 #適当な文字を含むツイートを選び、そのツイートのクライアントがsourcesにいればスクリーンネーム(@から始まる名前)を追加する 29 for s in api.search_tweets(q=random.choice(words), lang='ja', result_type='recent', count=100, tweet_mode='extended'): 30 if s.source in sources: 31 screen_names.add(s.author.screen_name) 32 33 # ステータスidからステータスを得るためのdict 34 id2status = {} 35 36 # スクリーンネームからタイムラインを取得してツイートを保存. 37 # さらにリプライツイートであれば,リプライ先のスクリーンネームも取得 38 in_reply_to_screen_names = set() 39 for name in screen_names: 40 try: 41 #screen_namesの中にあるユーザーのタイムラインを見る 42 for s in api.user_timeline(name, tweet_mode='extended', count=200): 43 # リンクもしくはハッシュタグを含むツイートは除外する 44 if "http" not in s.full_text and "#" not in s.full_text: 45 id2status[s.id] = s 46 #ユーザーにリプライしているユーザーのスクリーンネームも保存 47 if s.in_reply_to_screen_name is not None: 48 if s.in_reply_to_screen_name not in screen_names: 49 in_reply_to_screen_names.add(s.in_reply_to_screen_name) 50 except Exception as e: 51 continue 52 53 # リプライ先のスクリーンネームからタイムラインを取得してツイートを保存 54 for name in in_reply_to_screen_names: 55 try: 56 for s in api.user_timeline(name, tweet_mode='extended', count=200): 57 if "http" not in s.full_text and "#" not in s.full_text: 58 id2status[s.id] = s 59 except Exception as e: 60 continue 61 62 # 保存したツイートのリプライ先のツイートが保存されていれば,id2replyidのキーを元ツイートのid,値をリプライ先ツイートのidとする 63 id2replyid = {} 64 for _, s in id2status.items(): 65 if s.in_reply_to_status_id in id2status: 66 id2replyid[s.in_reply_to_status_id] = s.id 67 68 69 # id2replyidのkey valueからstatusを取得し,ツイートペアをタブ区切りで保存 70 f = open("tweet_pairs.txt", "a") 71 for id, rid in id2replyid.items(): 72 # 改行は半角スペースに置換 73 tweet1 = id2status[id].full_text.replace("\n", " ") 74 # スクリーンネームを正規表現を用いて削除 75 tweet1 = re.sub(r"@[0-9a-zA-Z_]{1,15} +", "", tweet1) 76 77 tweet2 = id2status[rid].full_text.replace("\n", " ") 78 tweet2 = re.sub(r"@[0-9a-zA-Z_]{1,15} +", "", tweet2) 79 80 f.write(tweet1+ "\t" + tweet2 + "\n") 81 f.close() 82 print("Write " + str(len(id2replyid)) + " pairs.") 83 84
エラーが出て困っているのか、0件になってしまって(=常に Write 0 pairs. になってしまって)困っているのか、どちらなのか伝わってません。
特に前者ならエラーをそのまま載せてください。(個人名/アカウント名はマスクしてよいですが)
参考 https://teratail.com/help/question-tips#questionTips34
後者です。常にWrite 0 pairs.なってしまって困っています。
except Exception as e: continue (どうせインデントされないので1行にしました)
と書いて無視している箇所のいずれかでエラーが起きていて、それで困っている
という内容の質問ではないというわけですね……。
あなたの回答
tips
プレビュー