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

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

新規登録して質問してみよう
ただいま回答率
85.35%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

API

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

Q&A

解決済

1回答

1307閲覧

RでAPIのリクエストをループさせたい

akutoukuroneko

総合スコア5

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

API

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

0グッド

0クリップ

投稿2021/09/14 01:17

編集2021/09/14 09:16

前提・実現したいこと

国会会議録検索システムのAPIを使ってテキストマイニングをしたいと考えています。
集めたいデータは以下の通りです。
・発言に「世間」が含まれる
・2010年4月1日から2020年3月31日までのもの
そしてRを使ってAPIからXML形式で返戻されたテキストデータをcsvファイルに書き込んでいます。

発生している問題

上記実現したいことを、下記該当のソースコードに書かれているところまではできました。
しかし、(ご存じかもしれませんが)国会会議録検索システムのAPIは1リクエストは最大でも100件までしかできません。
今回下記で試した時点で返戻されたのは30件でした。
そこで、上記で集めたいデータを集めるまで(すなわち2020年3月31日から返戻されているので2010年4月1日まで)ループしてリクエストをしたいです。

追記
いただいたご指摘から、流れを追ってみて、改めてわからないところを記載します。
・参考にしたコードで、そもそもなぜクエリパラメータを設定しているのか、またなぜ月ごとに収集しているのか分かりません。なので私のコードではfrom,until,q_maximumRecordsをすべて指定してみたのですがエラーが出てしまいます。
・PythonのET.fromstringはRでは何に該当するのでしょうか。
・「どういうループを回せば」いいのかわかりません。目的が達成できればどういうループでもかまいません。

該当のソースコード

R

1library(httr) 2library(XML) 3library(rlist) 4library(stringr) 5library(dplyr) 6library(readxl) 7 8#これをループさせて2010/04/01から2020/03/31まで出したいというイメージです。 9#kokkai <- GET("https://kokkai.ndl.go.jp/api/speech?any=%E4%B8%96%E9%96%93&from=2010-04-01&until=2020-03-31") 10#kokkaitxt <- content(kokkai, "text", encoding = "UTF-8") 11#write.csv(kokkaitxt, "kokkaitxt.csv", quote=FALSE, row.names=FALSE, fileEncoding = "utf8") 12 13q_from <- 2010/04/01 14q_until <- 2020/03/31 15q_maximumRecords <- 100 16 17base_url <- "https://kokkai.ndl.go.jp/api/speech?any=世間&" 18 19# 一回当たりの抽出件数が最大100件のため、全体のレコード数から必要なループ回数を決定 20payload <- "from=" + q_from + "&until=" + q_until + "&maximumRecords=" + str(q_maximumRecords) + "&startRecord=1" #ここからエラーが出ます 21payload_encoded <- URLencode(payload) 22r <- GET(base_url + payload_encoded) 23 24#ここが調べてみてもRで該当するところがわからない 25root = ET.fromstring(r.text) 26loop_num = int(root[0].text) // q_maximumRecords + 1 27 28# ループを回し、APIでデータ収集 29i = 0 30while i < loop_num: 31 q_startRecord = 1 + i * q_maximumRecords 32payload <- "from=" + q_from + "&until=" + q_until + "&maximumRecords=" + str(q_maximumRecords) + "&startRecord=" + str(q_startRecord) 33payload_encoded <- URLencode(payload) 34r = GET(base_url + payload_encoded) 35 36#ここは何なのでしょう 37with open('./dat/' + str(year) + '_' + str(month) + '_' + str(i) + '.xml', mode='w') as f: 38 f.write(r.text) 39 40i += 1 41 42#ここからはPythonのdefに対応するのだと思いますが、???てなってます 43if __name__ == "__main__": 44 base_url = "https://kokkai.ndl.go.jp/api/speech?" 45 46main()

###参考にしたコード

