-
Notifications
You must be signed in to change notification settings - Fork 0
/
03_getTweets.py
133 lines (111 loc) · 5.04 KB
/
03_getTweets.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# 検索ワードを指定して100件のTweetデータをTwitter REST APIsから取得する
def getTweetData(search_word, param_next = None):
global twitter
url = 'https://api.twitter.com/1.1/tweets/search/fullarchive/label' #エンドポイントを変更。label部分を自身のものに変える
params = {'query': search_word,
'maxResults':'500', #Premium本番環境の場合は500まで、Sandboxでは100。
'fromDate':'201811301500', #指定例:YYYYMMDDHHMM
'toDate':'201911301500' #指定例:YYYYMMDDHHMM
}
params['next'] = param_next
# print(params)
# # max_idの指定があれば設定する# if max_id != -1:
# params['max_id'] = max_id
# # since_idの指定があれば設定する
# if since_id != -1:
# params['since_id'] = since_id
req = twitter.get(url, params = params) # Tweetデータの取得
# 取得したデータの分解
if req.status_code == 200: # 成功した場合
response= json.loads(req.text)
# print(response)
#### 以下の4行を修正
if 'next' in response:
metadata = response['next'] #'next'パラメータ
else:
metadata = 'finish'
#####
statuses = response['results'] #各ツイートデータ
# print(statuses)
limit = req.headers['x-rate-limit-remaining'] if 'x-rate-limit-remaining' in req.headers else 0
reset = req.headers['x-rate-limit-reset'] if 'x-rate-limit-reset' in req.headers else 0
return {"result":True, "metadata":metadata, "statuses":statuses, "limit":limit, "reset_time":datetime.datetime.fromtimestamp(float(reset)), "reset_time_unix":reset}
else: # 失敗した場合
print ("Error: %d" % req.status_code)
print(req.text)
return{"result":False, "status_code":req.status_code}
def obj_nullcheck(string): # Y if X else Z
return False if string is None else True
def is_exist_id(id_str):
return tweetdata.find({'id':long(id_str)},{'id':1}).count() > 0
#-------------繰り返しTweetデータを取得する-------------#
sid=-1
mid = -1
count = 0
param_next = None
res = None
while(True):
try:
n_doc = tweetdata.find({}).count()
print('現在のDB内のツイートレコード数:' + str(n_doc))
time.sleep(2) #Rate Limitを避けるため。SandBoxでは30回/1分。商用では60回/1分。
count = count + 1
print("リクエスト回数:", end="")
sys.stdout.write("%d, "% count)
res = getTweetData('*******', param_next) #検索ワードを指定・変更
if res['result']==False:
# 失敗したら終了する
print("status_code", res['status_code'])
# print(res['result'])
break
if int(res['limit']) == 0: # 回数制限に達したので休憩
# 日付型の列'created_datetime'を付加する
print("Adding created_at field.")
for d in tweetdata.find({'created_datetime':{ "$exists": False }},{'_id':1, 'created_at':1}):
#print str_to_date_jp(d['created_at'])
tweetdata.update({'_id' : d['_id']},
{'$set' : {'created_datetime' : str_to_date_jp(d['created_at'])}})
#remove_duplicates()
# 待ち時間の計算. リミット+5秒後に再開する
diff_sec = int(res['reset_time_unix']) - now_unix_time()
print("sleep %d sec." % (diff_sec+5))
if diff_sec > 0:
time.sleep(diff_sec + 5)
else:
if len(res['statuses'])==0:
sys.stdout.write("statuses is none. ")
elif res['metadata']:
# 結果をmongoDBに格納する
meta.insert({"metadata":res['metadata'], "insert_date": now_unix_time()})
for s in res['statuses']:
tweetdata.insert(s)
param_next = res['metadata'] #'next'
#####以下3行を追加
if param_next == 'finish':
sys.stdout.write("next is none. finished.")
break
######
else:
sys.stdout.write("next is none. finished.")
break
except SSLError as xxx_todo_changeme:
errno = xxx_todo_changeme.args
print("SSLError({0})".format(errno))
print("waiting 5mins")
time.sleep(5*60)
except ConnectionError as xxx_todo_changeme1:
errno = xxx_todo_changeme1.args
print("ConnectionError({0})".format(errno))
print("waiting 5mins")
time.sleep(5*60)
except ReadTimeout as xxx_todo_changeme2:
errno = xxx_todo_changeme2.args
print("ReadTimeout({0})".format(errno))
print("waiting 5mins")
time.sleep(5*60)
except:
print("Unexpected error:", sys.exc_info()[0])
traceback.format_exc(sys.exc_info()[2])
raise
finally:
info = sys.exc_info()