【问题标题】:How to structure httr POST request to return site data?如何构造 httr POST 请求以返回站点数据?
【发布时间】:2014-09-23 17:17:04
【问题描述】:

我无法从以下网站提取数据。如果我通过浏览器访问 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,文档类是“HTMLInternalDocument”和“XMLInternalDocument”,这是允许我抓取页面的普通 R 对象。但是接下来的 rvest 和 XML 函数是空的,即使我知道 url 上有一个表。

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

有人可以帮我解释一下我的 httr 请求缺少什么吗?我也尝试了一个 GET 请求,但没有成功。

【问题讨论】:

    标签: r http-post httr


    【解决方案1】:

    您在这里遇到的实际上是一个很常见的问题。 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 个数据框的列表。第 4 个是你想要的。

    你不需要rvest

    【讨论】:

    • 仅供参考 httr 确实设置了用户代理。
    • @hadley 真的吗?到什么?在那种情况下,知道为什么 OP 的代码不起作用,但显式设置用户代理吗?
    • 它将其设置为类似httr/RCurl/R,因此如果服务器正在执行 UA 嗅探,它与已知的任何内容都不匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多