Зачистить закрепленный сайт с пакетом Selenium в R
Я довольно новичок в R и у меня проблемы с получением данных с сайта Forbes.
Моя текущая функция:
URL =
http://www.forbes.com/global2000/list/#page:1_sort:0_direction:asc_search:_filter:All%20industries_filter:All%20countries_filter:All%20states
data = readHTMLTable (url)
Тем не менее, сайт Forbes закреплен символом "#" внутри ссылки. Я скачал пакет rselenium, чтобы проанализировать нужные мне данные, но я не очень разбираюсь в реселениуме.
Кто-нибудь есть какие-либо советы / опыт с реселениумом и как я могу получить данные из Forbes, используя реселениум? В идеале я хочу получить данные со страницы 1, 2 и т. Д. С веб-сайта.
Спасибо!
2 ответа
Решение
Это немного странно, но вот мое решение с использованием 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])
Или другой способ, используя 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),]