跨多个页面的网页抓取 R

时间:2021-07-23 00:09:53

标签: r web-scraping

我一直在研究一些 R 代码。目的是收集一个 50 页的网站部分中的平均字长和其他有关单词的统计信息。收集统计数据是没有问题的,这是一个简单的部分。然而,让我的代码收集超过 50 页的统计数据是困难的部分,它似乎只从第一页输出信息。请参阅下面的代码并忽略糟糕的缩进。

install.packages(c('tidytext', 'tidyverse'))

   library(tidyverse)
   library(tidytext)
   library(rvest)
   library(stringr)

   websitePage <- read_html('http://books.toscrape.com/catalogue/page-1.html')
   textSort <- websitePage %>%
   html_nodes('.product_pod a') %>%
   html_text()


   for (page_result in seq(from = 1, to = 50, by = 1)) {
      link = paste0('http://books.toscrape.com/catalogue/page-',page_result,'.html')

      page = read_html(link)

     # Creates a tibble
      textSort.tbl <- tibble(text = textSort)

      textSort.tidy <- textSort.tbl %>%
      funnest_tokens(word, text)

  }

   # Finds the average word length
    textSort.tidy %>%
      map(nchar) %>%
      map(mean)

   # Finds the most common words
    textSort.tidy %>%
    count(word, sort = TRUE)

    # Removes the stop words and then finds most common words
     textSort.tidy %>%
     anti_join(stop_words) %>%
     count(word, sort = TRUE)

    # Counts the number of times the word "Girl" is in the text
      textSort.tidy %>%
      count(word) %>%
      filter(word == "Girl")

2 个答案:

答案 0 :(得分:1)

您可以使用 lapply/map 从多个链接中提取 tetx。

library(rvest)

link <- paste0('http://books.toscrape.com/catalogue/page-',1:50,'.html')

result <- lapply(link, function(x) x %>% 
                          read_html %>% 
                          html_nodes('.product_pod a') %>%
                          html_text)

如果您想将其他功能应用于文本,您可以继续使用 lapply

答案 1 :(得分:-1)

我有两点要说明。首先,您在代码中使用了 funnest_tokens 函数,但该函数不存在。你是说 unnest_tokens 吗?

其次,您可以尝试包 purrr 中的 map* 函数,而不是循环。首先,创建一个返回 tibble 的函数。它应该包含您需要的统计信息 - 例如最常用的词。并创建一个网页列表,您要从中抓取数据。然后使用地图功能。可能这应该有效。