2015-02-12 4 views
1

Я довольно новичок в R, и у меня возникают проблемы с извлечением данных с сайта Forbes.Scrape Anchored Website with Selenium Package in R

Моя текущая функция:

URL =

http://www.forbes.com/global2000/list/#page:1_sort:0_direction:asc_search:_filter:All%20industries_filter:All%20countries_filter:All%20states

данных = readHTMLTable (URL)

Однако сайт Forbes якорь с символом "#" в ссылке. Я загрузил пакет rselenium для анализа данных, которые я хочу, но я не очень хорошо разбираюсь в reselenium.

Есть ли у кого-нибудь совет/экспертиза с reselenium и как я могу извлечь данные из Forbes, используя reselenium? В идеале я хочу извлечь данные со страницы 1, 2 и т. Д. С веб-сайта.

Спасибо!

ответ

1

Это немного Hacky, но вот мое решение с использованием rvest и read.delim ...

library(rvest) 

url <- "http://www.forbes.com/global2000/list/#page:1_sort:0_direction:asc_search:_filter:All%20industries_filter:All%20countries_filter:All%20states" 
a <- html(url) %>% 
    html_nodes("#thelist") %>% 
    html_text() 
con <- textConnection(a) 
df <- read.delim(con, sep="\t", header=F, skip=12, stringsAsFactors=F) 
close(con) 
df$V1[df$V1==""] <- df$V3[df$V1==""] 
df$V2 <- df$V3 <- NULL 
df <- subset(df, V1!="") 
df$index <- 1:nrow(df) 
df2 <- data.frame(company=df$V1[df$index%%6==1], 
        country=df$V1[df$index%%6==2], 
        sales=df$V1[df$index%%6==3], 
        profits=df$V1[df$index%%6==4], 
        assets=df$V1[df$index%%6==5], 
        market_value=df$V1[df$index%%6==0]) 
+0

Эй, Кори. Функция работает в той степени, в которой вы смотрите только на страницу 1 (см. «#page: 1» в ссылке). Однако, как только вы захотите перейти на страницу 2, то есть «#page: 2», функция не работает, поскольку она продолжает извлекать данные со страницы 1 из-за привязки. Вы можете думать о любой работе вокруг вас? –

4

Или другой способ, используя API, используемый для заполнения веб-страницы. Это загружает все 2000 компаний одновременно.

library(httr) 
library(RJSONIO) 
url <- "http://www.forbes.com/ajax/load_list/" 
query <- list("type" = "organization", 
       "uri" = "global2000", 
       "year" = "2014") 
response <- httr::GET(url, query=query) 
dat_string <- as(response, "character") 
dat_list <- RJSONIO::fromJSON(dat_string, asText=TRUE) 
df <- data.frame(rank = sapply(dat_list, "[[", 1), 
       company = sapply(dat_list, "[[", 3), 
       country=sapply(dat_list, "[[", 10), 
       sales=sapply(dat_list, "[[", 6), 
       profits=sapply(dat_list, "[[", 7), 
       assets=sapply(dat_list, "[[", 8), 
       market_value=sapply(dat_list, "[[", 9), stringsAsFactors=F) 
df <- df[order(df$rank),] 
+0

Кори, ты громкий гений! Если/когда у вас есть время, можете ли вы объяснить: 1) как вы нашли информацию API для веб-страницы и 2) какие httr и RJONSIO? Любые информационные ссылки на httr и RJONSIO будут работать. Мне определенно интересно и хочу узнать, как вы получили информацию API. Большое спасибо человеку! –

+0

Хех, спасибо. Для поиска api ... в chrome щелкните правой кнопкой мыши, затем выберите «проверить элемент», перейдите на вкладку «Сеть», затем перейдите к URL-адресу. Нажмите на запись «/ ajax/loadlist», и оттуда вы можете подключить параметры строки реферера и строки запроса, которые вы видите там, в соответствующие места в коде R. Что касается пакетов httr и RJSONIO ... google it! – cory

+0

Также еще одна вещь, как вы указали функцию «список» как «организация», «global2000» и «2014»? Благодаря! –