【问题标题】:Extract table from web page by page逐页从网页中提取表格
【发布时间】:2020-07-02 15:07:32
【问题描述】:

我已经为网页中的网页抓取表格编写了代码。此代码从第一页(在 url /page=0 中)提取表格:

url <- "https://ss0.corp.com/auth/page=0"
login <- "john.johnson" (fake)
password <- "67HJL54GR" (fake)

res <- GET(url, authenticate(login, password))
content <- content(res, "text")

table <- fromJSON(content) %>%
  as.data.farme()

我想编写一个代码来逐页从表中提取行,然后绑定它们。我这样做,因为表太大,我不能一次提取所有东西(它会破坏系统)。我不知道可以有多少页,它会发生变化,因此一旦收集到最后一页,它就必须停止。我怎么能这样做?

【问题讨论】:

  • 您能否展示一下您为逐页提取并将数据放在一起所做的工作。
  • 在 SO 上提出问题时,有助于将问题减少到最低限度。看起来您已经在此处(经过清理)完成了该操作,这很好,但它需要是真正有效的代码。这包括以下内容:(1)告诉我们您可能正在使用的任何/所有非基础包,可能是dplyrhttr; (2) 您的代码中没有拼写错误,即as.data.farme,这可能会在您的过程中引起怀疑。不过,为此,您是否尝试过简单的for 循环或lapply(seq_len(num_pages), function(pg) ...)

标签: r function web web-scraping httr


【解决方案1】:

我无法测试以保证这会奏效,因为问题不可重现,但您主要需要三个步骤:

  1. 设置网址和凭据

    url <- "http://someurl/auth/page="
    login <- ""
    password <- ""
    
  2. 遍历所有(我假设有N)页面并将结果存储在列表中。请注意,我们为每个页面正确修改了 url。

    tables <- lapply(1:N, function(page) {
      # Create the proper url and make the request
      this_url <- paste0(url, page)
      res <- GET(this_url, authenticate(login, password))
    
      # Extract the content just like you would in a single page
      content <- content(res, "text")
      table <- fromJSON(content) %>%
        as.data.frame()
      return(table)}
    )
    
  3. 使用rbind将列表中的所有表聚合到一个完整的表中

    complete <- do.call(rbind, tables)
    

我希望这至少有助于指明方向。

【讨论】:

  • 它说错误在 lapply(1:N, function(page) { : object 'N' not found
  • 您必须将要迭代的页数分配给N
  • 但我不知道它可能是什么,它会改变,所以一旦收集到最后一页就必须停止
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多