2017-10-03 16 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 updated – mannym

답변

1

내가 제대로 내 쿼리를 인코딩하는 방법을 알아내는 2 단계 문제

  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") 
내 연구 방법에 대한 그래서

나는이 2 개의 문제

를 해결하기 위해 온 방법
  1. 는 Quartin 나에게 urltools 패키지 https://cran.rstudio.com/web/packages/urltools/index.html 찾아 볼 수있는 제안했다 -이 패키지는 당신이 인코딩하고 URL을 디코딩하는 데 도움을 빠르고 벡터화 된 다양한 기능. 다음으로 내 문제는 정확한 쿼리를 얻는 것입니다. API에서 가져 오려는 사람에게 API 문서를 보았습니다. 생각할 필요도없는 것처럼 들릴 수는 있지만 내가 그것을 구축 할 수 있도록 이전 답변의 번호를 사용하는 함수를 작성하면 내 질문에

  2. 를 게시하기 전에 그것을 전체 읽기를 포기하지 않았다 그러나 아래 포스트는 가장

도움

API Query for loop 이 게시물은 진행 막대와지도 기능을 사용하여 모든 것을 하나의 데이터 프레임으로 가져 오는 데 도움이되었습니다.

더 나은 대답이 될 수도 있지만 지금까지는 저에게 좋습니다.