首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带R的with爬虫

带R的with爬虫
EN

Stack Overflow用户
提问于 2012-08-18 19:26:57
回答 2查看 272关注 0票数 0

我有个问题,我想找人帮忙。我需要创建一个可以加载到csv文件中的R代码。csv文件包含一个名为" link“的列,对于每个i(Row),有一个链接,代码需要从这个链接下载链接的内容,并将其放在一个单独的csv文件中。到目前为止,我已经设法找到并修改了下面显示的代码段。(感谢克里斯托弗·甘鲁德和他的合著者)

代码语言:javascript
复制
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个请求,然后暂停x秒,然后再触发下100个请求.
  2. 在对dataset/csv文件中的所有行/链接执行了这些操作之后,我需要它检查每个csv文件是否有两个条件。它们不能是空的,并且它们不能包含服务器在某些特殊情况下给我的特定错误消息。如果这两个条件中的一个是真的,那么它需要将文件名(链接号)保存到我可以从那里使用的向量中。

哇这个问题突然变得很长了。我意识到这是一个很大的问题,我要求很多。这是我的硕士论文,这并不是真正的R编程,但我需要下载的内容,从许多网站,我已经被允许访问。接下来,我要对论文的内容进行分析,这也是我论文的重点所在。欢迎任何建议/意见。

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

警告讯息

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

能帮我更多吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-01 22:45:01

最后解决办法:

代码语言:javascript
复制
> 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=""))}
票数 0
EN

Stack Overflow用户

发布于 2012-08-20 21:18:17

为了跟进我的评论,这里有一个基本概念,可以在循环的一半时间内加入一个Sys.sleep。

代码语言:javascript
复制
for (i in 1:10) { 
  if(i == 5) {
      print("halfwayhome")
      Sys.sleep(5)
      print(i)
  }
  else { 
      print(i)
  }
}

在以下方面的成果:

代码语言:javascript
复制
[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()电话,一切似乎都很顺利。

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

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

https://stackoverflow.com/questions/12021620

复制
相关文章

相似问题

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