0

我有一个问题需要帮助。我需要创建一段可以加载到 csv 文件中的 R 代码。csv 文件包含一个名为“Link”的列,每个 i(Row) 都有一个链接,代码需要从该链接下载链接的内容并将其放在单独的 csv 文件中。到目前为止,我已经设法找到并修改了下面显示的代码。(感谢 Christopher Gandrud 和合著者)

library(foreign)
library(RCurl)

addresses <- read.csv(">>PATH TO CSV FILE<<")

for (i in addresses) full.text <- getURL(i)

text <- data.frame(full.text)

outpath <-">>PATH TO SPECIFIED FOLDER<<"

x <- 1:nrow(text)

for(i in x) {
  write(as.character(text[i,1]), file = paste(outpath,"/",i,".txt",sep=""))
}

实际上代码运行良好,但问题是我的请求使服务器超载,所以在从 100-150 个链接下载了正确的内容后,文件只是空的。我知道这是问题所在,因为我已经多次测试它,但链接数量正在减少。其实如果我当时只下载100个链接是没有问题的。超过 100 它开始成为一个问题。尽管如此,我需要在这段代码中实现一些东西,让它成为这个特定任务的一个很好的爬虫。

我把我的问题一分为二,因为解决问题一应该暂时解决这个问题。

  1. 我想为每 100 次下载使用 Sys.Sleep 功能。因此,代码为前 100 个链接触发 100 个请求,然后在触发下一个 100 个请求之前暂停 x 秒...

  2. 对我的数据集/csv 文件中的所有行/链接完成此操作后,我需要它来检查每个 csv 文件的两个条件。它们不能为空,也不能包含服务器在某些特殊情况下给我的特定错误消息。如果这两个条件之一为真,则需要将文件名(链接号)保存到我可以从那里使用的向量中。

哇这个问题突然变得很长。我意识到这是一个很大的问题,我问了很多。这是我的硕士论文,不是关于 R 编程的,但我需要从很多我可以访问的网站下载内容。接下来我要分析内容,这就是我的论文的内容。欢迎任何建议/意见。


 library(foreign)  
 library(RCurl)  

 addresses <- read.csv("~/Dropbox/Speciale/Mining/Input/Extract post - Dear Lego n(250).csv")  

 for (i in addresses) {  
+   if(i == 50) {  
+     print("Why wont this work?")  
+     Sys.sleep(10)  
+     print(i)  
+   }  
+   else {  
+     print(i)  
+   }  
+ }  

“然后是加载的链接的完整列表。在 i == 50 处没有“为什么这不起作用”,然后是

警告信息

In if (i == 100) {:
 the condition has length > 1 and only the first element will be used  
full.text <- getURL(i)  
text <- data.frame(full.text)  
outpath <-"~/Dropbox/Speciale/Mining/Output"  
x <- 1:nrow(text)  
for(i in x) {  
write(as.character(text[i,1]), file = paste(outpath,"/",i,".txt",sep=""))}  

能帮助我更多吗?

4

2 回答 2

0

跟进我的评论 - 这是一个基本概念,可以在循环的中途放入 Sys.sleep。

for (i in 1:10) { 
  if(i == 5) {
      print("halfwayhome")
      Sys.sleep(5)
      print(i)
  }
  else { 
      print(i)
  }
}

结果是:

[1] 1
[1] 2
[1] 3
[1] 4
[1] "halfwayhome"
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

所以我对 RCurl 或解析 HTML 页面没有任何经验,所以我很方便地避免了你的那部分任务。但是,我能够成功生成地址列表,下载它们,readLines()然后将它们写回。我Sys.sleep()在每个人之后都打了一个电话,事情似乎很顺利。

links <- c("http://news.lugnet.com/dear-lego/?n=1",
           "http://news.lugnet.com/dear-lego/?n=2",
           "http://news.lugnet.com/dear-lego/?n=3",
           "http://news.lugnet.com/dear-lego/?n=4",
           "http://news.lugnet.com/dear-lego/?n=5",
           "http://news.lugnet.com/dear-lego/?n=6",
           "http://news.lugnet.com/dear-lego/?n=7",
           "http://news.lugnet.com/dear-lego/?n=8",
           "http://news.lugnet.com/dear-lego/?n=9",
           "http://news.lugnet.com/dear-lego/?n=10"
           )

for (j in 1:length(links)){
  dat <- readLines(links[j])
  write.table(dat, paste0("outfile",j,"txt"))
  Sys.sleep(5)
  cat("Finished file", j)
}

如果您需要解析这些 HTML 页面或从中获得更有用的东西,我会问一个新的/不同的问题,我可能不会在这方面提供太多帮助。

希望这会有所帮助,-Chase

于 2012-08-20T21:18:17.910 回答
0

最终解决方案:

> library(RCurl)  
> library(foreach)  
> library(foreign)

> z <- nrow(links)  
> outpath <-"SPECIFIC PATH"

> foreach(i=1:z) %do% {    
+  text <- getURL(links[i,])    
+  write(as.character(text), file = paste(outpath,"/",i,".txt",sep=""))}
于 2012-09-01T22:45:01.333 回答