-1

我有一个包含大约 46000 个链接的目录(我称为 links3),我想使用以下代码抓取每个链接:

library(reshape)
library(plyr)
library(rvest)
library(xml2)

base <- matrix(, nrow = (nrow(links3)), ncol = 19)
basedes <- matrix(, nrow = (nrow(links3)), ncol = 19)
coor <- matrix(, nrow = (nrow(links3)), ncol = 3)


for (i in 1:(nrow(links3))){
x <- links3[i,1]
doc <- read_html(paste0(x))
val <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[1]/h3/b"))
if(val=="<b>Tipo Inmueble</b>"){
basedes[i,1] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[1]/h3/b"))
basedes[i,2] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[3]/h3/b"))
basedes[i,3] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[5]/h3/b"))
basedes[i,4] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[7]/h3/b"))
basedes[i,5] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[9]/h3/b"))
basedes[i,6] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[11]/h3/b"))
basedes[i,7] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[13]/h3/b"))
basedes[i,8] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[15]/h3/b"))
basedes[i,9] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[17]/h3/b"))
basedes[i,10] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[19]/h3/b"))
basedes[i,11] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[21]/h3/b"))
basedes[i,12] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[23]/h3/b"))
basedes[i,13] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[1]/h3/b"))
basedes[i,14] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[3]/h3/b"))
basedes[i,15] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[5]/h3/b"))
basedes[i,16] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[7]/h3/b"))
basedes[i,17] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[9]/h3/b"))
basedes[i,18] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[11]/h3/b"))

base[i,1] <- toString(xml_find_all(doc, xpath="*//*[@id='info_nombre']/ul[1]/li[2]/h4"))
base[i,2] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[4]/h4"))
base[i,3] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[6]/h4"))
base[i,4] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[8]/h4"))
base[i,5] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[10]/h4"))
base[i,6] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[12]/h4"))
base[i,7] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[14]/h4"))
base[i,8] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[16]/h4"))
base[i,9] <- toString(xml_find_all(doc, xpath="//***[@id='info_nombre']/ul[1]/li[18]/h4"))
base[i,10] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[20]/h4"))
base[i,11] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[22]/h4"))
base[i,12] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[1]/li[24]/h4"))
base[i,13] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[2]/h4"))
base[i,14] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[4]/h4"))
base[i,15] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[6]/h4"))
base[i,16] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[8]/h4"))
base[i,17] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[10]/h4"))
base[i,18] <- toString(xml_find_all(doc, xpath="//*[@id='info_nombre']/ul[2]/li[12]/h4"))


lon <- toString(xml_find_all(doc, xpath="*//input[@type='hidden']"))
lon <- gsub(".*longitud", "", lon)
lon <- gsub("/>.*", "", lon)
lon <- gsub("value=", "", lon)
lon <- gsub("\"", "", lon)
lon <- gsub(" ", "", lon)
coor[i,1] <- lon

lat <- toString(xml_find_all(doc, xpath="*//input[@type='hidden']"))
lat <- gsub(".*latitud", "", lat)
lat <- gsub("/>.*", "", lat)
lat <- gsub("value=", "", lat)
lat <- gsub("\"", "", lat)
lat <- gsub(" ", "", lat)
coor[i,2] <- lat

cod<-  toString(xml_find_all(doc, xpath="*//div[@class='code']"))
cod <- gsub(".*web: ", "", cod)
cod <- gsub("<.*", "", cod)
coor[i,3] <- cod
remove(val)
remove(lat)
remove(lon)
}else{}
}

但经过大约 5000 次迭代后,我收到以下消息:

r for windows gui frontend stopped working 

我必须关闭 R 会话并重新开始。

我查看了我的系统配置,它显示以下内容:

Processes: 93;
CPU Usage 6%;
Physical Memory: 51%;
RAM:8.0 GB;
Windows 7;

为什么我会收到这条消息?我该如何解决?

4

1 回答 1

0

从您在此处给出的数据和代码中,问题所在并不是 100% 清楚。但是,当您创建大量变量时。每个变量都存在于 RAM 中的活动内存中。

尽管配置为 51%,但取决于您的系统、是否有任何 Java 包在运行以及您对垃圾收集的使用,您可能会耗尽 R 及其子进程可用的可用 RAM。

如果是我遇到了这个问题,并且我确定源没有让我崩溃(通过转到它直接崩溃的实际迭代并一次检查错误或错误数据)或者脚本中有错误,我会查看我的数据需求是什么,创建的哪些变量需要为下一步保留,哪些不需要。

然后我会积极地使用rm()gc()删除和垃圾收集来清除垃圾,看看下次它是否会更进一步。您可能需要在循环内部执行几个步骤以删除无法自行清除的副产品。

如果您无法清除任何获取的数据,那么我仍然会使用rm()gc()删除一些需要的数据,以查看它是否继续通过整个循环。如果是这样,那么您知道这实际上是一个内存管理问题。

现在它变成了编写一个脚本,该脚本以束的形式收集数据,将其转换为最紧凑的格式并将其存储在持久内存中,直到所有处理完成,然后将其加载到 RAM 中供您分析。您可以使用 csv 或 json 文件。

R 是一种非常强大的语言,在许多情况下都能很好地工作,但要求您在数据变大时很好地管理临时数据和变量。一个简单的表可能会保留多达 4 个实例,具体取决于它的操作和管理方式。因此,如果您有一个功能正常的脚本,那么您将需要研究如何管理您从该脚本中获得的内容并将其带回分析过程。

对我来说,我倾向于处理大文件,就像我会吃一整头牛,一次咬一口。根据需要在静态内存中插入值并随时更新静态文件。

我希望这有帮助。

于 2016-07-10T22:16:36.463 回答