forhobbyinformation12
@forhobbyinformation12

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

楽天apiを使用してRで商品データを取得したい

楽天商品検索apiを使ってキーワードから商品データを取得したい

自分のコードでは155件のデータを取得して終わってしまいます。
楽天市場のサイトでキーワードに「pc monitor」と打つと98,496件と
表示されるので、本来データはもっとあるはず、、
なぜ自分のコードでは155件しか取得できないのでしょうか?
また、どうすればさらに多くのデータを取得できるのでしょうか?
どなたか教えていただけると幸いです。

コードでfor文を6回までにしているのは、一回の読み込みで30件データを
取得しているので、このコードで30×6=180件取得できるかどうかを
確かめたかったためです。

url = "https://app.rakuten.co.jp/services/api/IchibaItem/Search/20220601"
id = "アプリID"
keyword1 = "pc"
keyword2 = "monitor"

Data = list()
page = 1

for (page in 1:6) {
  params = list(
    format = "json",
    keyword = keyword1,
    keyword = keyword2,
    applicationId = id,
    formatVersion = 2,
    page = page)
  
  response = GET(url, query = params)
  data = fromJSON(content(response, "text", encoding = "UTF-8"))
  items = data$Items
  
  Data = rbind(Data, items)
  
  page = page + 1
}

解決後追記

原因はkeywordを複数設定したい場合、上記コードのようにkeyword = として複数回記述するのではなく、「キーワード1 キーワード2」のように半角スペースで記述したものをkeyword = "キーワード1 キーワード2"とすればよい、という話だった。

ただ、それの指し示すところは

keyword = "キーワード1",
keyword = "キーワード2"
と記述した場合は155件、

keyword = "キーワード1 キーワード2"
と記述した場合は76,358件

と、検索の仕方が大きく異なるということ。

いずれにせよ、知恵を貸してくださった@nak435さん、@Verclene さん、@uasiさんには感謝しかありません。迅速なご対応、ありがとうございました。

解決後コード

keyword = "pc monitor"

Data = list()
page = 1

for (page in 1:6) {
  params = list(
    format = "json",
    keyword = keyword,
    applicationId = id,
    formatVersion = 2,
    page = page)
  
  response = GET(url, query = params)
  data = fromJSON(content(response, "text", encoding = "UTF-8"))
  items = data$Items
  
  Data = rbind(Data, items)
}
0

2Answer

↓ keywordの指定に問題があるようです。

-   keyword = keyword1,
-   keyword = keyword2,

+   keyword = keyword1 + "%20" + keyword2

こうすることで、76358件ヒットすると思います。

1Like

Comments

  1. GET 関数が httr パッケージのものだとしてですが) query 引数に与えたリストはエスケープされるので "%20" ではなく " " で連結するべきだと思います。

  2. Data = list()
    page = 1

    for (page in 1:6) {
    params = list(
    format = "json",
    keyword = keyword1 + "%20" + keyword2,
    applicationId = id,
    formatVersion = 2,
    page = page)

    response = GET(url, query = params)
    data = fromJSON(content(response, "text", encoding = "UTF-8"))
    items = data$Items

    Data = rbind(Data, items)
    }

    keyword1 + "%20" でエラー: 二項演算子の引数が数値ではありません

    と表示されてしまいました。もしよければコードを見せていただくことは可能ですか?

  3. @uasi

    Data = list()
    page = 1

    for (page in 1:6) {
    params = list(
    format = "json",
    keyword = keyword1 + "" + keyword2,
    applicationId = id,
    formatVersion = 2,
    page = page)

    response = GET(url, query = params)
    data = fromJSON(content(response, "text", encoding = "UTF-8"))
    items = data$Items

    Data = rbind(Data, items)
    }

    keyword1 + "" でエラー: 二項演算子の引数が数値ではありません

    同様の結果でした。ご指摘の通りhttrパッケージを使用しています。

  4. Rの文字連結はちょっと面倒でstringrが必要です.

  5. @uasi さん、@Verclene さんのご指摘から、以下の書き方でしょうか。

    -   keyword = keyword1 + "%20" + keyword2
    
    +   keyword = paste(keyword1, keyword2, sep = " ")
    

    str_c pasteに変更しました。

  6. @nak435さん、@Verclene さん、@uasiさん、おっしゃっていただいた通り実行した結果、無事180データの取得に成功しました。ご尽力いただきありがとうございます。

    Data = list()
    page = 1

    for (page in 1:6) {
    params = list(
    format = "json",
    keyword = str_c(keyword1, keyword2, sep = " "),
    applicationId = id,
    formatVersion = 2,
    page = page)

    response = GET(url, query = params)
    data = fromJSON(content(response, "text", encoding = "UTF-8"))
    items = data$Items

    Data = rbind(Data, items)
    }

動かした訳じゃないので申し訳ありませんが,

for (page in 1:6) {

この文が何を意味しているのかは把握されていますか?

その前にヒット件数の整合性を取りたいなら別のAPIがあるかもしれませんので,そちらを探してみてはいかがでしょう.

0Like

Comments

  1. page が1~6の間同様の操作を繰り返す、という風に理解しています。
    ヒット件数が正確かを確認したい!というよりは、155件なんて少なすぎる!絶対もっとあるだろ!もっとデータをとれる方法を知りたい!という感じで質問を投稿した次第です。

    for文に関して私の認識はあっていますでしょうか?

  2. 質問文の方を見落としていました.失礼しました.

  3. とんでもないです。コメントありがとうございます。

Your answer might help someone💌