我在从以下网站提取数据时遇到问题.如果我通过我的浏览器访问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")
Run Code Online (Sandbox Code Playgroud)
这些POST请求的结果与我相同,
doc <- POST(base_url, query = list(academicYear = "2014", sportCode = "MFB",
orgId = "721"))
doc <- POST(long_url)
class(doc)
Run Code Online (Sandbox Code Playgroud)
两个POST请求都返回200的状态代码,doc的类是"HTMLInternalDocument"和"XMLInternalDocument",这是允许我刮取页面的普通R对象.但是接下来的rvest和XML函数都是空的,尽管我知道url上有一个表.
table <- html_nodes(doc, css = "td")
table <- readHTMLTable(doc)
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解释一下我的httr请求丢失了吗?我也试过没有运气的GET请求.
你在这里遇到的实际上是一个非常普遍的问题.httr使用RCurl的繁重.默认USER_AGENT头通过在GET或POST请求发送RCurl就是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
Run Code Online (Sandbox Code Playgroud)
另请注意,此网站几乎可以使用表格,因此readHTMLTable(...)实际上会返回4个数据框的列表.第四个是你想要的.
你不需要rvest.