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

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

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

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

API

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

Q&A

解決済

2回答

280閲覧

国会会議録検索システムのAPIで400リクエストが返ってきます

fujiko20

総合スコア19

Python 3.x

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

API

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

0グッド

1クリップ

投稿2019/04/06 22:03

前提・実現したいこと

プログラミング初心者です。Python3を利用し、国会会議録検索システムのAPIにリクエストをし、検索結果を取得しようとしています。しかし、何度試しても結果が正しく返ってきません。

発生している問題・エラーメッセージ

リクエスト状況は次のとおりです。

<Response [400]>

検索結果は次のとおりです。

<class 'requests.models.Response'> <?xml version="1.0" encoding="utf-8"?> <data> <diagnostics> <diagnostic> <message>(19011)検索条件の入力に誤りがあります。</message> </diagnostic> </diagnostics> </data>

該当のソースコード

Python3

1import requests 2 3ufencode = str('自己責任'.encode('utf-8')) 4url = 'http://kokkai.ndl.go.jp/api/1.0/speech?any=' + ufencode 5req = requests.get(url) 6print(req.text)

試したこと

上にペーストした検索結果で「検索条件の入力に誤りがあります。」と表示されているため、検索条件の指定方法をいくつか試してみました。しかし結果は変わりませんでした。おそらく初歩的な部分でつまずいているのではないかと思います。どこをどう変えれば正しく検索結果を取得できるのでしょうか……? 恐れ入りますが、なにとぞご教示のほど、お願い申し上げます。

補足情報(FW/ツールのバージョンなど)

国会会議録検索システムのAPIは次のような仕様となっています。
http://kokkai.ndl.go.jp/api.html

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

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

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

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

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

guest

回答2

0

ベストアンサー

こういう場合は、「print(req.url)」を使ってURLを確認してみましょう。

また、requests.get メソッドは自動的にURLエンコードしてくれるので、パラメータ文字列のURLエンコードは不要です。

python

1import requests 2 3url = 'http://kokkai.ndl.go.jp/api/1.0/speech?any%3D自己責任' 4req = requests.get(url) 5print(req.url) 6print(req.text)

国会会議録検索システムのAPIの仕様として、「=」「&」もURLエンコードが必要みたいです。
この仕様は一般的ではないので、注意してください。
なぜこんなことになっているのか・・・

投稿2019/04/06 23:27

nskydiving

総合スコア6500

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

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

fujiko20

2019/04/06 23:44

nskydivingさま、このたびは丁寧に教えてくださり、本当にありがとうございます! なるほど、国会会議録検索システムのAPIは一般的な仕様とは少し違うのですね。気をつけて使ってみます!
guest

0

encode 方法がちがっているようです。
つぎのようにしたらそれなりのレスポンスが得られました。

d.py

python3

1import urllib.parse 2import requests 3 4query = 'startRecord=1&maximumRecords=1&any=自己責任&speaker=安倍晋三' 5url = 'http://kokkai.ndl.go.jp/api/1.0/speech?' + urllib.parse.quote(query) 6req = requests.get(url) 7print(req.text)

実行例
イメージ説明

上で speaker 条件を入れないと、検索結果が 1000 件をこえるから条件をみなおせとのエラーメッセージが返りました。(400 エラーではなくて)

追記
Web API の仕様としてちょっと変なように思います。
query の形式とか、 max を指定しているんだから、ヒット件数が 1000 超えていたって max 件数だけ返すべkなのではないかとか...
API 仕様のレビューをパブリックに行えばこんな仕様にはならない気がします。

投稿2019/04/07 00:12

編集2019/04/07 00:20
katoy

総合スコア22324

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

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

fujiko20

2019/04/07 02:57

katoyさん、丁寧に教えてくださり、感謝です! コードを拝見し、とても勉強になりました。にしても、やっぱりこのAPIは仕様がおかしいのですね。おっしゃるとおり、max件数が返ってくると、いろいろやりやすくなるのですが……。ともあれ、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問