R中的Web Scraping,带有来自data.frame的循环

时间:2017-07-04 16:51:56

标签: r web-scraping html-parsing rvest

json()

希望循环适用于library(rvest) df <- data.frame(Links = c("Qmobile_Noir-M6", "Qmobile_Noir-A1", "Qmobile_Noir-E8")) for(i in 1:3) { webpage <- read_html(paste0("https://www.whatmobile.com.pk/", df$Links[i])) data <- webpage %>% html_nodes(".specs") %>% .[[1]] %>% html_table(fill = TRUE) } 中的所有3个值,但上面的代码只下载最后一个,下载的数据也必须与变量相同(可能是带变量名称的新列)

2 个答案:

答案 0 :(得分:1)

问题在于您如何构建for循环。但是,首先不使用一个会容易得多,因为R非常支持迭代列表,例如lapplypurrr::map。您可以如何构建数据的一个版本:

library(tidyverse)
library(rvest)

base_url <- "https://www.whatmobile.com.pk/"

models <- data_frame(model = c("Qmobile_Noir-M6", "Qmobile_Noir-A1", "Qmobile_Noir-E8"),
           link = paste0(base_url, model),
           page = map(link, read_html))

model_specs <- models %>% 
    mutate(node = map(page, html_node, '.specs'),
           specs = map(node, html_table, header = TRUE, fill = TRUE),
           specs = map(specs, set_names, c('var1', 'var2', 'val1', 'val2'))) %>% 
    select(model, specs) %>% 
    unnest()

model_specs
#> # A tibble: 119 x 5
#>              model      var1       var2
#>              <chr>     <chr>      <chr>
#>  1 Qmobile_Noir-M6     Build         OS
#>  2 Qmobile_Noir-M6     Build Dimensions
#>  3 Qmobile_Noir-M6     Build     Weight
#>  4 Qmobile_Noir-M6     Build        SIM
#>  5 Qmobile_Noir-M6     Build     Colors
#>  6 Qmobile_Noir-M6 Frequency    2G Band
#>  7 Qmobile_Noir-M6 Frequency    3G Band
#>  8 Qmobile_Noir-M6 Frequency    4G Band
#>  9 Qmobile_Noir-M6 Processor        CPU
#> 10 Qmobile_Noir-M6 Processor    Chipset
#> # ... with 109 more rows, and 2 more variables: val1 <chr>, val2 <chr>

数据仍然非常混乱,但至少它已经存在。

答案 1 :(得分:1)

它捕获所有三个值,但它会在每个循环中写入它们。这就是为什么它只显示一个值,而一个值是最后一页

的原因

在进入循环之前,需要首先初始化变量,我建议使用一个列表,以便为每个连续的循环存储数据。像

这样的东西
final_table <- list()

for(i in 1:3) {
   webpage <- read_html(paste0("https://www.whatmobile.com.pk/",   df$Links[i]))
   data <- webpage %>%
   html_nodes(".specs") %>%
   .[[1]] %>% 
html_table(fill= TRUE)

 final_table[[i]] <- data.frame(data, stringsAsFactors = F)
}

在这种情况下,它会在每个循环中将新数据附加到列表中。