【问题标题】:How can I get the data of the second web page?如何获取第二个网页的数据?
【发布时间】:2020-10-13 23:03:45
【问题描述】:

我正在尝试使用 rvest 包从 R 中的网络获取数据:https://etfdb.com/stock/AAPL/

但是无论我怎么尝试,我都只能得到第一页的表格。有人可以帮我这样做吗?非常感谢。

见下面的代码。 tb1 和 tb2 是一样的!!那是有线的。

url1 <- "https://etfdb.com/stock/AAPL/#etfs&sort_name=weighting&sort_order=desc&page=1"
url2 <- "https://etfdb.com/stock/AAPL/#etfs&sort_name=weighting&sort_order=desc&page=2"

tbs1 <- rvest::html_nodes(xml2::read_html(url1), "table")
tbs2 <- rvest::html_nodes(xml2::read_html(url2), "table")
tb1 <- rvest::html_table(tbs1[1])[[1]]
tb2 <- rvest::html_table(tbs2[1])[[1]]

【问题讨论】:

    标签: html r web rvest


    【解决方案1】:

    该网站发布 GET 请求以将 JSON 数据更新到表中。经过一番尝试,这是我想出的处理 JSON 数据的代码:(不是一个漂亮的代码,但它确实有效)

    library(rjson)
    library(rvest)
    library(writexl)
    
    lastpage <- 9;
    df <- data.frame();
    for (i in 1:lastpage){
      x <- fromJSON(file = paste("https://etfdb.com/data_set/?tm=40274&cond={%22by_stock%22:25}&no_null_sort=&count_by_id=true&limit=25&sort=weighting&order=desc&limit=25&offset=", 25 * (i-1), sep = ""));
      x <- x[2][[1]];
      pg_df <- data.frame(matrix(unlist(x), nrow=length(x), byrow=T),stringsAsFactors=FALSE);
      df <- rbind(df, pg_df);
    }
    for (i in 1:nrow(df)){
      df$X1[i] <- read_html(df$X1[i]) %>% html_text(trim = TRUE);
      df$X3[i] <- read_html(df$X3[i]) %>% html_text(trim = TRUE);
      df$X5[i] <- read_html(df$X5[i]) %>% html_text(trim = TRUE);
    }
    df <- data.frame(df$X1, df$X3, df$X5, df$X7, df$X9);
    colnames(df) <- c("Ticker", "ETF", "ETFdb.com Category", "Expense Ratio", "Weighting");
    write_xlsx(
      df,
      path = "stock.xlsx",
      col_names = TRUE,
      format_headers = TRUE,
      use_zip64 = FALSE
    )
    
    

    更新: 您可以在此处表的属性data-url 中查看数据源: 我将更新代码,让您更轻松:

    library(rjson)
    library(rvest)
    library(writexl)
    
    stock_ticket <- "AAPL";
    url <- paste("https://etfdb.com/stock/", stock_ticket, sep = "");
    lastpage <- 9;
    df <- data.frame();
    data_url <- read_html(url) %>% html_node(xpath = "//table[@id='etfs']") %>% html_attr("data-url");
    for (i in 1:lastpage){
      x <- fromJSON(file = paste("https://etfdb.com", data_url, "&offset=", 25 * (i-1), sep = ""));
      x <- x[2][[1]];
      pg_df <- data.frame(matrix(unlist(x), nrow=length(x), byrow=T),stringsAsFactors=FALSE);
      df <- rbind(df, pg_df);
    }
    for (i in 1:nrow(df)){
      df$X1[i] <- read_html(df$X1[i]) %>% html_text(trim = TRUE);
      df$X3[i] <- read_html(df$X3[i]) %>% html_text(trim = TRUE);
      df$X5[i] <- read_html(df$X5[i]) %>% html_text(trim = TRUE);
    }
    df <- data.frame(df$X1, df$X3, df$X5, df$X7, df$X9);
    colnames(df) <- c("Ticker", "ETF", "ETFdb.com Category", "Expense Ratio", "Weighting");
    write_xlsx(
      df,
      path = "stock.xlsx",
      col_names = TRUE,
      format_headers = TRUE,
      use_zip64 = FALSE
    )
    

    【讨论】:

    • 谢谢,这有帮助。如果我想更改代码,如何在链接中进行编辑?
    • 非常感谢。我们可以进一步使用它来替换最后一页。 pages &lt;- read_html(url) %&gt;% html_node("strong.h4") %&gt;% html_text() pages &lt;- as.integer(as.numeric(gsub(" .*", "", pages)) / 25 + 1)
    • @LarryChen:你能把我的答案标记为已解决的答案吗?
    • X:我可以再问一个问题吗?当我循环播放更多代码时,您知道如何提高速度吗?尝试几次后似乎时间变得很慢
    • @Larry:我的建议是记录每个代码块之前和之后的系统时间,以测量它所花费的时间。找出哪些代码需要时间并尝试优化它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2021-07-31
    • 2021-03-22
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多