【问题标题】:Scrape Anchored Website with Selenium Package in R在 R 中使用 Selenium 包抓取锚定网站
【发布时间】:2015-02-12 18:15:23
【问题描述】:

我对 R 还很陌生,无法从福布斯网站提取数据。

我目前的功能是:

网址 =

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)

但是,福布斯网站在链接中以“#”符号锚定。为了解析我想要的数据,我下载了 rselenium 包,但是我对 reselenium 不太熟悉。

是否有人对 reselenium 有任何建议/专业知识,以及如何使用 reselenium 从福布斯提取数据?理想情况下,我想从网站的第 1 页、第 2 页等中提取数据。

谢谢!

【问题讨论】:

    标签: r selenium anchor-scroll


    【解决方案1】:

    或者使用用于填充网页的 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),]
    

    【讨论】:

    • 科里,你真是个天才!如果/当您有时间,您能否解释一下:1)您如何找到网页的 API 信息以及 2)httr 和 RJONSIO 是做什么的? httr 和 RJONSIO 上的任何信息链接都可以使用。我非常好奇,想了解您是如何获得 API 信息的。非常感谢!
    • 嘿,谢谢。要在 chrome 中查找 api...,右键单击然后选择“检查元素”,单击“网络”选项卡,然后浏览到 url。单击“/ajax/loadlist”条目,然后您可以从那里将您看到的引荐来源网址和查询字符串参数插入到 R 代码中的适当位置。至于 httr 和 RJSONIO 包......谷歌它!
    • 还有一件事,你是如何将“list”函数指定为“organization”、“global2000”和“2014”的?谢谢!
    • 这些是用于 api 调用的查询字符串参数。从 Chrome 浏览器中的“检查元素”-> 网络选项卡中获取该信息。
    • 大家好。很长一段时间后,我正在重新讨论这个问题。当我运行上面由 Cory 提供的代码时,我不断收到以下错误:“fromJSON 中的错误(内容,处理程序,default.size,深度,allowComments,:无效 JSON 输入”关于问题可能是什么的任何想法?我有尝试使用其他包,但没有运气。任何帮助都会很棒。谢谢!
    【解决方案2】:

    这有点 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])
    

    【讨论】:

    • 嘿科里。该功能在您只查看第 1 页的情况下有效(请参阅链接中的“#page:1”)。但是,一旦您想转到第 2 页,即“#page:2”,该功能将不起作用,因为由于锚点,它会继续从第 1 页拉取数据。有什么你能想到的工作吗?
    猜你喜欢
    • 2019-10-31
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2019-09-29
    • 1970-01-01
    相关资源
    最近更新 更多