【问题标题】:rbind by for loop with scraping from Webpagerbind by for 循环从网页抓取
【发布时间】:2017-03-02 06:21:42
【问题描述】:

我正在尝试从网页中抓取数据并 rbind 它。

1。从网页抓取数据

for (i in 1:10) {

url <- paste0("https://www.nest.co.uk/pendants?page=",i)

Pandents <- read_html(url)

PanInfos <- html_nodes(Pandents, css = '.fn.name')

PanInfos[1] %>% html_nodes('.brand') %>% html_text()

2。提取“品牌”

BRANDS <- PanInfos %>% html_nodes('.brand') %>% html_text()

3。删除 unicode 并提取“SHORTNAMES”

panShortnames <- PanInfos %>% html_nodes('.short-name') %>% html_text()

SHORT1 <-  gsub(pattern = '\U00A0', replacement = " ", panShortnames)

SHORTNAMES <-  gsub(pattern = '\U2013', replacement = "-", SHORT1)

4。提取“价格”

PriceInfos <- html_nodes(Pandents, css = '.info')

PRICE <- PriceInfos %>% html_nodes('.price') %>% html_text()

5。使用“IF”制作数据框

if ( i == 1) {
  data1<- data.frame(BRANDS, SHORTNAMES, PRICE)
}

else if (i ==2) {
  data2<- data.frame(BRANDS, SHORTNAMES, PRICE)
}
###......

else (i ==10) {
  data10<- data.frame(BRANDS, SHORTNAMES, PRICE)
}  
}

6。制作最终数据框

FINAL <- rbind(data1, data2, data3, data4, data5, data6, data7, data8, data9,data10)

这是我第一次练习 R,现在我终于知道 R 真的很复杂。 我想做的是从网页中提取数据并制作一个 csv 文件。 但它根本不起作用。我真的需要你的建议。我的怎么了? 还有没有更简单的方法

【问题讨论】:

  • “但它根本不起作用。”它怎么不起作用?请提供错误信息。
  • data.frame(BRANDS, SHORTNAMES, PRICE) 中的错误:参数暗示不同的行数:24, 0
  • 而在此之前,没有创建data1、data2....data10数据框。
  • 错误和确凿的信息(比如你的最后两个 cmets)应该直接包含在问题中。如果没有跳过评论,通常会略过评论,因此最好/仅在问题本身中保留重要的细节。
  • 失败时i 的值是多少?当命令失败时,组件(例如,BRANDSHORTNAMESPRICE)是什么样的?他们应该看起来如何(如果错误)?

标签: r for-loop rbind


【解决方案1】:

我认为这就是你想要达到的目的?

为网页抓取加载库

library(xml2)
library(rvest)

首先,创建一个虚拟变量列表来存储数据

pass <- paste0("dat", 1:10)

获取每个页面并将信息存储到 dat1 - dat10

for(i in 1:10){

  url <- paste0("https://www.nest.co.uk/pendants?page=", i)

  assign(pass[i], read_html(url))

}

为了将来循环的方便,请列出 dat1 - dat10

datalist <- list(dat1, dat2, dat3, dat4, dat5, dat6, dat7, dat8, dat9, dat10)

设置虚拟数据帧

brand <- paste0("brand", 1:24)

dfbrand <- as.data.frame(brand)

遍历 dat1 - dat10,提取名称信息并附加到 dfbrand

"length(BRANDS)

for (i in datalist){

  PanInfos <- html_nodes(i, css = '.fn.name')

  BRANDS <- 
    PanInfos %>% 
    html_nodes('.brand') %>% 
    html_text()

  length(BRANDS) <- nrow(dfbrand)

  BRANDS <- as.data.frame(BRANDS)

  dfbrand <- cbind(dfbrand, BRANDS)

}

名称和价格也是如此,我没有发现提取名称和使用 gsubs 的任何差异,因此我排除了这些步骤

name <- paste0("name", 1:24)

dfname <- as.data.frame(name)

for (i in datalist){

  PanInfos <- html_nodes(i, css = '.fn.name')

  NAMES <- 
    PanInfos %>% 
    html_nodes('.short-name') %>% 
    html_text()

  length(NAMES) <- nrow(dfname)

  NAMES <- as.data.frame(NAMES)

  dfname <- cbind(dfname, NAMES)

}

price <- paste0("price", 1:24)

dfprice <- as.data.frame(price)

for (i in datalist){

  PanInfos <- html_nodes(i, css = '.info')

  PRICE <- 
    PanInfos %>% 
    html_nodes('.price') %>% 
    html_text()

  length(PRICE) <- nrow(dfprice)

  PRICE <- as.data.frame(PRICE)

  dfprice <- cbind(dfprice, PRICE)

}

最后,取出每一行数据并将它们附加到一个新的数据帧中

使用 [i+1] 中的 +1 是因为我们的原始虚拟数据帧在 column1 中包含占位符信息

pass2 <- paste0("scrapeddat", 1:10)

for (i in 1:10) {

  assign(pass2[i], data.frame(dfbrand[i+1], dfname[i+1], dfprice[i+1]))

}

如果这有帮助或者您还有其他问题,请告诉我!

【讨论】:

  • 说真的,你是天才
  • 非常感谢您的好意
  • 但是有没有更简单的方法来制作 datalist
  • for (i in datalist){ PanInfos % html_nodes('.price') %>% html_text()
  • ^ 另一个问题!如果我提取('.price')节点还是('.now')节点,我该怎么办?由于该页面中的 SALE,正常价格提取良好,但销售价格没有提取。
猜你喜欢
  • 2021-09-18
  • 2022-01-01
  • 2021-04-13
  • 2021-01-07
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
相关资源
最近更新 更多