首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rbind by for循环从网页抓取

rbind by for循环从网页抓取
EN

Stack Overflow用户
提问于 2017-03-02 14:21:42
回答 1查看 122关注 0票数 0

我正在尝试从一个网页上抓取数据并对其进行rbind

1.从网页中抓取数据

代码语言:javascript
复制
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.提取“品牌”

代码语言:javascript
复制
BRANDS <- PanInfos %>% html_nodes('.brand') %>% html_text()

3.删除unicode并提取"SHORTNAMES“

代码语言:javascript
复制
panShortnames <- PanInfos %>% html_nodes('.short-name') %>% html_text()

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

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

4.提取“价格”

代码语言:javascript
复制
PriceInfos <- html_nodes(Pandents, css = '.info')

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

5.使用IF制作数据框

代码语言:javascript
复制
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.制作最终数据帧

代码语言:javascript
复制
FINAL <- rbind(data1, data2, data3, data4, data5, data6, data7, data8, data9,data10)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-02 15:40:46

我想这就是你想说的吧?

为网络抓取加载库

代码语言:javascript
复制
library(xml2)
library(rvest)

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

代码语言:javascript
复制
pass <- paste0("dat", 1:10)

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

代码语言:javascript
复制
for(i in 1:10){

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

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

}

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

代码语言:javascript
复制
datalist <- list(dat1, dat2, dat3, dat4, dat5, dat6, dat7, dat8, dat9, dat10)

设置虚拟数据帧

代码语言:javascript
复制
brand <- paste0("brand", 1:24)

dfbrand <- as.data.frame(brand)

循环通过dat1 - dat10,提取名称信息并附加到dfbrand

长度(品牌) <- nrow(dfbrand)“确保行数相同,以确保cbind正常工作

代码语言:javascript
复制
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有什么不同,所以我排除了这些步骤

代码语言:javascript
复制
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)

}

最后,获取每一行数据并将其附加到新的数据帧中

由于原始虚拟数据帧包含column1中的占位符信息,因此使用i+1中的+1

代码语言:javascript
复制
pass2 <- paste0("scrapeddat", 1:10)

for (i in 1:10) {

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

}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42548184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档