2017-10-03 26 views
2

REST APIから一部のデータを取得しようとしましたが、文字列に日付パラメータとして正しく渡せません。 sprintfを使って、私は検索用語とウェブサイトを渡すことに成功しましたが、discoverDateで運がない。私も日付のベクトルに基づいて、複数のAPI呼び出しをしたいと思います -日付パラメータをREST API呼び出しに渡す - Rを使用する

https://newsriver.io更新

Function to grab data by one search term and one website 

get_newsriver_content <- function(searcht,website,api_key){ 
url <- sprintf('https://api.newsriver.io/v2/search?query=text%%3A%s%%20OR%%20website.domainName%%3A%s%%20OR%%20language%%3AEN&sortBy=_score&sortOrder=DESC&limit=100',searcht, website) 
news_get<- GET(url, add_headers(Authorization = paste(api_key, sep = ""))) 
news_txt <- content(news_get, as = "text", encoding = "UTF-8") 
news_df <- fromJSON(news_txt) 
news_df$discoverDate <- as.Date(news_df$discoverDate) 
news_df 
} 

質問問題のAPIです。ここで

+1

ここで何が問題なのかよくわかりません。 [クエリービルダー](https://console.newsriver.io/river/0)を見ると、discoverDateではなく、テキスト、タイトル、ウェブサイトの名前と言語で照会することができます(結果のソートのみ可能です)。他に何か提案があれば、 'urltools'パッケージ、特に' param_set'関数を見てみましょう。クエリをよりクリーンな方法で構築することができます: '' url_base% '%param_set( "query"、 "...")%>%param_set( "sortBy"、 "_score")%>%param_set( "sortOrder" "DESC")%>%param_set( "limit"、 "100") ' – quartin

+0

@quartinのアドバイスURLのエンコードを手助けするAPI作成者もいます。私はまもなく答えを投稿します – mannym

+0

@quartin更新 – mannym

答えて

1

は、私はそれが正しく私のクエリは、Aの作成カールコール

  • にに挿入されるようにエンコードする方法を考え出す本当に

    1. 2ステップの問題だった私の問題

      を考え出した方法です関数は、日付のベクトルに基づいてAPI呼び出しを行い、それをデータフレームに追加しました。

    ここで私はそれをしました。

    私の研究方法についてだから、
    library(tidyverse) 
    library(jsonlite) 
    library(urltools) 
    library(httr) 
    
    # Function For Pulling by Date 
    get_newsriver_bydate <- function(query, date_v){ 
    
    #Being Kind to the free API - Shout out to Elia at Newsriver who has been ever patient 
    pb$tick()$print() 
    Sys.sleep(sample(seq(0.5, 2.5, 0.5), 1)) 
    
    #This is where is used the URL encode package as suggested by quartin 
    url_base <- "https://api.newsriver.io/v2/search" 
    create_curl_call <- url_base %>% 
    param_set("query",url_encode(query)) %>% 
    param_set("sortBy", "_score") %>% 
    param_set("sortOrder", "DESC") %>% 
    param_set("limit", "100") 
    
    #I had most of this before however I changed my output to a tibble 
    #more versatile to work with 
    
    get_curl <- GET(create_curl_call, add_headers(Authorization = paste(api_key, sep = ""))) 
    curl_to_json <- content(get_curl, as = "text", encoding = "UTF-8") 
    news_df <- fromJSON(curl_to_json, flatten = TRUE) 
    news_df$discoverDate <- as.Date(news_df$discoverDate) 
    as.tibble(news_df) 
    } 
    
    # Set Configration and Set API key 
    set_config(config(ssl_verifypeer = 0L)) 
    api_key <- "mykey" 
    
    #Set my vector of Dates 
    dates1 <- seq(as.Date("2017-09-01"), as.Date("2017-10-01"), by = "days") 
    
    #Set up my progress bar 
    pb <- progress_estimated(length(dates1)) 
    
    #Sprintf my query into a vector of queries based on date 
    query <- sprintf('text:"Canada" AND text:"Rocks" AND language:EN AND discoverDate:[%s TO %s]',dates1, dates1) 
    
    #Run the query and be patient 
    news_df <- map_df(query, get_newsriver_bydate, .id = "query") 
    

    とどのように私はQuartinが私にurltoolsパッケージhttps://cran.rstudio.com/web/packages/urltools/index.htmlを検索する提案を与えたこれらの2つの問題

    1. を解決に来た - このパッケージには、あなたのURLをエンコードおよびデコードすることができますし、迅速でベクター化された様々な他の機能。次に私の問題はここで私の質問を正しいものにしていました。私は単に、APIドキュメントを調べました。考えるまでもありませんように聞こえるかもしれないが、私はそれを構築するために、以前の回答数を使用する関数を作成する私の質問

    2. を投稿する前にそれを完全な読み取りを与えていないが、以下のポストはほとんど

    を助けました

    API Query for loop この投稿は、すべてを1つのデータフレームにするためのプログレスバーとマップ機能を手伝ってくれました。

    もっと良い答えがあるかもしれませんが、これはこれまで私のために働いています。

  • 関連する問題