teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

追記

2018/03/23 06:21

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -22,7 +22,6 @@
22
22
 
23
23
  ---
24
24
  質問文のコードに合わせる形で修正
25
- APIのドキュメントによると更新間隔が1m=60秒なので、5秒間隔でアクセスしなくても良いと思います。
26
25
 
27
26
  ```Python
28
27
  import time

5

追記

2018/03/23 06:21

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -1,46 +1,9 @@
1
+ **<< 回答が長くなったので、最新のソースコード以外は削除しました。 >>**
2
+
1
3
  [Can I set max_retries for requests.request?
2
4
  ](https://stackoverflow.com/questions/15431044/can-i-set-max-retries-for-requests-request)
3
5
  上記サイトを参考にRetry処理を実装してみてはー。
4
- 以下はサンプルソースコードです。
5
6
 
6
- ```Python
7
- import json
8
- from datetime import datetime
9
- import requests
10
- from urllib3.util.retry import Retry
11
- from requests.adapters import HTTPAdapter
12
-
13
-
14
- def get_content(url: str='https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc'):
15
- s = requests.Session()
16
- retries = Retry(total=5,
17
- backoff_factor=0.1,
18
- status_forcelist=[500, 502, 503, 504])
19
- s.mount('https://', HTTPAdapter(max_retries=retries))
20
- payload = {'periods': '60'}
21
- r = s.get(url, params=payload)
22
- return r.json()['result']['60']
23
-
24
-
25
- def data_write(obj):
26
- file_name = f'{datetime.now().strftime("%Y%m%d_%H%M%S_%f")}.json'
27
- print(f'file write:{file_name}')
28
- with open(file_name, 'w', encoding='utf-8-sig') as f:
29
- json.dump(obj, f)
30
-
31
-
32
- def main() -> None:
33
- content = get_content()
34
- print(content)
35
- # file作成
36
- data_write(content)
37
-
38
-
39
- if __name__ == '__main__':
40
- main()
41
-
42
- ```
43
-
44
7
  公開APIには負荷を掛けないように一度取得したものは、2度取得しないような形にしてくださいな。
45
8
  例えばファイルに書き出して、読み込む形にするなどの対応をしてくださいな。
46
9
  そうしないとAPIに負荷がかかりすぎて、APIからのアクセス拒否が行われたりやAPIが閉鎖され2度と使えなくなる事もあります。
@@ -58,11 +21,13 @@
58
21
  [cryptowat APIの使い方(備忘録)](https://qiita.com/KyoHeyyy/items/73e3201aa091a04ff248)
59
22
 
60
23
  ---
24
+ 質問文のコードに合わせる形で修正
61
- 2018/03/23追記 ステータスコーを見るサプルコード
25
+ APIのキュメトによると更新間隔が1m=60秒なので、5秒間隔でアクセスしなくても良いと思います
62
26
 
63
27
  ```Python
28
+ import time
29
+ from datetime import datetime
64
30
  import json
65
- from datetime import datetime
66
31
  import requests
67
32
  from urllib3.util.retry import Retry
68
33
  from requests.adapters import HTTPAdapter
@@ -79,7 +44,7 @@
79
44
  # ↓テスト用コード
80
45
  # r.status_code = 429
81
46
  if r.status_code == 429:
82
- # APIのドキュメントにはレートリミット時にr.json()できるかどうかの保証の記述はなかったので注意です。
47
+ # APIのドキュメントにはr.json()できるかどうかの保証の記述はなかったので注意です。
83
48
  # r.json()出来ない場合は値:Noneを返してくださいな。
84
49
  return r.json(), r.status_code
85
50
  return r.json(), r.status_code
@@ -87,23 +52,30 @@
87
52
 
88
53
  def data_write(obj):
89
54
  file_name = f'{datetime.now().strftime("%Y%m%d_%H%M%S_%f")}.json'
90
- print(f'file write:{file_name}')
55
+ #print(f'file write:{file_name}')
91
56
  with open(file_name, 'w', encoding='utf-8-sig') as f:
92
57
  json.dump(obj, f)
93
58
 
94
59
 
95
60
  def main() -> None:
61
+ CLOSE = 4
62
+ while True:
96
- content, status_code = get_content()
63
+ content, status_code = get_content()
97
- # rate_limitなら
64
+ # rate_limitなら
98
- if status_code == 429:
65
+ if status_code == 429:
99
- print('rate_limitです。')
66
+ # sleepタイムを55秒に
100
- return
101
- OHLC_60 = content['result']['60']
102
- print(OHLC_60)
67
+ time.sleep(55)
103
- # file作成
68
+ continue
104
- data_write(OHLC_60)
105
69
 
70
+ json = content['result']['60']
71
+ close = json[-1][CLOSE]
72
+ print(str(datetime.fromtimestamp(round(time.time()) + 60 * 60 * 9)) + ' CLOSE: ' + str(close)) # 直近の終値の表示
73
+ # ファイルに保存したい時。
74
+ #data_write(json)
106
75
 
