我已经确认R调用XML函数(如htmlParse和readHTML)会向服务器发送一个空白的用户代理字符串。
?XML::htmlParse
在isURL
下告诉我" libxml解析器处理与服务器的连接,而不是R设施"。这是否意味着无法设置用户代理?
(我确实试过options(HTTPUserAgent="test")
但是没有应用。)
答案 0 :(得分:5)
马特的回答是完全正确的。至于下载到字符串/字符向量,
您可以根据需要使用 RCurl 和getURLContent()
(或getForm()
或postForm()
)。
使用这些功能,您可以对HTTP请求进行巨大的控制,包括能够设置用户代理和标头中的任何字段。所以
x = getURLContent("http://biostatmatt.com", useragent = "BioStatMatt-via-R",
followlocation = TRUE)
htmlParse(x, asText = TRUE) # or htmlParse(I(x))
完成这项工作。
答案 1 :(得分:4)
XML::htmlParse
使用libxml工具(即 NanoHTTP)使用GET方法获取HTTP内容。默认情况下,NanoHTTP不会发送User-Agent标头。没有用于将User-Agent字符串传递给NanoHTTP的libxml API,尽管可以将任意头字符串传递给较低级别的NanoHTTP函数,例如xmlNanoHTTPMethod
。因此,它需要进行重要的源代码修改才能在XML包中实现这一点。
或者,options(HTTPUserAgent="test")
为使用R工具进行HTTP请求的函数设置User-Agent标头。例如,可以像这样使用download.file
:
options(HTTPUserAgent='BioStatMatt-via-R')
download.file('http://biostatmatt.com/', destfile='biostatmatt.html')
XML::htmlParse('biostatmatt.html')
(Apache样式)访问日志条目如下所示:
160.129.***.*** - - [01/Sep/2011:20:16:40 +0000] "GET / HTTP/1.0" 200 4479 "-" "BioStatMatt-via-R"