我正在查询 Freebase 以获取大约 10000 部电影的类型信息。
在阅读如何使用 R 中的 getURL() 优化抓取后,我尝试并行执行请求。但是,我失败了 - 见下文。除了并行化,我还读到这httr可能是RCurl.
我的问题是:是否可以通过使用以下循环的并行版本(使用 WINDOWS 机器)来加速 API 调用?b) getURL 的替代方法,例如GET在httr-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) 我正在尝试从 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) 我正在尝试从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()中使用多个头文件吗?
我试图使用这个网页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)
感谢您提供任何帮助.
我正在尝试使用我的凭据登录到.NET站点但无法使其正常工作.我的代码受到以下主题的启发
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
请帮我理解这个问题
下面的代码在交互模式下工作正常但在函数中使用时失败.它只是两个身份验证POST命令,然后是数据下载.我的目标是让它在一个函数内部工作,而不仅仅是在交互模式下.
这个问题是有点续集的这个问题 .. ICPSR最近更新了他们的网站.以下最小可重复的示例需要一个免费帐户,可在
我尝试添加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) 我有一个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) 我需要从使用 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)
httr::GET 在向同一网站发出请求时保留 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?
我试图简单地复制示例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上运行,因此该代码可能适用于其他平台...
httr ×10
r ×10
cookies ×2
rcurl ×2
api ×1
asynchronous ×1
geturl ×1
github-api ×1
https ×1
post ×1
rselenium ×1
rvest ×1
travis-ci ×1
ubuntu-16.04 ×1
web-scraping ×1
xml2 ×1