Web Scraping多个页面并通过for循环将结果合并到 Dataframe 中

ruyhziif  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(147)

我的代码如下所示:

### Webpages 

# The first webpage 

url <- "https://www.finanzen.net/nachrichten/rubrik/ad-hoc-meldungen" 

### Function to extract the links of the data for the MAIN PAGE
scraplinks <- function(url){
  # Create an html document from the url
  webpage <- xml2::read_html(url)
  # Extract the URLs
  url_ <- webpage %>%
    rvest::html_nodes("a") %>%
    rvest::html_attr("href")
  # Extract the link text
  link_ <- webpage %>%
    rvest::html_nodes("a") %>%
    rvest::html_text()
  return(tibble(link = link_, url = url_))
}

urls <- scraplinks(url)
head(urls) # So this works

问题是数据不止一页。见下一个代码:

url <- "https://www.finanzen.net/nachrichten/rubrik/ad-hoc-meldungen@intpagenr_3"

例如,只需添加"@intpagenr_3 "就可以转到第三页。
我想提取10页的网页上的功能上面。
我的尝试是:

more_than_one_page <- function(url,number_of_pages) {
  output1 <- scraplinks(url)
  for (i  in 1:number_of_pages){
    output2 <- data.frame()
    new_input <- scraplinks(paste0(url ,"@intpagenr_",i))
    output2[nrow(new_input),] <- new_input # Adding one line is nrow(new_input) + 1
  }
  output <- rbind(output1, output2)
  
}
data1 <- more_than_one_page(url, 15)

但是我不知道如何添加新行,因为我不知道初始化的确切行数。
有人能猜一猜吗?如果有不明白的地方,请提问.谢谢.
我尝试了一个for循环,所以索引是网页的页码。但是我不知道如何初始化 Dataframe 的确切行。

flvtvl50

flvtvl501#

加上碱基R,你可以:

  • 创建URL列表:
urls <- paste0('https://www.finanzen.net/nachrichten/rubrik/',
                   'ad-hoc-meldungen@intpagenr_',
                   1:10
                   )
  • Map将函数scraplinksReduce的结果的urls这些奇异项放到它们的rbind行绑定块中:
all_data <-
        urls[1:3] |> ## * see footnote
        Map(f = scraplinks) |>
        Reduce(f = rbind)
  • 我只为1-3页做了这个;注意遵守服务的政策重新采集。

map(和reduce)策略在处理R结构时非常有用,特别是在避免循环时。有一个专用的包**{purrr}**支持这个策略。

相关问题