使用R刮取数据时如何添加循环?

时间:2017-11-20 03:44:06

标签: r loops web-scraping

我正在尝试根据Trulia.com的数据通过邮政编码创建犯罪数据数据库。我有下面的代码,但到目前为止它只生成1行数据。在下面的代码中,Zipcodes只是美国邮政编码的列表。任何人都可以告诉我需要添加什么才能让我的整个列表“i”运行?

以下是其中一个Trulia页面的链接供参考:https://www.trulia.com/real_estate/20004-Washington/crime/

更新: 以下是下载的邮政编码:https://www.dropbox.com/s/uxukqpu0v88d7tf/Zip%20Code%20Database%20wo%20Boston.xlsx?dl=0

在根据邮政编码意识到犯罪统计数据出现在不同的订单后,我这次也改变了一些代码。是否有可能让循环产生每个邮政编码4行?这当前有效,但只生成数据集中的最后一个邮政编码。我无法弄清楚如何确保每个邮政编码的数据都记录在不同的行上,因此它不会覆盖,只留下最后一个邮政编码的一行。

请帮助!!

 library(rvest)

 data=data.frame(Zipcodes)
 for(i in data$Zip.Code)
 {  
 site <- paste("https://www.trulia.com/real_estate/",i,"-Boston/crime/", sep="")
 site <- html(site)

 crime<- data.frame(zip =i,
        type =site %>% html_nodes(".brs") %>% html_text() ,
        stringsAsFactors=FALSE)
}
View(crime)

如果该代码不起作用,请尝试:

data=data.frame(Zillow_Data_for_R_Test)
for(i in data$Zip.Code)
site <- paste("https://www.trulia.com/real_estate/",i,"-Boston/crime/", sep="")
site <- read_html(site)
crime<- data.frame(zip =i,
         theft =site %>% html_nodes(".crime-text-0") %>% html_text() ,
         assault =site %>% html_nodes(".crime-text-1") %>% html_text() ,
         arrest =site %>% html_nodes(".crime-text-2") %>% html_text() ,
         vandalism =site %>% html_nodes(".crime-text-3") %>% html_text() ,
         robbery =site %>% html_nodes(".crime-text-4") %>% html_text() ,
         type =site %>% html_nodes(".clearfix") %>% html_text() ,
         stringsAsFactors=FALSE)
View(crime)

1 个答案:

答案 0 :(得分:1)

@ r2evans的评论已经提供了答案。由于@ShanCham询问如何实际实现这一点,我想引导下面的代码,这些代码比评论更详细,因此不能作为附加评论发布。

library(rvest)

#only two exemplary zipcodes, could be more, of course
zipcodes <- c("02110", "02125")

crime <- lapply(zipcodes, function(z) {

  site <- read_html(paste0("https://www.trulia.com/real_estate/",z,"-Boston/crime/"))

           #for illustrative purposes:
           #introduced as.numeric to numeric columns
           #exluded some of your other columns and shortenend the current text in type
           data.frame(zip = z,
                      theft = site %>% html_nodes(".crime-text-0") %>% html_text() %>% as.numeric(),
                      assault = site %>% html_nodes(".crime-text-1") %>% html_text() %>% as.numeric() ,
                      type = site %>% html_nodes(".clearfix") %>% html_text() %>% paste(collapse = " ") %>% substr(1, 50) ,
                      stringsAsFactors=FALSE)
})

class(crime)
#list

#Output are lists that can be bound together to one data.frame
crime <- do.call(rbind, crime)

#crime is a data.frame, hence, classes/types are kept
class(crime$type)
# [1] "character"
class(crime$assault)
# [1] "numeric"