質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

671閲覧

結果をcsvに出力するコード

kkoorroo

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2017/09/10 03:22

編集2017/09/11 01:38

Python初心者です.Twitter APIを使ってツイートを収集し,分析をしたいと考えています.下部のコードを実行した結果(”スカイツリー”を含むツイートを3000件集める)が以下の通りなのですが,これをCSVとして出力する(書き出す)方法がわかりません.どの部分にどのように記述すれば良いかがわからないです.ネットのほとんどの記事は見ましたが,状況が違うのでこのコードにあった書き方がわかりませんでした.色々調べたのですが,よくわかりませんでした.面倒でなければ,csvとして出力するためのコードを追記していただけると助かります.よろしくお願いいたします.

結果---------------------
------ 1
906703980826288129 Sun Sep 10 02:20:49 +0000 2017 @turugi_m
@SnowMican 浅草とかスカイツリー方面行くときに使ったような使わなかったようなw
------ 2
906703861531934720 Sun Sep 10 02:20:20 +0000 2017 @MutoWisteria
I'm at 半蔵門線 押上<スカイツリー前>駅 - @z_line_info in 墨田区, 東京都 https://t.co/Yv1HEmQb6E
------ 3
906703604819517440 Sun Sep 10 02:19:19 +0000 2017 @wabbsm8
9/9、木場公園、後ろにスカイツリー
キク科コスモス属キバナコスモス https://t.co/aNIvnqe2ZW
------ 4
906703557629403137 Sun Sep 10 02:19:08 +0000 2017 @7010T1
スカイツリーから下りて、すみだ水族館に来たー
(以下,計3000件)

Python

