如何构建httr POST请求以返回站点数据?

时间:2014-09-23 17:17:05

标签: r http-post httr

我在从以下网站提取数据时遇到问题。如果我通过我的浏览器访问long_url,我可以看到我要抓的表,但是如果我使用httr从R中调用url,我要么没有将数据返回给我,要么就是我'我不明白它是如何归还给我的。

base_url <- "http://web1.ncaa.org/stats/exec/records"
long_url <- "http://web1.ncaa.org/stats/exec/records?academicYear=2014&sportCode=MFB&orgId=721"

library(XML)
library(httr)
library(rvest) # devtools::install_github("hadley/rvest")

这些POST请求的结果与我相同,

doc <- POST(base_url, query = list(academicYear = "2014", sportCode = "MFB",
                                         orgId = "721"))
doc <- POST(long_url)

class(doc)

两个POST请求都返回状态代码200,而doc类是&#34; HTMLInternalDocument&#34;和&#34; XMLInternalDocument&#34;这是正常的R对象,允许我刮取页面。但是接下来的rvest和XML函数都是空的,尽管我知道url上有一个表。

 table <- html_nodes(doc, css = "td")
 table <- readHTMLTable(doc)

有人可以帮我解释一下我的httr请求丢失了吗?我也尝试了一个没有运气的GET请求。

1 个答案:

答案 0 :(得分:6)

您在这里遇到的实际上是一个非常常见的问题。 httr使用RCurl进行繁重的工作。 RCurl在GET或POST请求中发送的默认user_agent标头为NULL,这经常会混淆脚本。这就是您从浏览器和httr(...)获得不同结果的原因。如果您欺骗了有意义的用户代理,您将获得所需的结果。

base_url <- "http://web1.ncaa.org/stats/exec/records"
ua       <- "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0"
library(httr)
library(XML)
doc <- POST(base_url, 
            query = list(academicYear = "2014", sportCode = "MFB",orgId = "721"),
            user_agent(ua))

html <- content(doc, useInternalNodes=T)
df.list <- readHTMLTable(html)
df      <- df.list[[4]]
head(df)
#    Opponent  Game Date Air ForceScore OppScore  Loc Neutral SiteLocation GameLength Attend
# 1   Colgate 08/31/2013             38       13 Home                               - 32,095
# 2  Utah St. 09/07/2013             20       52 Home                               - 32,716
# 3 Boise St. 09/13/2013             20       42 Away                               - 36,069
# 4   Wyoming 09/21/2013             23       56 Home                               - 35,389
# 5    Nevada 09/28/2013             42       45 Away                               - 24,545
# 6      Navy 10/05/2013             10       28 Away                               - 38,225

另请注意,此网站仅使用表格,因此readHTMLTable(...)实际上会返回4个数据框的列表。第四个是你想要的那个。

您不需要rvest