R XML包:如何设置用户代理?
我已经确认 XML 函数(例如 htmlParse 和 readHTML)的 R 调用会向服务器发送一个空白的用户代理字符串。
?XML::htmlParse
在 isURL
下告诉我“libxml 解析器处理与服务器的连接,而不是 R 设施”。这是否意味着无法设置用户代理?
(我确实尝试了 options(HTTPUserAgent="test")
但这没有被应用。)
I've confirmed that R calls of XML functions such as htmlParse and readHTML send a blank user agent string to the server.
?XML::htmlParse
tells me under isURL
that "The libxml parser handles the connection to servers, not the R facilities". Does that mean there is no way to set user agent?
(I did try options(HTTPUserAgent="test")
but that is not being applied.)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
马特的回答是完全正确的。至于下载到字符串/字符向量,
您可以使用 RCurl 和
getURLContent()
(或适当时使用getForm()
或postForm()
)。通过这些功能,您可以对 HTTP 请求进行巨大的控制,包括能够设置用户代理和标头中的任何字段。 如此。
工作也是
Matt's answer is entirely correct. As for downloading to a string/character vector,
you can use RCurl and
getURLContent()
(orgetForm()
orpostForm()
as appropriate).With these functions, you have immense control over the HTTP request, including being able to set the user-agent and any field in the header. So
does the job.
XML::htmlParse
使用 libxml 工具(即 NanoHTTP)通过 GET 方法获取 HTTP 内容。默认情况下,NanoHTTP 不发送 User-Agent 标头。尽管可以将任意标头字符串传递给较低级别的 NanoHTTP 函数(例如xmlNanoHTTPMethod
),但没有 libxml API 将用户代理字符串传递给 NanoHTTP。因此,需要对源代码进行大量修改才能在 XML 包中实现这一点。或者,
options(HTTPUserAgent="test")
为使用 R 工具进行 HTTP 请求的函数设置 User-Agent 标头。例如,可以像这样使用download.file
:(Apache 风格)访问日志条目如下所示:
XML::htmlParse
uses the libxml facilities (i.e. NanoHTTP) to fetch HTTP content using the GET method. By default, NanoHTTP does not send a User-Agent header. There is no libxml API to pass a User-Agent string to NanoHTTP, although one can pass arbitrary header strings to lower-level NanoHTTP functions, likexmlNanoHTTPMethod
. Hence, it would require significant source code modification in order to make this possible in the XML package.Alternatively,
options(HTTPUserAgent="test")
sets the User-Agent header for functions that use the R facility for for HTTP requests. For example, one could usedownload.file
like so:The (Apache style) access log entry looks something like this: