2014-09-23 6 views
4

다음 웹 사이트에서 데이터를 가져 오는 데 문제가 있습니다. 내 브라우저를 통해 long_url에 가면 내가 긁고 싶은 표를 볼 수 있지만 httr을 사용하여 R 내에서 URL을 호출하면 데이터가 반환되지 않습니다. 그것은 나에게 돌려 보내지고있다. 이러한 POST 요청의httr POST 요청을 구조화하는 방법 사이트 데이터를 반환 하시겠습니까?

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") 

결과는

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

class(doc) 

두 POST 요청

200 상태 코드를 반환, 나에게 동일하게보고, 문서의 클래스는 "HTMLInternalDocument"와 "XMLInternalDocument"입니다 내가 페이지를 긁을 수있게 해주는 보통의 R 오브젝트. 그러나 URL에 테이블이 있다는 것을 알고 있더라도 다음 rvest 및 XML 함수는 비어 있습니다.

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

누군가 내 httr 요청이 누락되었습니다. 나는 또한 운이없는 GET 요구를 시도했다.

답변

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은 필요하지 않습니다.

+1

FYI httr는 사용자 에이전트를 설정합니다. – hadley

+0

@hadley 정말요? 무엇을? 이 경우 OP의 코드가 작동하지 않는 이유가 있지만 사용자 에이전트를 명시 적으로 설정하면 어떤 생각일까요? – jlhoward

+0

그것은'httr/RCurl/R'과 같은 것으로 설정하기 때문에 서버가 UA 스니핑을하는 경우 알려진 것과 일치하지 않습니다. – hadley