标签: httr

加速 R 中的 API 调用

我正在查询 Freebase 以获取大约 10000 部电影的类型信息。

在阅读如何使用 R 中的 getURL() 优化抓取后,我尝试并行执行请求。但是,我失败了 - 见下文。除了并行化,我还读到这httr可能是RCurl.

我的问题是:是否可以通过使用以下循环的并行版本(使用 WINDOWS 机器)来加速 API 调用?b) getURL 的替代方法,例如GEThttr-package 中?

library(RCurl)
library(jsonlite)
library(foreach)
library(doSNOW)

df <- data.frame(film=c("Terminator", "Die Hard", "Philadelphia", "A Perfect World", "The Parade", "ParaNorman", "Passengers", "Pink Cadillac", "Pleasantville", "Police Academy", "The Polar Express", "Platoon"), genre=NA)

f_query_freebase <- function(film.title){

  request <- paste0("https://www.googleapis.com/freebase/v1/search?",
                    "filter=", paste0("(all alias{full}:", "\"", film.title, "\"", " type:\"/film/film\")"),
                    "&indent=TRUE",
                    "&limit=1",
                    "&output=(/film/film/genre)")

  temp <- getURL(URLencode(request), ssl.verifypeer = FALSE) …
Run Code Online (Sandbox Code Playgroud)

api parallel-processing r geturl httr

7
推荐指数
1
解决办法
2985
查看次数

异步 POST 请求 - R,使用 RCurl?

我正在尝试从 R 向 REST API 发出异步请求。下面的 curl 命令说明了我需要传递给 api 的参数。我给你们提供了 linux curl 命令,希望这能让你们明白:

curl -v -X POST https://app.example.com/api/ \
-H 'Authorization: somepwd' \
-H "Content-Type: application/json" \
-d {key1: value1, key2: value2}
Run Code Online (Sandbox Code Playgroud)

现在,我通过执行以下命令在 R 中完成同样的事情:

library(httr)
library(jsonlite)
content(POST('https://app.example.com/api/'
                    ,add_headers(Authorization = 'somepwd') 
                    ,body = toJSON(rDataFrame)
                    ,content_type_json()
             )
        )
Run Code Online (Sandbox Code Playgroud)

目标是从 R 提交上述 POST 请求,但改变正文中发送的 json 字符串,并异步执行此操作。

我一直在寻找可以帮助我发出异步请求而不是串行发出请求的包。我能找到的最接近的是 RCurl 包中的 getURIAsynchronous() 函数(https://cran.r-project.org/web/packages/RCurl/RCurl.pdf),但不明白如何提交 PUT 请求标题和正文使用它们的功能。我真的很想从 R 发出上述 POST 请求,但异步,其中 URI 相同,但每个请求发送的数据不同。

我发现这个http://www.omegahat.org/RCurl/concurrent.html

getURIs =
function(uris, ..., multiHandle = getCurlMultiHandle(), …
Run Code Online (Sandbox Code Playgroud)

asynchronous r rcurl httr

7
推荐指数
1
解决办法
2465
查看次数

在r中有多个标头的httr请求

我正在尝试从R中的httr包发出请求:

POST(url = "https://website.com/api/waterfalls", 
       query = list(itemsPerPage="10", page="1", sortAsc="true", sortBy="priority"), 
 add_headers(c('Authorization'='Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyaWQiOiI1NmZhNzZiMzMxMTY5NzAwMDIwMDAwNDIifQ.CHjH9jQHy2-B68aBRijoZptCAtVLm9U_Z80f_XYaPEc'
               'Accept-Encoding' = 'gzip, deflate, sdch, br', 
               'Accept-Language' = 'en-US,en;q=0.8', 
               'User-Agent' = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36', 
               'Accept' = 'application/json, text/javascript, */*; q=0.01', 
               'Referer' = 'http://cnn.com', 
               'X-Requested-With' = 'XMLHttpRequest', 
               'Connection' = 'keep-alive',
               'Authority' = 'website.com')))
Run Code Online (Sandbox Code Playgroud)

这不起作用.我认为问题是add_headers()的语法不正确,你知道如何在httr的POST()中使用多个头文件吗?

r httr

7
推荐指数
1
解决办法
2498
查看次数

使用R"点击"网页上的下载文件按钮

我试图使用这个网页http://volcano.si.edu/search_eruption.cfm来抓取数据.有两个下拉框要求过滤数据.我不需要过滤数据,因此我将其留空并继续单击" 搜索喷发 " 进入下一页.

然而,我注意到,结果表只包含少量列(仅5个),而不是它应该具有的总列数(总共24个).但是,如果单击"将结果下载到Excel "按钮并打开下载的文件,则所有24列都将在那里.这就是我需要的.

所以,看起来这已经从一次刮痧练习(使用httr和rvest)转变为更困难的事情.但是,我对如何使用R 实际"点击""将结果下载到Excel "按钮感到困惑.我的猜测是我将不得不使用RSelenium,但这里是我的代码试图使用带有POST的httr以防万一任何一个善良的人都可以找到一种更简单的方式.我也尝试过使用gdata,data.table,XML等无济于事,这可能只是用户错误的结果.

此外,知道无法右键单击下载按钮以显示URL可能会有所帮助.

url <- "http://volcano.si.edu/search_eruption_results.cfm"

searchcriteria <- list(
    eruption_category = "",
    country = ""
)

mydata <- POST(url, body = "searchcriteria")
Run Code Online (Sandbox Code Playgroud)

在我的浏览器中使用Inspector,我能够看到两个过滤器是"eruption_category"和"country",两者都是空白的,因为我不需要任何过滤数据.

最后,似乎上面的代码将使我进入只有5列的表的页面.但是,我仍然无法在下面的代码中使用rvest来刮掉这个表(使用SelectorGadget只刮一列).最后,这部分并不重要,因为正如我上面所说,我需要所有24列,而不仅仅是这些5列.但是,如果你发现我在下面做的任何错误,我将不胜感激.

Eruptions <- mydata %>%
    read_html() %>%
    html_nodes(".td8") %>%
    html_text()
Eruptions
Run Code Online (Sandbox Code Playgroud)

感谢您提供任何帮助.

post r httr rselenium

7
推荐指数
1
解决办法
3427
查看次数

使用R登录.NET站点

我正在尝试使用我的凭据登录到.NET站点但无法使其正常工作.我的代码受到以下主题的启发

如何使用R登录然后从aspx网页下载文件

library(RCurl)
curl = getCurlHandle()
curlSetOpt(cookiejar = 'cookies.txt', followlocation = TRUE, autoreferer = TRUE, curl = curl)
html <- getURL('http://www.aceanalyser.com/Login.aspx', curl = curl)
viewstate <- as.character(sub('.*id="__VIEWSTATE" value="([0-9a-zA-Z+/=]*).*', '\\1', html))
viewstategenerator <- as.character(sub('.*id="__VIEWSTATEGENERATOR" value="([0-9a-zA-Z+/=]*).*', '\\1', html))

params <- list(
  'txtUserID'    = '********',
  'txtPwd'    = '*******',
  'Btn_Login' = 'GO',
  '__VIEWSTATE' = viewstate,
  '__VIEWSTATEGENERATOR' = viewstategenerator,
  'HiddenField1' = '1280',
  'HiddenField2' = '700',
  'Hdn_Pwd' = 'true')

html = postForm('http://www.aceanalyser.com/Login.aspx', .params = params, curl = curl)
grepl('Logout', html)
Run Code Online (Sandbox Code Playgroud)

结果:FALSE

请帮我理解这个问题

r rcurl httr

7
推荐指数
1
解决办法
389
查看次数

R httr后验证下载在交互模式下工作但功能失败

下面的代码在交互模式下工作正常但在函数中使用时失败.它只是两个身份验证POST命令,然后是数据下载.我的目标是让它在一个函数内部工作,而不仅仅是在交互模式下.

这个问题是有点续集的这个问题 .. ICPSR最近更新了他们的网站.以下最小可重复的示例需要一个免费帐户,可在

https://www.icpsr.umich.edu/rpxlogin?path=ICPSR&request_uri=https%3a%2f%2fwww.icpsr.umich.edu%2ficpsrweb%2findex.jsp

我尝试添加Sys.sleep(1)和各种httr::GET/ httr::POST电话但没有任何效果.

my_download <-
    function( your_email , your_password ){

        values <-
            list(
                agree = "yes",
                path = "ICPSR" ,
                study = "21600" ,
                ds = "" ,
                bundle = "rdata",
                dups = "yes",
                email=your_email,
                password=your_password
            )


        httr::POST("https://www.icpsr.umich.edu/cgi-bin/terms", body = values)
        httr::POST("https://www.icpsr.umich.edu/rpxlogin", body = values)

        tf <- tempfile()
        httr::GET( 
            "https://www.icpsr.umich.edu/cgi-bin/bob/zipcart2" , 
            query = values , 
            httr::write_disk( tf , overwrite = TRUE ) , 
            httr::progress()
        )

    }

# fails …
Run Code Online (Sandbox Code Playgroud)

cookies https r web-scraping httr

7
推荐指数
1
解决办法
168
查看次数

使用 httr 通过 Travis-CI 在 Github 进行身份验证以及本地身份验证(本地有效,远程无效)

我有一个Rmd文件,它使用httr访问Github的API。在本地,如果我R在渲染之前在控制台中运行以下内容,我可以很好地通过 Github 进行身份验证Rmd

myapp <- oauth_app("APP", key = "xyz", secret = "pqr")
github_token <- oauth2.0_token(oauth_endpoints("github"), myapp)
Run Code Online (Sandbox Code Playgroud)

密钥和秘密是在 Github 上创建的,并且在我渲染时存在于我的工作区中,因此github_token被选中并且我可以在本地渲染时访问 Github-API 而不会达到访问限制。

现在,同样Rmd在 Travis-CI 中自动构建,然后在我推送 master 分支时部署到 gh-pages。我有这个没有身份验证的工作,但这将我的 Githhub-API 请求限制限制为 60/小时,我需要通过身份验证获得的更高限制。为此,我在 Github 中也设置了个人访问令牌 (PAT);设置 PAT 的页面说“个人访问令牌的功能类似于普通的 OAuth 访问令牌。它们可以用来代替 Git over HTTPS 的密码,或者可以用来通过基本身份验证对 API 进行身份验证”。

这是Rmd我尝试检测渲染是本地还是远程并获取适当令牌的部分内容。但是,当它在 Travis-CI 上运行时,令牌似乎没有被识别,所以我认为我没有正确使用它。

# Figure out the build location, and get the needed token
at_home <- FALSE
at_TCI <- FALSE
token_found <- FALSE …
Run Code Online (Sandbox Code Playgroud)

r github-api travis-ci httr

7
推荐指数
1
解决办法
173
查看次数

如何正确设置 cookie 以使用 httr 获取 URL 内容

我需要从使用 cookie 保护的网站下载信息。我手动传递此保护,然后将 cookie 插入到httr.

这是类似的主题,但它没有解决我的问题:(为 httr 复制 cookie

library(httr)
url<-"http://smida.gov.ua/db/emitent/year/xml/showform/32153/125/templ"

cook<-"_SMIDA=9117a9eb136353bd6956651bd59acd37; __utmt=1; __utma=29983421.1729484844.1413489369.1413625619.1413627797.3; __utmb=29983421.7.10.1413627797; __utmc=29983421; __utmz=29983421.1413489369.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"

response <- GET(url, config(cookie= cook))

content(x = response,as = 'text', encoding = "UTF-8")   
Run Code Online (Sandbox Code Playgroud)

因此,当我使用内容时,它会返回我未登录的信息(就像没有 cookie 时那样)

我怎么解决这个问题?

测试凭据是 login: mytest2, pass: qwerty12)

cookies r httr

6
推荐指数
1
解决办法
5296
查看次数

如何删除 httr::GET 保留的 cookie?

httr::GET 在向同一网站发出请求时保留 cookie。

  1. 是否可以查询那些保留的 cookie?
  2. 如何刷新那些保存的 cookie 并再次发出“原始”请求?

例子:

# Get login cookie
r1 <- GET("https://some.url/login", authenticate("foo", "bar"))

cookies(r1)
# returns a data frame of two cookies

# Make request that requires authentication cookie
# Only succeeds if r1 was made
r2 <- GET("https://some.url/data/?query&subset=1")
r2
Run Code Online (Sandbox Code Playgroud)

请注意,制作时r2您不必明确传递任何 cookie 信息,因为它们会自动存储在某处。

我想知道如何查询或删除这些存储的 cookie?

r httr

6
推荐指数
1
解决办法
1216
查看次数

R rvest:找不到函数"xpath_element"

我试图简单地复制示例rvest::html_nodes(),但遇到错误:

library(rvest)
ateam <- read_html("http://www.boxofficemojo.com/movies/?id=ateam.htm")
html_nodes(ateam, "center")
Run Code Online (Sandbox Code Playgroud)

do.call中的错误(方法,列表(parsed_selector)):找不到函数"xpath_element"

同样的情况,如果我打开包,例如httr,xml2,selectr.我似乎也有这些软件包的最新版本......

在该包的功能,例如xpath_element,xpath_combinedselector在什么位置?我如何让它工作?请注意,我在Ubuntu 16.04上运行,因此该代码可能适用于其他平台...

r httr rvest xml2 ubuntu-16.04

6
推荐指数
1
解决办法
1591
查看次数