1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3""" 4Created on Mon Sep 4 21:29:54 2017 5 6@author: **** 7""" 8 9# -*- coding: utf-8 -*- 10 11from requests_oauthlib import OAuth1Session 12import json 13import datetime, time, sys 14from abc import ABCMeta, abstractmethod 15 16CK = '****' # Consumer Key 17CS = '****' # Consumer Secret 18AT = '****' # Access Token 19AS = '****' # Accesss Token Secert 20 21class TweetsGetter(object): 22 __metaclass__ = ABCMeta 23 24 def __init__(self): 25 self.session = OAuth1Session(CK, CS, AT, AS) 26 27 @abstractmethod 28 def specifyUrlAndParams(self, keyword): 29 ''' 30 呼出し先 URL、パラメータを返す 31 ''' 32 33 @abstractmethod 34 def pickupTweet(self, res_text, includeRetweet): 35 ''' 36 res_text からツイートを取り出し、配列にセットして返却 37 ''' 38 39 @abstractmethod 40 def getLimitContext(self, res_text): 41 ''' 42 回数制限の情報を取得 (起動時) 43 ''' 44 45 def collect(self, total = -1, onlyText = False, includeRetweet = False): 46 ''' 47 ツイート取得を開始する 48 ''' 49 50 #---------------- 51 # 回数制限を確認 52 #---------------- 53 self.checkLimit() 54 55 #---------------- 56 # URL、パラメータ 57 #---------------- 58 url, params = self.specifyUrlAndParams() 59 params['include_rts'] = str(includeRetweet).lower() 60 # include_rts は statuses/user_timeline のパラメータ。search/tweets には無効 61 62 #---------------- 63 # ツイート取得 64 #---------------- 65 cnt = 0 66 unavailableCnt = 0 67 while True: 68 res = self.session.get(url, params = params) 69 if res.status_code == 503: 70 # 503 : Service Unavailable 71 if unavailableCnt > 10: 72 raise Exception('Twitter API error %d' % res.status_code) 73 74 unavailableCnt += 1 75 print ('Service Unavailable 503') 76 self.waitUntilReset(time.mktime(datetime.datetime.now().timetuple()) + 30) 77 continue 78 79 unavailableCnt = 0 80 81 if res.status_code != 200: 82 raise Exception('Twitter API error %d' % res.status_code) 83 84 tweets = self.pickupTweet(json.loads(res.text)) 85 if len(tweets) == 0: 86 # len(tweets) != params['count'] としたいが 87 # count は最大値らしいので判定に使えない。 88 # ⇒ "== 0" にする 89 # https://dev.twitter.com/discussions/7513 90 break 91 92 for tweet in tweets: 93 if (('retweeted_status' in tweet) and (includeRetweet is False)): 94 pass 95 else: 96 if onlyText is True: 97 yield tweet['text'] 98 else: 99 yield tweet 100 101 cnt += 1 102 if cnt % 100 == 0: 103 print ('%d件 ' % cnt) 104 105 if total > 0 and cnt >= total: 106 return 107 108 params['max_id'] = tweet['id'] - 1 109 110 # ヘッダ確認 (回数制限) 111 # X-Rate-Limit-Remaining が入ってないことが稀にあるのでチェック 112 if ('X-Rate-Limit-Remaining' in res.headers and 'X-Rate-Limit-Reset' in res.headers): 113 if (int(res.headers['X-Rate-Limit-Remaining']) == 0): 114 self.waitUntilReset(int(res.headers['X-Rate-Limit-Reset'])) 115 self.checkLimit() 116 else: 117 print ('not found - X-Rate-Limit-Remaining or X-Rate-Limit-Reset') 118 self.checkLimit() 119 120 def checkLimit(self): 121 ''' 122 回数制限を問合せ、アクセス可能になるまで wait する 123 ''' 124 unavailableCnt = 0 125 while True: 126 url = "https://api.twitter.com/1.1/application/rate_limit_status.json" 127 res = self.session.get(url) 128 129 if res.status_code == 503: 130 # 503 : Service Unavailable 131 if unavailableCnt > 10: 132 raise Exception('Twitter API error %d' % res.status_code) 133 134 unavailableCnt += 1 135 print ('Service Unavailable 503') 136 self.waitUntilReset(time.mktime(datetime.datetime.now().timetuple()) + 30) 137 continue 138 139 unavailableCnt = 0 140 141 if res.status_code != 200: 142 raise Exception('Twitter API error %d' % res.status_code) 143 144 remaining, reset = self.getLimitContext(json.loads(res.text)) 145 if (remaining == 0): 146 self.waitUntilReset(reset) 147 else: 148 break 149 150 def waitUntilReset(self, reset): 151 ''' 152 reset 時刻まで sleep 153 ''' 154 seconds = reset - time.mktime(datetime.datetime.now().timetuple()) 155 seconds = max(seconds, 0) 156 print ('\n =====================') 157 print (' == waiting %d sec ==' % seconds) 158 print (' =====================') 159 sys.stdout.flush() 160 time.sleep(seconds + 10) # 念のため + 10 秒 161 162 @staticmethod 163 def bySearch(keyword): 164 return TweetsGetterBySearch(keyword) 165 166 @staticmethod 167 def byUser(screen_name): 168 return TweetsGetterByUser(screen_name) 169 170 171class TweetsGetterBySearch(TweetsGetter): 172 ''' 173 キーワードでツイートを検索 174 ''' 175 def __init__(self, keyword): 176 super(TweetsGetterBySearch, self).__init__() 177 self.keyword = keyword 178 179 def specifyUrlAndParams(self): 180 ''' 181 呼出し先 URL、パラメータを返す 182 ''' 183 url = 'https://api.twitter.com/1.1/search/tweets.json' 184 params = {'q':self.keyword, 'count':100} 185 return url, params 186 187 def pickupTweet(self, res_text): 188 ''' 189 res_text からツイートを取り出し、配列にセットして返却 190 ''' 191 results = [] 192 for tweet in res_text['statuses']: 193 results.append(tweet) 194 195 return results 196 197 def getLimitContext(self, res_text): 198 ''' 199 回数制限の情報を取得 (起動時) 200 ''' 201 remaining = res_text['resources']['search']['/search/tweets']['remaining'] 202 reset = res_text['resources']['search']['/search/tweets']['reset'] 203 204 return int(remaining), int(reset) 205 206 207class TweetsGetterByUser(TweetsGetter): 208 ''' 209 ユーザーを指定してツイートを取得 210 ''' 211 def __init__(self, screen_name): 212 super(TweetsGetterByUser, self).__init__() 213 self.screen_name = screen_name 214 215 def specifyUrlAndParams(self): 216 ''' 217 呼出し先 URL、パラメータを返す 218 ''' 219 url = 'https://api.twitter.com/1.1/statuses/user_timeline.json' 220 params = {'screen_name':self.screen_name, 'count':200} 221 return url, params 222 223 def pickupTweet(self, res_text): 224 ''' 225 res_text からツイートを取り出し、配列にセットして返却 226 ''' 227 results = [] 228 for tweet in res_text: 229 results.append(tweet) 230 231 return results 232 233 def getLimitContext(self, res_text): 234 ''' 235 回数制限の情報を取得 (起動時) 236 ''' 237 remaining = res_text['resources']['statuses']['/statuses/user_timeline']['remaining'] 238 reset = res_text['resources']['statuses']['/statuses/user_timeline']['reset'] 239 240 return int(remaining), int(reset) 241 242if __name__ == '__main__': 243 244 # キーワードで取得 245 getter = TweetsGetter.bySearch(u'スカイツリー') 246 247 # ユーザーを指定して取得 (screen_name) 248 #getter = TweetsGetter.byUser('AbeShinzo') 249 250 cnt = 0 251 for tweet in getter.collect(total = 3000): 252 cnt += 1 253 print ('------ %d' % cnt) 254 print ('{} {} {}'.format(tweet['id'], tweet['created_at'], '@'+tweet['user']['screen_name'])) 255 print (tweet['text']) 256 # 257--------------------

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

他人が書いたコードを出典を明記せずあたかも自分が作成中のコードのように投稿するのはやめてください。必要であれば該当ページへのリンクを張れば十分伝わります。

CSVの書き出し方法はググればいくらでも出てくるはずです。

結果を print() している部分をCSVを書き出す処理に変えるだけです。なお teratail はプログラミング代行サービスではありませんので、コードは明示しません。

投稿2017/09/10 04:20

miyahan

総合スコア3095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

df.to_csv('ファイル名.csv')、ではなくて???

投稿2019/10/15 09:56

john_doe_

総合スコア354

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問