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

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

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

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

API

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

Q&A

解決済

1回答

1660閲覧

PythonのRequestsを使ったAPIについて

InpactSumo

総合スコア14

Python 3.x

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

API

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

0グッド

0クリップ

投稿2018/03/23 09:20

編集2018/03/25 23:23

環境
os:Windows10
ver:Python3.6.1

APIよりリクエストでデータを取得します。
5秒おきに繰り返して同内容を取得、"id"、"id2"は毎に変わります。
*****.jsonは取得毎に"id"、"id2"に準じて名前は変えてます。

url = "https://***************************"

querystring = {"Id":"","Id2":"","from":,"to":}

headers = {"Accept": "application/json"}response = requests.request("GET", url, headers=headers, params=querystring)

f = open(*****.json, 'w')# 書き込みモードで開く
f.writelines(response.text)# シーケンスが引数。
f.close()

結果、何故か*****.jsonの内容が重複してしまいます。

解決策あればご教示頂けると幸いです。

補足:この後にpandasを使ってjson → csv変換してます。

3/26追記

以下のような取得を繰り返して取得した場合に1111_2222.jsonの内容が3333_4444.jsonの取得内容に反映されてしまいます。

#id1111
url = "https://***************************"

querystring = {"Id":"1111","Id2":"2222","from":,"to":}

headers = {"Accept": "application/json"}response = requests.request("GET", url, headers=headers, params=querystring)

f = open(1111_2222.json, 'w')# 書き込みモードで開く
f.writelines(response.text)# シーケンスが引数。
f.close()

#id3333

url = "https://***************************"

querystring = {"Id":"3333","Id2":"4444","from":,"to":}

headers = {"Accept": "application/json"}response = requests.request("GET", url, headers=headers, params=querystring)

f = open(3333_4444.json, 'w')# 書き込みモードで開く
f.writelines(response.text)# シーケンスが引数。
f.close()

取得された内容が以下のようになってしまいます。
<1111_2222.json>
1111 25253
1111 23555

<3333_4444.json>
1111 25253
1111 23555

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

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

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

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

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

y_waiwai

2018/03/23 10:56

*.jsonの内容が重複とはなにがどう重複するんでしょうか。具体例を上げてくれませんか?
InpactSumo

2018/03/25 23:44

y_waiwai様、修正追記しました。返信が遅くなり失礼しました。
InpactSumo

2018/03/25 23:45

umyu様、追記しました。2の件ご指摘ありがとうございます!以降、活用します。返信が遅くなり失礼しました。
guest

回答1

0

ベストアンサー

◇コードの変更依頼
ファイル名を固定の文字列にするのではなく

Python

1querystring = {"Id":"3333","Id2":"4444","from":**,"to":**} 2f = open(3333_4444.json, 'w')# 書き込みモードで開く

querystringの辞書の値を元にファイル名を作る形にしてくださいな。

Python

1file_name = querystring["Id"] + "_" + querystring["Id2"] + ".json" 2with open(file_name , 'w') as f: 3 f.writelines(response.text)# シーケンスが引数。 4

◇確認するポイント
1,リクエスト先のURLはIDとID2を渡した時に正しく、別の内容を返しているか?
リクエスト先のドキュメントがあれば読んで(重要)、ブラウザやREST APIテストツールで確認してみてくださいな。

2,リクエストヘッダーでAccept:application/jsonを行っていますが、response.json()ではなく、response.textで本当にあってますか?

Python

1headers = {"Accept": "application/json"}

3,レスポンスのステータスコードを確認する。
response.status_code の値が200以外ならなんらかのエラーが発生しています。

4,追記モードとタイムスタンプ付きで書き込んで見る。
上記回答で改善されなければ、途中でレスポンスの内容が変わっていると推測されるので、
本当にそうなのかをタイムスタンプ付きの追記モードで書き込み、ファイルの内容を確認してみてくださいな。

◇以下はサンプルコードです。

Python

1# -*- coding: utf-8 -*- 2from datetime import datetime 3import requests 4 5 6def main() -> None: 7 url = 'https://www.google.co.jp/' 8 querystring = {"Id": "3333", "Id2": "4444", "from": "xxx", "to": "yyy"} 9 headers = {"Accept": "application/json"} 10 response = requests.request("GET", url, headers=headers, params=querystring) 11 file_name = querystring['Id'] + '_' + querystring['Id2'] + '.json' 12 with open(file_name, 'a') as f: # 追記モードで開く 13 f.write('\n' + '#' * 60 + '\n') 14 f.write(str(response.status_code) + '\n') # ステータスコードを書き込み 15 f.write(datetime.now().strftime('%Y%m%d_%H%M%S_%f') + '\n') 16 f.writelines(response.text) # シーケンスが引数。 17 18 19if __name__ == "__main__": 20 main() 21

あとはURLを表に出せるなら、出していただくと他の人の回答が付きやすいかもしれません。

投稿2018/03/26 00:16

編集2018/03/26 00:52
umyu

総合スコア5846

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

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

InpactSumo

2018/03/26 02:39

umyu 様 回答ありがとうございます!Python初心者なので説明下手お許しください。 >◇コードの変更依頼の件ですが、実は固定でパスを記述してます。C:\requests\json\1111_2222.json 以下にパスを足しコードを修正してみました。 file_name = "C:\requests\json\"+'' querystring["Id"] + "_" + querystring["Id2"] + ".json" with open(file_name , 'w') as f: f.writelines(response.text)# シーケンスが引数。 Postmanでテスト済みです。 とあるWEBアプリケーションの情報を取得するAPIで WEBアプリケーションのテスト用に頂いたIDが1セットしか無い状況です。 実際に頂いたIDでログインしWEBアプリケーションに保存された内容がしっかり取得出来ているのは確認済みです。 現在は、テスト段階ですがWEBアプリケーション使用しているユーザーは多数おり、 実際に使用しているユーザーのIDを管理者より頂きAPIで取得してこの題が発覚しました。 >2,リクエストヘッダーについて headers = {"Accept": "application/json"} API開発側からAccept: application/jsonを実装の際にリクエストヘッダに追加するようにと説明されました。 response.textでtestIDでの取得では全く問題なく来ていました。 >3,レスポンスのステータスコードを確認する。 200で問題なしです。 >4,追記モードとタイムスタンプ付きで書き込んで見る。 こちら試してみます!結果は後ほどご連絡します!
InpactSumo

2018/03/26 10:28

umyu 様 どうやらWEBアプリケーション側の問題があるようです。現在問い合わせ中。 今回は確認事項やファイル名などとても勉強になりました! 確認していなければ疑う先が見つからない。大事なことですね!ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問