前提・実現したいこと
国会会議録検索システムの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"です。
他にも必要な情報があれば教えてください。
回答1件
あなたの回答
tips
プレビュー