我正在尝试编写一个通过REST API访问某些数据的R包.但是,API不使用http身份验证,而是依赖cookie来保持会话的凭据.
本质上,我想用两个R函数替换bash脚本中的以下两行:一个用于执行登录,并存储会话cookie,第二个用于获取数据.
curl -X POST -c cookies.txt -d"username=xxx&password=yyy" http://api.my.url/login
curl -b cookies.txt http://api.my.url/data
Run Code Online (Sandbox Code Playgroud)
我显然不明白RCurl如何使用curl选项.我现在的脚本有:
library(RCurl)
curl <- getCurlHandle()
curlSetOpt(cookiejar='cookies.txt', curl=curl)
postForm("http://api.my.url/login", username='xxx', password='yyy', curl=curl)
getURL('http://api.my.url/data", curl=curl)
Run Code Online (Sandbox Code Playgroud)
最终getURL()失败并显示"未登录".来自服务器的消息,并且在postForm()没有cookies.txt文件之后.
现在整个世界都在努力使用SSL(这个决定很有意义)我们中的一些人使用github和相关服务来存储csv文件有一点挑战.从URL读取时,read.csv()函数不支持SSL.为了解决这个问题,我正在做一个小舞蹈,我喜欢称之为SSL歌舞伎舞蹈.我用RCurl抓取文本文件,将其写入临时文件,然后用read.csv()读取它.这样做有更顺畅的方法吗?更好的解决方案?
这是SSL kabuki的一个简单示例:
require(RCurl)
myCsv <- getURL("https://gist.github.com/raw/667867/c47ec2d72801cfd84c6320e1fe37055ffe600c87/test.csv")
temporaryFile <- tempfile()
con <- file(temporaryFile, open = "w")
cat(myCsv, file = con)
close(con)
read.csv(temporaryFile)
Run Code Online (Sandbox Code Playgroud) 作为一种探索如何在R中为Denver RUG创建包的方法,我决定在datasciencetoolkit API周围编写一个R包装器是一个有趣的小项目.基本的R工具来自RCurl包,如您所想.我被困在一个看似简单的问题上,我希望这个论坛中的某个人能够指出我正确的方向.基本问题是我似乎无法使用postForm()将未键控的字符串作为curl中数据选项的一部分传递,即curl -d"string""address_to_api".
例如,从命令行我可能会这样做
$ curl -d "Tim O'Reilly, Archbishop Huxley" "http://www.datasciencetoolkit.org/text2people"
Run Code Online (Sandbox Code Playgroud)
成功.但是,似乎postForm()在将其他参数传递给POST请求时需要显式键.我查看了datasciencetoolkit代码和开发人员文档以获取可能的密钥,但似乎找不到任何东西.
顺便说一下,通过GET请求将输入传递给DSTK API的其他部分非常简单.例如,
ip2coordinates <- function(ip) {
api <- "http://www.datasciencetoolkit.org/ip2coordinates/"
result <- getURL(paste(api, URLencode(ip), sep=""))
names(result) <- "ip"
return(result)
}
ip2coordinates('67.169.73.113')
Run Code Online (Sandbox Code Playgroud)
将产生预期的结果.
为了清楚起见,我已经阅读了DTL的omegahat网站上的RCurl文档,包含RCurl文档以及curl手册页.但是,我遗漏了一些关于curl(或者postForm()函数中的.opts())的基本内容,我似乎无法得到它.
在python中,我基本上可以使用httplib.HTTPConnection创建一个'原始'POST请求 - 就像在R中可用的那样?我也查看了httpRequest包中的simplePostToHost函数,它似乎只是锁定了我的R会话(它似乎也需要一个键).
FWIW,我在Mac 10.6.7上使用R 2.13.0.
任何帮助深表感谢.如果您对使用数据科学工具包感兴趣,所有代码很快就会在github上提供.
干杯.
我正在使用RCurl包实现围绕PiCloud的REST API的R包装器向API服务器发出HTTP(S)请求.API使用基本HTTP身份验证来验证用户是否具有足够的权限.PiCloud文档提供了使用api和使用curl进行身份验证的示例:
$ curl -u 'key:secret_key' https://api.picloud.com/job/?jids=12
Run Code Online (Sandbox Code Playgroud)
这非常有效.将其转换为等效的RCurl命令:
getURL("https://api.picloud.com/job/?jids=12", userpwd="key:secret")
Run Code Online (Sandbox Code Playgroud)
执行此函数我收到以下错误消息:
[1] "{\"error\": {\"msg\": \"No HTTP Authorization information present\", \"code\": 995, \"retry\": false}}"
Run Code Online (Sandbox Code Playgroud)
我更深入地探讨了这个问题,我发现curl命令发出的HTTP请求包含了第一个GET命令中的Authorization字段.
RCurl不这样做.相反,它首先发送没有设置授权字段的GET请求.如果它收到401错误代码和带有WWW-Authenticate字段的响应,它将发送另一个带有Authorization字段的GET请求.
虽然HTTP规范要求使用401错误代码返回的消息包含WWW-Authenticate字段但PiCloud API消息不包含.因此,getURL即使使用userpwd选项设置调用,RCurl也不会发送具有授权字段集的GET请求.因此,身份验证将始终失败.
有没有办法强制RCurl在它发送的第一个GET消息中设置授权字段?如果没有,我可以使用其他任何R包?
使用R,我试图刮一个网页,将日文文本保存到文件中.最终,这需要扩展到每天处理数百页.我已经在Perl中有一个可行的解决方案,但我正在尝试将脚本迁移到R以减少在多种语言之间切换的认知负荷.到目前为止,我没有成功.相关的问题似乎是关于保存csv文件和将此希伯来文写入HTML文件的问题.但是,我没有成功地根据那里的答案拼凑出一个解决方案.编辑:关于R的UTF-8输出的这个问题也是相关的但是没有解决.
这些页面来自Yahoo! 日本财务和我的Perl代码看起来像这样.
use strict;
use HTML::Tree;
use LWP::Simple;
#use Encode;
use utf8;
binmode STDOUT, ":utf8";
my @arr_links = ();
$arr_links[1] = "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7203";
$arr_links[2] = "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7201";
foreach my $link (@arr_links){
$link =~ s/"//gi;
print("$link\n");
my $content = get($link);
my $tree = HTML::Tree->new();
$tree->parse($content);
my $bar = $tree->as_text;
open OUTFILE, ">>:utf8", join("","c:/", substr($link, -4),"_perl.txt") || die;
print OUTFILE $bar;
}
Run Code Online (Sandbox Code Playgroud)
此Perl脚本生成一个类似于下面屏幕截图的CSV文件,其中包含可以离线挖掘和操作的正确的汉字和假名:

我的R代码,如下所示,如下所示.R脚本与刚刚给出的Perl解决方案不完全相同,因为它不会删除HTML并留下文本(这个答案暗示了一种使用R的方法,但在这种情况下它对我不起作用)并且它没有循环等等,但意图是一样的.
require(RCurl)
require(XML)
links <- list()
links[1] <- "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7203"
links[2] <- "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=7201"
txt …Run Code Online (Sandbox Code Playgroud) 这是我正在使用的代码示例:
library(jsonlite)
library(curl)
#url
url = "http://www.zillow.com/search/GetResults.htm?spt=homes&status=001000<=000000&ht=010000&pr=999999,10000001&mp=3779,37788&bd=0%2C&ba=0%2C&sf=,&lot=0%2C&yr=,1800&singlestory=0&hoa=0%2C&pho=0&pets=0&parking=0&laundry=0&income-restricted=0&pnd=0&red=0&zso=0&days=36m&ds=all&pmf=0&pf=0&sch=100111&zoom=6&rect=-91307373,29367814,-84759521,35554574&p=1&sort=globalrelevanceex&search=maplist&rid=4&rt=2&listright=true&isMapSearch=true&zoom=6"
#json
results_data_json = fromJSON(txt = url)
Run Code Online (Sandbox Code Playgroud)
我曾经能够运行类似的代码,没有任何问题.现在我收到以下错误:
Error in feed_push_parser(buf) :
lexical error: invalid char in json text.
<html><head><title>Zillow: Real
(right here) ------^
Run Code Online (Sandbox Code Playgroud)
围绕这个想法吗?
我看到很多用RCurl下载二进制文件的例子都是这样的:
library("RCurl")
curl = getCurlHandle()
bfile=getBinaryURL (
"http://www.example.com/bfile.zip",
curl= curl,
progressfunction = function(down, up) {print(down)}, noprogress = FALSE
)
writeBin(bfile, "bfile.zip")
rm(curl, bfile)
Run Code Online (Sandbox Code Playgroud)
如果下载非常大,我想最好将它同时写入存储介质,而不是在内存中获取所有内容.
在RCurl文档中,有一些示例可以通过块获取文件并在下载时对其进行操作,但它们似乎都是指文本块.
你能给出一个有效的例子吗?
用户建议使用R native download file和mode = 'wb'二进制文件选项.
在许多情况下,本机函数是一个可行的替代方案,但是有许多用例不适合这种本机函数(https,cookie,表单等),这就是RCurl存在的原因.
我正在尝试使用R 自动下载此网页上可用的收入动态面板研究文件.点击任何这些文件会将用户带到此登录/身份验证页面.身份验证后,可以使用Web浏览器轻松下载文件.不幸的是,下面的代码似乎没有维护身份验证.我已经尝试在Chrome中检查Login.aspx页面(如此处所述),但即使我认为我传递了所有正确的值,它似乎也不会保持身份验证.如果是与做我不关心或者还是其他什么东西,我只是喜欢的事,在'r的作品,所以我不需要有此脚本的用户必须手动或使用一些完全独立的程序下载的文件.我对此的尝试之一如下,但它不起作用.任何帮助,将不胜感激.谢谢!!:dhttrHeadershttrRCurl
require(httr)
values <-
list(
"ctl00$ContentPlaceHolder3$Login1$UserName" = "you@email.com" ,
"ctl00$ContentPlaceHolder3$Login1$Password" = "somepassword" ,
"ctl00$ContentPlaceHolder3$Login1$LoginButton" = "Log In" ,
"_LASTFOCUS" = "" ,
"_EVENTTARGET" = "" ,
"_EVENTARGUMENT" = ""
)
POST( "http://simba.isr.umich.edu/u/Login.aspx?redir=http%3a%2f%2fsimba.isr.umich.edu%2fZips%2fZipMain.aspx" , body = values )
resp <- GET( "http://simba.isr.umich.edu/Zips/GetFile.aspx" , query = list( file = "1053" ) )
Run Code Online (Sandbox Code Playgroud) 当我尝试调用install_github时,我收到以下错误(不仅是这个包,而是所有github包):
> install_github('ramnathv/slidify')
Downloading github repo ramnathv/slidify@master
Error in curl::curl_fetch_memory(url, handle = handle) :
Problem with the SSL CA cert (path? access rights?)
Run Code Online (Sandbox Code Playgroud)
但是,如果我直接使用RCurl来访问带有ssl的github,我不会遇到任何问题:
> x <- getBinaryURL(
url='https://github.com/ramnathv/slidify/archive/master.zip',
followlocation=1L
)
Run Code Online (Sandbox Code Playgroud)
无错误地工作,因此RCurl可以正确验证SSL证书并下载存档文件.
> sessionInfo()
R version 3.2.1 (2015-06-18)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 8 (jessie)
locale:
[1] LC_CTYPE=en_US.utf8 LC_NUMERIC=C
[3] LC_TIME=en_US.utf8 LC_COLLATE=en_US.utf8
[5] LC_MONETARY=en_US.utf8 LC_MESSAGES=en_US.utf8
[7] LC_PAPER=en_US.utf8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.utf8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages: …Run Code Online (Sandbox Code Playgroud) 我使用了以下代码:
library(XML)
library(RCurl)
getGoogleURL <- function(search.term, domain = '.co.uk', quotes=TRUE)
{
search.term <- gsub(' ', '%20', search.term)
if(quotes) search.term <- paste('%22', search.term, '%22', sep='')
getGoogleURL <- paste('http://www.google', domain, '/search?q=',
search.term, sep='')
}
getGoogleLinks <- function(google.url)
{
doc <- getURL(google.url, httpheader = c("User-Agent" = "R(2.10.0)"))
html <- htmlTreeParse(doc, useInternalNodes = TRUE, error=function(...){})
nodes <- getNodeSet(html, "//a[@href][@class='l']")
return(sapply(nodes, function(x) x <- xmlAttrs(x)[[1]]))
}
search.term <- "cran"
quotes <- "FALSE"
search.url <- getGoogleURL(search.term=search.term, quotes=quotes)
links <- getGoogleLinks(search.url)
Run Code Online (Sandbox Code Playgroud)
我想找到我的搜索产生的所有链接,我得到以下结果:
> links
list()
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得链接?另外我想获得谷歌搜索结果的头条新闻和总结如何才能获得它?最后是否有办法获取ChillingEffects.org结果中的链接?