import requests import urllib.parse import xml.etree.ElementTree as ET import datetime def main(): # 1月、2月、3月、…と月毎に収集 for month in range(1, 13): # クエリパラメータの設定 q_maximumRecords = 100 q_from = str(datetime.date(year, month, 1)) if month != 12: q_until = str(datetime.date(year, month+1, 1) - datetime.timedelta(days=1)) else: q_until = str(datetime.date(year+1, 1, 1) - datetime.timedelta(days=1)) # 一回当たりの抽出件数が最大100件のため、全体のレコード数から必要なループ回数を決定 payload = 'from=' + q_from + '&until=' + q_until + '&maximumRecords=' + str(q_maximumRecords) + '&startRecord=1' payload_encoded = urllib.parse.quote(payload) r = requests.get(base_url + payload_encoded) root = ET.fromstring(r.text) loop_num = int(root[0].text) // q_maximumRecords + 1 # ループを回し、APIでデータ収集 i = 0 while i < loop_num: q_startRecord = 1 + i * q_maximumRecords payload = 'from=' + q_from + '&until=' + q_until + '&maximumRecords=' + str(q_maximumRecords) + '&startRecord=' + str(q_startRecord) payload_encoded = urllib.parse.quote(payload) r = requests.get(base_url + payload_encoded) with open('./dat/' + str(year) + '_' + str(month) + '_' + str(i) + '.xml', mode='w') as f: f.write(r.text) i += 1 if __name__ == "__main__": base_url = 'http://kokkai.ndl.go.jp/api/1.0/speech?' year = 2018 main()

(引用:@kenta1984, 2019, 「国会会議録検索システム検索用APIを使って国会での発言を分析してみた」https://qiita.com/kenta1984/items/1acfddb3d920a11e6c8b)

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

・実行したOS Windows10
・使用したRのversion Rx64 4.1.0
・使用したIDE Rstudio 1.4

追記
・versionをRx64 4.1.1に変更しました。
・URLの指定は上記にもあるように"https://kokkai.ndl.go.jp/api/speech?any=%E4%B8%96%E9%96%93&from=2010-04-01&until=2020-03-31"です。

他にも必要な情報があれば教えてください。

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

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

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

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

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

KojiDoi

2021/09/14 04:36

pythonを知らなくても、中でどういうループを回そうとしていて、その中でどんなAPIを使おうとしていて、どのようなURLを指定しようとしているか、流れを追うぐらいのことはできるんじゃないですか?
akutoukuroneko

2021/09/14 09:17

ご指摘ありがとうございました。追記しましたのでお手数ですが、よろしくお願いします。
guest

回答1

0

ベストアンサー

こういう場合、参考サイトの意図を過度に気にし過ぎるのも良くありません。

なぜ月ごとに収集しているのか分かりません。

確かに不思議ではあります。データの月毎の推移をみたいなどの意図があったのかもしれませんが、詳しく説明されていないので、結局よく分からないですね。しかし、わかってみたところで恐らくあまりメリットはない気がします。

それより、核心と思われるのは以下の箇所です。

payload = 'from=' + q_from + '&until=' + q_until + '&maximumRecords=' + str(q_maximumRecords) + '&startRecord=' + str(q_startRecord)

APIの制約で、どうやら該当レコードが100件を超えると一度に取得できないらしいので、ならループを作ってすこしづつ取得を試みようとなっているのは読み取れるでしょうか。
startRecordなるパラメータをうまく使えばどうやらそれができるらしいと当たりを付けることができます。

サンプルコードはpythonの特別なモジュールを使っており、その仕様はよくわからないかもしれません。しかし、なんかオブジェクトを作ってそこからテキストを取り出しているらしいということは見当がつくはずです。ここまで出来たら、PythonのET.fromstringは何だろうなどとそれ以上悩むのは無駄な回り道です。

Rでどうやってデータを取り出すかを考えましょう。前述のstartRecordの件を除けば、どうやらばいいのかはもう分かっているはずですね。

投稿2021/09/15 05:03

KojiDoi

総合スコア13692

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

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

akutoukuroneko

2021/09/16 23:31

ありがとうございました。 おっしゃったようにstartRecordを調べたところ、1→101→201→....とすることによってリクエストをループさせることができることが判明しました。 あとは自分で記述してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問