在 R 中抓取多个页面

问题描述 投票:0回答:1

我正在尝试废弃该网站并从多个页面中提取内容。我每次都使用 while 循环来增加页码,但它不起作用。它所做的只是从第 0 页复制相同的内容,而不是从其他页面获取内容(在下面的示例中重复 3 次)。

我不确定我错过了什么。

library(tidyverse)
library(rvest)

base_url <- "https://npin.cdc.gov/search?=type%3Aorganization&page="

# counter:
e <- 0

result <- data.frame(org_name = as.integer(), 
                     services = as.character(), 
                     item = as.character(),
                     street = as.character(),
                     city = as.character(), 
                     state = as.character())
while (e <= 3) {
  
  cat(".")
  
  new_page <-
    read_html(
      # change the page number with each iteration of the loop
      sprintf(
        base_url,
        e
      )
    )
  
  services <- new_page %>% html_nodes(".services-fieldset")
  org_name <- new_page %>% html_nodes(".block-field-blocknodeorganizationtitle") %>% html_text2()
  street <- new_page |> html_nodes(".address-line1") |> html_text2()
  city <- new_page |> html_nodes(".locality") |> html_text2()
  state <- new_page |> html_nodes(".administrative-area") |> html_text2()
  zip <- new_page |> html_nodes(".postal-code") |> html_text2()


  new_result <- for (i in 1:length(services)) {
    temp <- services[i] %>% html_nodes(".field__items")
    for (j in 2:length(temp)) {
      label <- temp[j] %>% html_nodes(".field-label") %>% html_text() %>% gsub(":", "", .)
      items <- temp[j] %>% html_nodes(".field__item") %>% html_text()
      result[nrow(result) +1, ] <- c(org_name[i], label, paste0(items, collapse = ","))
    }
  }


  # append each iteration of the data to the main table:
  result <-
    rbind(
      result,
      new_result
    )

  # increase counter
  e <- e + 1
  
}

result |> tibble()
r loops web-scraping while-loop
1个回答
0
投票

这里有很多问题。您已经修复了不存在的

new_york_raw
对象,但在循环内增长
result
,然后将其绑定到
new_result
(这是
for
循环的输出,即
 )仍然没有意义。 NULL

可能最大的问题是您通过

sprintf(base_url, e)
创建 URL,但它并没有按照您的想法进行操作 - 您可能需要
paste0(base_url, e)
或类似的功能。

组合修复可能如下所示。我用

do.call
*apply
替换了循环,这对性能没有太大影响,但却是 R 中将数据绑定在一起的更自然的方式。

library(tidyverse)
library(rvest)

base_url <- "https://npin.cdc.gov/search?=type%3Aorganization&page="

all_e <- 0:3

result <- do.call(rbind.data.frame, lapply(all_e, \(e) {
  new_page <- read_html(paste0(base_url, e))  ## Use correct URL
  
  services <- html_nodes(new_page, ".services-fieldset")
  orgs <- html_nodes(new_page, ".block-field-blocknodeorganizationtitle") |> html_text2()
  streets <- html_nodes(new_page, ".address-line1") |> html_text2()
  cities <- html_nodes(new_page, ".locality") |> html_text2()
  states <- html_nodes(new_page, ".administrative-area") |> html_text2()
  zips <- html_nodes(new_page, ".postal-code") |> html_text2()
  
  do.call(rbind, lapply(seq_along(services), \(i) {
    tmp <- html_nodes(services[i], ".field__items")
    cbind(
      data.frame(
        Org=orgs[i],
        Street=streets[i],
        City=cities[i],
        State=states[i],
        Zip=zips[i]
      ),
      do.call(rbind, lapply(tmp[-1], \(t) {
        label <- html_nodes(t, ".field-label") |> html_text() |> gsub(":", "", x=_)
        items <- html_nodes(t, ".field__item") |> html_text()
        c("Label"=label, "Items"=paste0(items, collapse = ","))
      }))
    )
  }))
}))

result |> tibble()

作为一个小烦恼,我不知道为什么有人会写

x <- y |> f()
而不仅仅是
x <- f(y)

© www.soinside.com 2019 - 2024. All rights reserved.