R XML包:如何设置用户代理?

时间:2011-09-01 10:25:33

标签: r user-agent libxml2

我已经确认R调用XML函数(如htmlParse和readHTML)会向服务器发送一个空白的用户代理字符串。

?XML::htmlParseisURL下告诉我" libxml解析器处理与服务器的连接,而不是R设施"。这是否意味着无法设置用户代理?

(我确实试过options(HTTPUserAgent="test")但是没有应用。)

2 个答案:

答案 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"