이것은 SO 답변보다 블로그 게시물이나 튜토리얼을 더 많이 사용하지만 배우고 싶은 욕망에 감사 할뿐만 아니라이 주제에 대한 책을 작업하고 있습니다. 이것은 gd 예제처럼 보입니다.
library(rvest)
library(tidyverse)
우리는 최상위 페이지를 시작합니다 : 이제
pg <- read_html("https://www.eia.gov/naturalgas/archive/petrosystem/petrosysog.html")
, 우리는 단지 우리에게 그들의 상태 데이터를 테이블 행을 취득하는 XPath를 사용합니다. XPath 표현식을 HTML의 태그와 비교하면 이해가됩니다. colspan
속성없이 모든 <tr>
의 찾기 만 상태에 대한 권리 클래스와 링크 모두가 <tr>
의 남은 선택 : 그것은 데이터 프레임에서의
states <- html_nodes(pg, xpath=".//tr[td[not(@colspan) and
contains(@class, 'links_normal') and a[@name]]]")
data_frame(
state = html_text(html_nodes(states, xpath=".//td[1]")),
link = html_attr(html_nodes(states, xpath=".//td[2]/a"), "href")
) -> state_tab
은 깔끔하고 편리한 유지.
아래에 비트를 입력해야하지만 그 기능을 표시하기 전에 반복을 설명해야합니다.
각 링크를 반복해야합니다. 각 반복에서, 우리 :
- 요구 사항이 EIA의 서버 부하보다 더 중요하지 않습니다 일시 정지 이후
- 그들은 두 가지 정보를 보유하기 때문에 우리가 (주 + 년을 필요로하는 모든 "지점"
<div>
의를 찾아 해당 주 + 1 년 동안의 데이터 표).
- 좋은 데이터 프레임에
오히려 혼란까지 익명 함수보다 우리가 (이 반복자가 작동하기 전에 정의해야 다시) 다른 함수에서 해당 기능을 놓을 게요을 모두 마무리 :
pb <- progress_estimated(nrow(state_tab))
map_df(state_tab$link, ~{
pb$tick()$print()
pg <- read_html(sprintf("https://www.eia.gov/naturalgas/archive/petrosystem/%s", .x))
Sys.sleep(5) # scrape responsibly
html_nodes(pg, xpath=".//div[@class='branch']") %>%
map_df(extract_table)
}) -> og_df
이것은 무리의 열심히 일하는 사람입니다. 페이지의 모든 주 + 년도 레이블 (각각은 <table>
에 있음)을 찾아야합니다. 그런 다음 데이터가 포함 된 표를 찾아야합니다. 나는 각각의 하단에 설명 선전을 제거하고 또한 tibble
로 각각 설정의 자유를 가지고 (하지만 그건 그냥 내 수업 환경의) :
extract_table <- function(pg) {
t1 <- html_nodes(pg, xpath=".//../tr[td[contains(@class, 'SystemTitle')]][1]")
t2 <- html_nodes(pg, xpath=".//table[contains(@summary, 'Report')]")
state_year <- (html_text(t1, trim=TRUE) %>% strsplit(" "))[[1]]
xml_find_first(t2, "td[@colspan]") %>% xml_remove()
html_table(t2, header=FALSE)[[1]] %>%
mutate(state=state_year[1], year=state_year[2]) %>%
tbl_df()
}
다시 붙여 aforeposted 코드를 당신이 그것을 가지고 grok 수 있도록하기 위해 기능 후에 와서 : 작동,
pb <- progress_estimated(nrow(state_tab))
map_df(state_tab$link, ~{
pb$tick()$print()
pg <- read_html(sprintf("https://www.eia.gov/naturalgas/archive/petrosystem/%s", .x))
Sys.sleep(5) # scrape responsibly
html_nodes(pg, xpath=".//div[@class='branch']") %>%
map_df(extract_table)
}) -> og_df
을 그리고 (당신은 당신이 별도로 최종 정리를 할 거라고 말했다) :
glimpse(og_df)
## Observations: 14,028
## Variables: 19
## $ X1 <chr> "", "Prod.RateBracket(BOE/Day)", "0 - 1", "1 - 2", "2 - 4", "4 - 6", "...
## $ X2 <chr> "", "||||", "|", "|", "|", "|", "|", "|", "|", "|", "|", "|", "|", "|"...
## $ X3 <chr> "Oil Wells", "# ofOilWells", "26", "19", "61", "61", "47", "36", "250"...
## $ X4 <chr> "Oil Wells", "% ofOilWells", "5.2", "3.8", "12.1", "12.1", "9.3", "7.1...
## $ X5 <chr> "Oil Wells", "AnnualOilProd.(Mbbl)", "4.1", "7.8", "61.6", "104.9", "1...
## $ X6 <chr> "Oil Wells", "% ofOilProd.", "0.1", "0.2", "1.2", "2.1", "2.2", "2.3",...
## $ X7 <chr> "Oil Wells", "OilRateper Well(bbl/Day)", "0.5", "1.4", "3.0", "4.9", "...
## $ X8 <chr> "Oil Wells", "AnnualGasProd.(MMcf)", "1.5", "3.5", "16.5", "19.9", "9....
## $ X9 <chr> "Oil Wells", "GasRateper Well(Mcf/Day)", "0.2", "0.6", "0.8", "0.9", "...
## $ X10 <chr> "", "||||", "|", "|", "|", "|", "|", "|", "|", "|", "|", "|", "|", "|"...
## $ X11 <chr> "Gas Wells", "# ofGasWells", "365", "331", "988", "948", "867", "674",...
## $ X12 <chr> "Gas Wells", "% ofGasWells", "5.9", "5.4", "16.0", "15.4", "14.1", "10...
## $ X13 <chr> "Gas Wells", "AnnualGasProd.(MMcf)", "257.6", "1,044.3", "6,360.6", "1...
## $ X14 <chr> "Gas Wells", "% ofGasProd.", "0.1", "0.4", "2.6", "4.2", "5.3", "5.4",...
## $ X15 <chr> "Gas Wells", "GasRateper Well(Mcf/Day)", "2.2", "9.2", "18.1", "30.0",...
## $ X16 <chr> "Gas Wells", "AnnualOilProd.(Mbbl)", "0.2", "0.6", "1.6", "2.0", "2.4"...
## $ X17 <chr> "Gas Wells", "OilRateper Well(bbl/Day)", "0.0", "0.0", "0.0", "0.0", "...
## $ state <chr> "Alabama", "Alabama", "Alabama", "Alabama", "Alabama", "Alabama", "Ala...
## $ year <chr> "2009", "2009", "2009", "2009", "2009", "2009", "2009", "2009", "2009"...
엑셀 파일이나 API를 사용하지 않는 이유가 있습니까? – hrbrmstr
@hrbrmstr 웹 스크 레이 핑에 대해 배우고 싶습니다. 오일 데이터와 R에 익숙합니다. – Poppinyoshi