回答編集履歴

6

追記

2018/03/23 06:21

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -45,8 +45,6 @@
45
45
  ---
46
46
 
47
47
  質問文のコードに合わせる形で修正
48
-
49
- APIのドキュメントによると更新間隔が1m=60秒なので、5秒間隔でアクセスしなくても良いと思います。
50
48
 
51
49
 
52
50
 

5

追記

2018/03/23 06:21

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -1,86 +1,12 @@
1
+ **<< 回答が長くなったので、最新のソースコード以外は削除しました。 >>**
2
+
3
+
4
+
1
5
  [Can I set max_retries for requests.request?
2
6
 
3
7
  ](https://stackoverflow.com/questions/15431044/can-i-set-max-retries-for-requests-request)
4
8
 
5
9
  上記サイトを参考にRetry処理を実装してみてはー。
6
-
7
- 以下はサンプルソースコードです。
8
-
9
-
10
-
11
- ```Python
12
-
13
- import json
14
-
15
- from datetime import datetime
16
-
17
- import requests
18
-
19
- from urllib3.util.retry import Retry
20
-
21
- from requests.adapters import HTTPAdapter
22
-
23
-
24
-
25
-
26
-
27
- def get_content(url: str='https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc'):
28
-
29
- s = requests.Session()
30
-
31
- retries = Retry(total=5,
32
-
33
- backoff_factor=0.1,
34
-
35
- status_forcelist=[500, 502, 503, 504])
36
-
37
- s.mount('https://', HTTPAdapter(max_retries=retries))
38
-
39
- payload = {'periods': '60'}
40
-
41
- r = s.get(url, params=payload)
42
-
43
- return r.json()['result']['60']
44
-
45
-
46
-
47
-
48
-
49
- def data_write(obj):
50
-
51
- file_name = f'{datetime.now().strftime("%Y%m%d_%H%M%S_%f")}.json'
52
-
53
- print(f'file write:{file_name}')
54
-
55
- with open(file_name, 'w', encoding='utf-8-sig') as f:
56
-
57
- json.dump(obj, f)
58
-
59
-
60
-
61
-
62
-
63
- def main() -> None:
64
-
65
- content = get_content()
66
-
67
- print(content)
68
-
69
- # file作成
70
-
71
- data_write(content)
72
-
73
-
74
-
75
-
76
-
77
- if __name__ == '__main__':
78
-
79
- main()
80
-
81
-
82
-
83
- ```
84
10
 
85
11
 
86
12
 
@@ -118,15 +44,19 @@
118
44
 
119
45
  ---
120
46
 
47
+ 質問文のコードに合わせる形で修正
48
+
121
- 2018/03/23追記 テータスコードを見るサンプルコード
49
+ APIのドキュメントによると更新間隔が1m=60秒なので、5秒間隔でアクセしなくても良いと思います
122
50
 
123
51
 
124
52
 
125
53
  ```Python
126
54
 
127
- import json
55
+ import time
128
56
 
129
57
  from datetime import datetime
58
+
59
+ import json
130
60
 
131
61
  import requests
132
62
 
@@ -160,7 +90,7 @@
160
90
 
161
91
  if r.status_code == 429:
162
92
 
163
- # APIのドキュメントにはレートリミット時にr.json()できるかどうかの保証の記述はなかったので注意です。
93
+ # APIのドキュメントにはr.json()できるかどうかの保証の記述はなかったので注意です。
164
94
 
165
95
  # r.json()出来ない場合は値:Noneを返してくださいな。
166
96
 
@@ -176,7 +106,7 @@
176
106
 
177
107
  file_name = f'{datetime.now().strftime("%Y%m%d_%H%M%S_%f")}.json'
178
108
 
179
- print(f'file write:{file_name}')
109
+ #print(f'file write:{file_name}')
180
110
 
181
111
  with open(file_name, 'w', encoding='utf-8-sig') as f:
182
112
 
@@ -188,23 +118,37 @@
188
118
 
189
119
  def main() -> None:
190
120
 
191
- content, status_code = get_content()
121
+ CLOSE = 4
192
122
 
193
- # rate_limitなら
123
+ while True:
194
124
 
195
- if status_code == 429:
125
+ content, status_code = get_content()
196
126
 
197
- print('rate_limitです。')
127
+ # rate_limitなら
198
128
 
199
- return
129
+ if status_code == 429:
200
130
 
201
- OHLC_60 = content['result']['60']
131
+ # sleepタイムを55秒に
202
132
 
203
- print(OHLC_60)
133
+ time.sleep(55)
204
134
 
205
- # file作成
135
+ continue
206
136
 
137
+
138
+
139
+ json = content['result']['60']
140
+
141
+ close = json[-1][CLOSE]
142
+
143
+ print(str(datetime.fromtimestamp(round(time.time()) + 60 * 60 * 9)) + ' CLOSE: ' + str(close)) # 直近の終値の表示
144
+
145
+ # ファイルに保存したい時。
146
+
207
- data_write(OHLC_60)
147
+ #data_write(json)
148
+
149
+
150
+
151
+ time.sleep(5)
208
152
 
209
153
 
210
154
 

4

ステータスコードチェックを追加

2018/03/23 06:20

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -106,10 +106,114 @@
106
106
 
107
107
  [cryptowatch.jp API](https://cryptowatch.jp/docs/api)のドキュメントを見ると、レートリミットになるとステータスコード:429を返すみたいですね。
108
108
 
109
- ステータスコード判定してませんようね・・多分。。
109
+ APIから帰ってくるステータスコード判定してませんようね・・多分。。
110
110
 
111
111
 
112
112
 
113
113
  ■参考情報
114
114
 
115
115
  [cryptowat APIの使い方(備忘録)](https://qiita.com/KyoHeyyy/items/73e3201aa091a04ff248)
116
+
117
+
118
+
119
+ ---
120
+
121
+ 2018/03/23追記 ステータスコードを見るサンプルコード。
122
+
123
+
124
+
125
+ ```Python
126
+
127
+ import json
128
+
129
+ from datetime import datetime
130
+
131
+ import requests
132
+
133
+ from urllib3.util.retry import Retry
134
+
135
+ from requests.adapters import HTTPAdapter
136
+
137
+
138
+
139
+
140
+
141
+ def get_content(url: str='https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc'):
142
+
143
+ s = requests.Session()
144
+
145
+ retries = Retry(total=5,
146
+
147
+ backoff_factor=0.1,
148
+
149
+ status_forcelist=[500, 502, 503, 504])
150
+
151
+ s.mount('https://', HTTPAdapter(max_retries=retries))
152
+
153
+ payload = {'periods': '60'}
154
+
155
+ r = s.get(url, params=payload)
156
+
157
+ # ↓テスト用コード
158
+
159
+ # r.status_code = 429
160
+
161
+ if r.status_code == 429:
162
+
163
+ # APIのドキュメントにはレートリミット時にr.json()できるかどうかの保証の記述はなかったので注意です。
164
+
165
+ # r.json()出来ない場合は値:Noneを返してくださいな。
166
+
167
+ return r.json(), r.status_code
168
+
169
+ return r.json(), r.status_code
170
+
171
+
172
+
173
+
174
+
175
+ def data_write(obj):
176
+
177
+ file_name = f'{datetime.now().strftime("%Y%m%d_%H%M%S_%f")}.json'
178
+
179
+ print(f'file write:{file_name}')
180
+
181
+ with open(file_name, 'w', encoding='utf-8-sig') as f:
182
+
183
+ json.dump(obj, f)
184
+
185
+
186
+
187
+
188
+
189
+ def main() -> None:
190
+
191
+ content, status_code = get_content()
192
+
193
+ # rate_limitなら
194
+
195
+ if status_code == 429:
196
+
197
+ print('rate_limitです。')
198
+
199
+ return
200
+
201
+ OHLC_60 = content['result']['60']
202
+
203
+ print(OHLC_60)
204
+
205
+ # file作成
206
+
207
+ data_write(OHLC_60)
208
+
209
+
210
+
211
+
212
+
213
+ if __name__ == '__main__':
214
+
215
+ main()
216
+
217
+
218
+
219
+ ```

3

参考情報を追加

2018/03/23 03:35

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -95,3 +95,21 @@
95
95
  ■参考情報
96
96
 
97
97
  [python requestsでリトライ処理をする](https://qiita.com/toshitanian/items/c28a65fe2f32884e067c)
98
+
99
+
100
+
101
+ ---
102
+
103
+ 2018/03/23追記
104
+
105
+
106
+
107
+ [cryptowatch.jp API](https://cryptowatch.jp/docs/api)のドキュメントを見ると、レートリミットになるとステータスコード:429を返すみたいですね。
108
+
109
+ ステータスコード判定してませんようね・・多分。。
110
+
111
+
112
+
113
+ ■参考情報
114
+
115
+ [cryptowat APIの使い方(備忘録)](https://qiita.com/KyoHeyyy/items/73e3201aa091a04ff248)

2

参考情報を追加

2018/03/23 03:15

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -89,3 +89,9 @@
89
89
  例えばファイルに書き出して、読み込む形にするなどの対応をしてくださいな。
90
90
 
91
91
  そうしないとAPIに負荷がかかりすぎて、APIからのアクセス拒否が行われたりやAPIが閉鎖され2度と使えなくなる事もあります。
92
+
93
+
94
+
95
+ ■参考情報
96
+
97
+ [python requestsでリトライ処理をする](https://qiita.com/toshitanian/items/c28a65fe2f32884e067c)

1

追記

2018/03/22 14:29

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -1,3 +1,91 @@
1
1
  [Can I set max_retries for requests.request?
2
2
 
3
3
  ](https://stackoverflow.com/questions/15431044/can-i-set-max-retries-for-requests-request)
4
+
5
+ 上記サイトを参考にRetry処理を実装してみてはー。
6
+
7
+ 以下はサンプルソースコードです。
8
+
9
+
10
+
11
+ ```Python
12
+
13
+ import json
14
+
15
+ from datetime import datetime
16
+
17
+ import requests
18
+
19
+ from urllib3.util.retry import Retry
20
+
21
+ from requests.adapters import HTTPAdapter
22
+
23
+
24
+
25
+
26
+
27
+ def get_content(url: str='https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc'):
28
+
29
+ s = requests.Session()
30
+
31
+ retries = Retry(total=5,
32
+
33
+ backoff_factor=0.1,
34
+
35
+ status_forcelist=[500, 502, 503, 504])
36
+
37
+ s.mount('https://', HTTPAdapter(max_retries=retries))
38
+
39
+ payload = {'periods': '60'}
40
+
41
+ r = s.get(url, params=payload)
42
+
43
+ return r.json()['result']['60']
44
+
45
+
46
+
47
+
48
+
49
+ def data_write(obj):
50
+
51
+ file_name = f'{datetime.now().strftime("%Y%m%d_%H%M%S_%f")}.json'
52
+
53
+ print(f'file write:{file_name}')
54
+
55
+ with open(file_name, 'w', encoding='utf-8-sig') as f:
56
+
57
+ json.dump(obj, f)
58
+
59
+
60
+
61
+
62
+
63
+ def main() -> None:
64
+
65
+ content = get_content()
66
+
67
+ print(content)
68
+
69
+ # file作成
70
+
71
+ data_write(content)
72
+
73
+
74
+
75
+
76
+
77
+ if __name__ == '__main__':
78
+
79
+ main()
80
+
81
+
82
+
83
+ ```
84
+
85
+
86
+
87
+ 公開APIには負荷を掛けないように一度取得したものは、2度取得しないような形にしてくださいな。
88
+
89
+ 例えばファイルに書き出して、読み込む形にするなどの対応をしてくださいな。
90
+
91
+ そうしないとAPIに負荷がかかりすぎて、APIからのアクセス拒否が行われたりやAPIが閉鎖され2度と使えなくなる事もあります。