76
+ time.sleep(5)
77
+
78
+
107
79
  if __name__ == '__main__':
108
80
  main()
109
81
 

4

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

2018/03/23 06:20

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -52,7 +52,59 @@
52
52
  2018/03/23追記
53
53
 
54
54
  [cryptowatch.jp API](https://cryptowatch.jp/docs/api)のドキュメントを見ると、レートリミットになるとステータスコード:429を返すみたいですね。
55
- ステータスコード判定してませんようね・・多分。。
55
+ APIから帰ってくるステータスコード判定してませんようね・・多分。。
56
56
 
57
57
  ■参考情報
58
- [cryptowat APIの使い方(備忘録)](https://qiita.com/KyoHeyyy/items/73e3201aa091a04ff248)
58
+ [cryptowat APIの使い方(備忘録)](https://qiita.com/KyoHeyyy/items/73e3201aa091a04ff248)
59
+
60
+ ---
61
+ 2018/03/23追記 ステータスコードを見るサンプルコード。
62
+
63
+ ```Python
64
+ import json
65
+ from datetime import datetime
66
+ import requests
67
+ from urllib3.util.retry import Retry
68
+ from requests.adapters import HTTPAdapter
69
+
70
+
71
+ def get_content(url: str='https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc'):
72
+ s = requests.Session()
73
+ retries = Retry(total=5,
74
+ backoff_factor=0.1,
75
+ status_forcelist=[500, 502, 503, 504])
76
+ s.mount('https://', HTTPAdapter(max_retries=retries))
77
+ payload = {'periods': '60'}
78
+ r = s.get(url, params=payload)
79
+ # ↓テスト用コード
80
+ # r.status_code = 429
81
+ if r.status_code == 429:
82
+ # APIのドキュメントにはレートリミット時にr.json()できるかどうかの保証の記述はなかったので注意です。
83
+ # r.json()出来ない場合は値:Noneを返してくださいな。
84
+ return r.json(), r.status_code
85
+ return r.json(), r.status_code
86
+
87
+
88
+ def data_write(obj):
89
+ file_name = f'{datetime.now().strftime("%Y%m%d_%H%M%S_%f")}.json'
90
+ print(f'file write:{file_name}')
91
+ with open(file_name, 'w', encoding='utf-8-sig') as f:
92
+ json.dump(obj, f)
93
+
94
+
95
+ def main() -> None:
96
+ content, status_code = get_content()
97
+ # rate_limitなら
98
+ if status_code == 429:
99
+ print('rate_limitです。')
100
+ return
101
+ OHLC_60 = content['result']['60']
102
+ print(OHLC_60)
103
+ # file作成
104
+ data_write(OHLC_60)
105
+
106
+
107
+ if __name__ == '__main__':
108
+ main()
109
+
110
+ ```

3

参考情報を追加

2018/03/23 03:35

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -46,4 +46,13 @@
46
46
  そうしないとAPIに負荷がかかりすぎて、APIからのアクセス拒否が行われたりやAPIが閉鎖され2度と使えなくなる事もあります。
47
47
 
48
48
  ■参考情報
49
- [python requestsでリトライ処理をする](https://qiita.com/toshitanian/items/c28a65fe2f32884e067c)
49
+ [python requestsでリトライ処理をする](https://qiita.com/toshitanian/items/c28a65fe2f32884e067c)
50
+
51
+ ---
52
+ 2018/03/23追記
53
+
54
+ [cryptowatch.jp API](https://cryptowatch.jp/docs/api)のドキュメントを見ると、レートリミットになるとステータスコード:429を返すみたいですね。
55
+ ステータスコード判定してませんようね・・多分。。
56
+
57
+ ■参考情報
58
+ [cryptowat APIの使い方(備忘録)](https://qiita.com/KyoHeyyy/items/73e3201aa091a04ff248)

2

参考情報を追加

2018/03/23 03:15

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -43,4 +43,7 @@
43
43
 
44
44
  公開APIには負荷を掛けないように一度取得したものは、2度取得しないような形にしてくださいな。
45
45
  例えばファイルに書き出して、読み込む形にするなどの対応をしてくださいな。
46
- そうしないとAPIに負荷がかかりすぎて、APIからのアクセス拒否が行われたりやAPIが閉鎖され2度と使えなくなる事もあります。
46
+ そうしないとAPIに負荷がかかりすぎて、APIからのアクセス拒否が行われたりやAPIが閉鎖され2度と使えなくなる事もあります。
47
+
48
+ ■参考情報
49
+ [python requestsでリトライ処理をする](https://qiita.com/toshitanian/items/c28a65fe2f32884e067c)

1

追記

2018/03/22 14:29

投稿

umyu
umyu

スコア5846

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