【发布时间】:2020-02-01 19:04:33
【问题描述】:
我正在查看这个很棒的答案:https://stackoverflow.com/a/58211397/3502164。
解决方案的开头包括:
library(httr)
library(xml2)
gr <- GET("https://nzffdms.niwa.co.nz/search")
doc <- read_html(content(gr, "text"))
xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value")
输出在多个请求中保持不变:
"59243d3a2....61f8f73136118f9"
到目前为止,我的默认方式是:
doc <- read_html("https://nzffdms.niwa.co.nz/search")
xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value")
结果与上面的输出不同,并且在多个请求中发生变化。
问题:
两者有什么区别:
read_html(url)read_html(content(GET(url), "text"))
为什么它会导致不同的值,为什么只有“GET”解决方案返回链接问题中的 csv?
(我希望可以用三个子问题来构造它)。
我尝试了什么:
走下函数调用的兔子洞:
read_html
(ms <- methods("read_html"))
getAnywhere(ms[1])
xml2:::read_html
xml2:::read_html.default
#xml2:::read_html.response
read_xml
(ms <- methods("read_xml"))
getAnywhere(ms[1])
但这导致了这个问题:Find the used method for R wrapper functions
想法:
我没有看到 get 请求采用任何标头或 Cookie,即 可以解释不同的反应。
据我了解,
read_html和read_html(content(GET(.), "text"))都将返回 XML/html。好的,我不确定检查是否有意义,但因为我没有想法:我检查了是否存在某种缓存。
代码:
with_verbose(GET("https://nzffdms.niwa.co.nz/search"))
....
<- Expires: Thu, 19 Nov 1981 08:52:00 GMT
<- Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
--> 在我看来,缓存可能不是解决方案。
- 查看
help("GET")给出了一个关于“条件GET”的有趣部分:
GET 方法的语义更改为“条件 GET”,如果 请求消息包括一个 If-Modified-Since、If-Unmodified-Since、 If-Match、If-None-Match 或 If-Range 头字段。有条件的 GET 方法要求实体仅在 条件头字段描述的情况。这 有条件的 GET 方法旨在减少不必要的网络使用 通过允许刷新缓存的实体而不需要多个 请求或传输客户端已持有的数据。
但据我所知,with_verbose() 没有设置任何If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range。
【问题讨论】:
-
哇...由于代理(我已经有
set_config),我收到read_html("http://httpbin.org/")的连接超时错误,但read_html(GET("http://httpbin.org/"))却没有...似乎是一个错误.. .回到你的 qn,我不是 100% 确定,但你的最终想法似乎是合理的,也许保持连接活动设置在第一个但不是第二个......另请参阅 stackoverflow.com/questions/5207160/…